@actant/api 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -24,7 +24,7 @@ import {
24
24
  InstanceRegistry,
25
25
  createDefaultStepRegistry,
26
26
  registerCommunicator,
27
- registerBackend,
27
+ getBackendManager,
28
28
  modelProviderRegistry,
29
29
  registerBuiltinProviders
30
30
  } from "@actant/core";
@@ -84,6 +84,7 @@ var AppContext = class {
84
84
  promptManager: this.promptManager,
85
85
  mcpConfigManager: this.mcpConfigManager,
86
86
  workflowManager: this.workflowManager,
87
+ backendManager: getBackendManager(),
87
88
  templateRegistry: this.templateRegistry
88
89
  }, { skipDefaultSource: resolvedLauncherMode === "mock" });
89
90
  this.agentInitializer = new AgentInitializer(
@@ -178,27 +179,42 @@ var AppContext = class {
178
179
  }
179
180
  }
180
181
  registerPiBackend() {
181
- registerBackend({
182
- type: "pi",
183
- supportedModes: ["acp"],
184
- acpResolver: () => ({
185
- command: process.execPath,
186
- args: [ACP_BRIDGE_PATH]
187
- }),
188
- acpOwnsProcess: true
189
- });
182
+ const mgr = getBackendManager();
183
+ const existing = mgr.get("pi");
184
+ if (existing) {
185
+ mgr.register({ ...existing, acpOwnsProcess: true, origin: { type: "builtin" } });
186
+ } else {
187
+ mgr.register({
188
+ name: "pi",
189
+ version: "1.0.0",
190
+ description: "Pi \u2014 lightweight in-process AI agent powered by local/cloud LLMs",
191
+ tags: ["agent", "in-process", "llm"],
192
+ origin: { type: "builtin" },
193
+ supportedModes: ["acp"],
194
+ acpOwnsProcess: true,
195
+ install: [
196
+ { type: "manual", label: "Included with Actant", instructions: "Pi is bundled with Actant \u2014 no separate installation required." }
197
+ ]
198
+ });
199
+ }
200
+ mgr.registerAcpResolver("pi", () => ({
201
+ command: process.execPath,
202
+ args: [ACP_BRIDGE_PATH]
203
+ }));
190
204
  this.agentInitializer.workspaceBuilder.registerBuilder(new PiBuilder());
191
205
  registerCommunicator("pi", (backendConfig) => new PiCommunicator(configFromBackend(backendConfig)));
192
206
  logger.info("Pi backend registered (in-process, acp mode only)");
193
207
  }
194
208
  async loadDomainComponents() {
209
+ const backendManager = getBackendManager();
195
210
  const dirs = [
196
211
  { manager: this.skillManager, sub: "skills" },
197
212
  { manager: this.promptManager, sub: "prompts" },
198
213
  { manager: this.mcpConfigManager, sub: "mcp" },
199
214
  { manager: this.workflowManager, sub: "workflows" },
200
215
  { manager: this.pluginManager, sub: "plugins" },
201
- { manager: this.templateRegistry, sub: "templates" }
216
+ { manager: this.templateRegistry, sub: "templates" },
217
+ { manager: backendManager, sub: "backends" }
202
218
  ];
203
219
  for (const { manager, sub } of dirs) {
204
220
  const dirPath = join(this.configsDir, sub);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/daemon/daemon.ts","../src/services/app-context.ts","../src/daemon/socket-server.ts","../src/handlers/handler-registry.ts","../src/handlers/template-handlers.ts","../src/handlers/agent-handlers.ts","../src/handlers/session-handlers.ts","../src/handlers/domain-handlers.ts","../src/handlers/source-handlers.ts","../src/handlers/preset-handlers.ts","../src/handlers/daemon-handlers.ts","../src/handlers/proxy-handlers.ts","../src/handlers/schedule-handlers.ts","../src/daemon/pid-file.ts"],"sourcesContent":["import { unlink } from \"node:fs/promises\";\nimport { createLogger, ipcRequiresFileCleanup } from \"@actant/shared\";\nimport { AppContext, type AppConfig } from \"../services/app-context\";\nimport { SocketServer } from \"./socket-server\";\nimport {\n HandlerRegistry,\n registerTemplateHandlers,\n registerAgentHandlers,\n registerSessionHandlers,\n registerDomainHandlers,\n registerSourceHandlers,\n registerPresetHandlers,\n registerDaemonHandlers,\n registerProxyHandlers,\n registerScheduleHandlers,\n} from \"../handlers/index\";\nimport { writePidFile, removePidFile, readPidFile, isProcessRunning } from \"./pid-file\";\n\nconst logger = createLogger(\"daemon\");\n\nexport class Daemon {\n private ctx: AppContext;\n private server: SocketServer;\n private handlers: HandlerRegistry;\n private running = false;\n\n constructor(config?: AppConfig) {\n this.ctx = new AppContext(config);\n this.handlers = new HandlerRegistry();\n this.server = new SocketServer(this.handlers, this.ctx);\n\n registerTemplateHandlers(this.handlers);\n registerAgentHandlers(this.handlers);\n registerSessionHandlers(this.handlers);\n registerDomainHandlers(this.handlers);\n registerSourceHandlers(this.handlers);\n registerPresetHandlers(this.handlers);\n registerDaemonHandlers(this.handlers, () => this.stop());\n registerProxyHandlers(this.handlers);\n registerScheduleHandlers(this.handlers);\n }\n\n get socketPath(): string {\n return this.ctx.socketPath;\n }\n\n get appContext(): AppContext {\n return this.ctx;\n }\n\n async start(): Promise<void> {\n if (this.running) return;\n\n const existingPid = await readPidFile(this.ctx.pidFilePath);\n if (existingPid !== null && isProcessRunning(existingPid)) {\n throw new Error(`Daemon already running (PID ${existingPid})`);\n }\n\n await this.ctx.init();\n\n if (ipcRequiresFileCleanup()) {\n try {\n await unlink(this.ctx.socketPath);\n } catch {\n // socket file may not exist\n }\n }\n\n await this.server.listen(this.ctx.socketPath);\n await writePidFile(this.ctx.pidFilePath);\n this.running = true;\n\n logger.info({ pid: process.pid, socket: this.ctx.socketPath, homeDir: this.ctx.homeDir }, \"Daemon started\");\n }\n\n async stop(): Promise<void> {\n if (!this.running) return;\n this.running = false;\n\n logger.info(\"Daemon shutting down...\");\n\n const agents = this.ctx.agentManager.listAgents();\n for (const agent of agents) {\n if (agent.status === \"running\" || agent.status === \"starting\") {\n try {\n await this.ctx.agentManager.stopAgent(agent.name);\n } catch (err) {\n logger.warn({ name: agent.name, error: err }, \"Failed to stop agent during shutdown\");\n }\n }\n }\n\n this.ctx.templateWatcher.stop();\n await this.server.close();\n await removePidFile(this.ctx.pidFilePath);\n\n if (ipcRequiresFileCleanup()) {\n try {\n await unlink(this.ctx.socketPath);\n } catch {\n // socket file may have been cleaned up already\n }\n }\n\n logger.info(\"Daemon stopped\");\n }\n\n get isRunning(): boolean {\n return this.running;\n }\n}\n","import { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { mkdir } from \"node:fs/promises\";\nimport { readFileSync } from \"node:fs\";\nimport {\n TemplateRegistry,\n TemplateLoader,\n TemplateFileWatcher,\n AgentInitializer,\n AgentManager,\n SessionRegistry,\n SkillManager,\n PromptManager,\n McpConfigManager,\n WorkflowManager,\n PluginManager,\n SourceManager,\n createLauncher,\n EmployeeScheduler,\n InstanceRegistry,\n createDefaultStepRegistry,\n registerCommunicator,\n registerBackend,\n modelProviderRegistry,\n registerBuiltinProviders,\n type LauncherMode,\n} from \"@actant/core\";\nimport type { ModelApiProtocol } from \"@actant/shared\";\nimport { AcpConnectionManager } from \"@actant/acp\";\nimport { PiBuilder, PiCommunicator, configFromBackend, ACP_BRIDGE_PATH } from \"@actant/pi\";\nimport { createLogger, getIpcPath } from \"@actant/shared\";\n\nconst logger = createLogger(\"app-context\");\n\nconst DEFAULT_HOME = join(homedir(), \".actant\");\n\n/** Shape of ~/.actant/config.json as written by `actant setup`. */\ninterface UserConfig {\n provider?: {\n type: string;\n protocol?: string;\n baseUrl?: string;\n apiKey?: string;\n };\n providers?: Array<{\n type: string;\n protocol?: string;\n baseUrl?: string;\n apiKey?: string;\n }>;\n [key: string]: unknown;\n}\n\nexport interface AppConfig {\n homeDir?: string;\n /** Override configs directory. Default: `{homeDir}/configs/` or `./configs/` fallback. */\n configsDir?: string;\n /** \"mock\" for testing, \"real\" for production. Default: auto-detect from ACTANT_LAUNCHER_MODE env. */\n launcherMode?: LauncherMode;\n}\n\nexport class AppContext {\n readonly homeDir: string;\n readonly configsDir: string;\n readonly sourcesDir: string;\n readonly templatesDir: string;\n readonly instancesDir: string;\n readonly registryPath: string;\n readonly builtinInstancesDir: string;\n readonly socketPath: string;\n readonly pidFilePath: string;\n\n readonly instanceRegistry: InstanceRegistry;\n readonly templateLoader: TemplateLoader;\n readonly templateRegistry: TemplateRegistry;\n readonly skillManager: SkillManager;\n readonly promptManager: PromptManager;\n readonly mcpConfigManager: McpConfigManager;\n readonly workflowManager: WorkflowManager;\n readonly pluginManager: PluginManager;\n readonly agentInitializer: AgentInitializer;\n readonly acpConnectionManager: AcpConnectionManager;\n readonly agentManager: AgentManager;\n readonly sessionRegistry: SessionRegistry;\n readonly sourceManager: SourceManager;\n readonly templateWatcher: TemplateFileWatcher;\n readonly schedulers: Map<string, EmployeeScheduler>;\n\n private initialized = false;\n private startTime = Date.now();\n\n constructor(config?: AppConfig) {\n this.homeDir = config?.homeDir ?? process.env.ACTANT_HOME ?? DEFAULT_HOME;\n this.configsDir = config?.configsDir ?? join(this.homeDir, \"configs\");\n this.sourcesDir = join(this.homeDir, \"sources\");\n this.templatesDir = join(this.configsDir, \"templates\");\n this.instancesDir = join(this.homeDir, \"instances\");\n this.registryPath = join(this.homeDir, \"instances\", \"registry.json\");\n this.builtinInstancesDir = join(this.homeDir, \"instances\");\n this.socketPath = process.env.ACTANT_SOCKET ?? getIpcPath(this.homeDir);\n this.pidFilePath = join(this.homeDir, \"daemon.pid\");\n\n this.instanceRegistry = new InstanceRegistry(this.registryPath, this.builtinInstancesDir);\n this.templateLoader = new TemplateLoader();\n this.templateRegistry = new TemplateRegistry({ allowOverwrite: true });\n\n this.skillManager = new SkillManager();\n this.promptManager = new PromptManager();\n this.mcpConfigManager = new McpConfigManager();\n this.workflowManager = new WorkflowManager();\n this.pluginManager = new PluginManager();\n\n const resolvedLauncherMode = config?.launcherMode\n ?? (process.env[\"ACTANT_LAUNCHER_MODE\"] as LauncherMode | undefined);\n this.sourceManager = new SourceManager(this.homeDir, {\n skillManager: this.skillManager,\n promptManager: this.promptManager,\n mcpConfigManager: this.mcpConfigManager,\n workflowManager: this.workflowManager,\n templateRegistry: this.templateRegistry,\n }, { skipDefaultSource: resolvedLauncherMode === \"mock\" });\n\n this.agentInitializer = new AgentInitializer(\n this.templateRegistry,\n this.instancesDir,\n {\n domainManagers: {\n skills: this.skillManager,\n prompts: this.promptManager,\n mcp: this.mcpConfigManager,\n workflows: this.workflowManager,\n },\n stepRegistry: createDefaultStepRegistry(),\n },\n );\n this.acpConnectionManager = new AcpConnectionManager();\n this.sessionRegistry = new SessionRegistry();\n const launcherMode = resolvedLauncherMode;\n this.agentManager = new AgentManager(\n this.agentInitializer,\n createLauncher({ mode: launcherMode }),\n this.instancesDir,\n {\n acpManager: launcherMode !== \"mock\" ? this.acpConnectionManager : undefined,\n instanceRegistry: this.instanceRegistry,\n watcherPollIntervalMs: launcherMode === \"mock\" ? 2_147_483_647 : undefined,\n },\n );\n this.templateWatcher = new TemplateFileWatcher(this.templatesDir, this.templateRegistry);\n this.schedulers = new Map();\n }\n\n async init(): Promise<void> {\n if (this.initialized) return;\n\n await mkdir(this.homeDir, { recursive: true });\n await mkdir(this.instancesDir, { recursive: true });\n\n this.loadProviderRegistry();\n\n await this.instanceRegistry.load();\n const { orphaned, adopted } = await this.instanceRegistry.reconcile();\n if (orphaned.length > 0 || adopted.length > 0) {\n logger.info({ orphaned, adopted }, \"Instance registry reconciled\");\n }\n\n await this.loadDomainComponents();\n this.registerPiBackend();\n await this.sourceManager.initialize();\n\n await this.agentManager.initialize();\n this.templateWatcher.start();\n this.initialized = true;\n this.startTime = Date.now();\n logger.info(\"AppContext initialized\");\n }\n\n get uptime(): number {\n return Math.floor((Date.now() - this.startTime) / 1000);\n }\n\n /**\n * Initialize the provider registry:\n * 1. Register built-in providers\n * 2. Read config.json and register default + extra providers\n */\n private loadProviderRegistry(): void {\n registerBuiltinProviders();\n\n const configFile = join(this.homeDir, \"config.json\");\n let userConfig: UserConfig;\n try {\n userConfig = JSON.parse(readFileSync(configFile, \"utf-8\")) as UserConfig;\n } catch {\n logger.debug(\"No config.json found or failed to parse, using built-in providers only\");\n return;\n }\n\n if (userConfig.provider) {\n const p = userConfig.provider;\n modelProviderRegistry.register({\n type: p.type,\n displayName: p.type,\n protocol: (p.protocol ?? \"custom\") as ModelApiProtocol,\n defaultBaseUrl: p.baseUrl,\n apiKey: p.apiKey,\n });\n modelProviderRegistry.setDefault(p.type);\n logger.info({ type: p.type }, \"Default provider loaded from config.json\");\n }\n\n if (userConfig.providers) {\n for (const p of userConfig.providers) {\n modelProviderRegistry.register({\n type: p.type,\n displayName: p.type,\n protocol: (p.protocol ?? \"custom\") as ModelApiProtocol,\n defaultBaseUrl: p.baseUrl,\n apiKey: p.apiKey,\n });\n logger.debug({ type: p.type }, \"Extra provider loaded from config.json\");\n }\n }\n }\n\n private registerPiBackend(): void {\n registerBackend({\n type: \"pi\",\n supportedModes: [\"acp\"],\n acpResolver: () => ({\n command: process.execPath,\n args: [ACP_BRIDGE_PATH],\n }),\n acpOwnsProcess: true,\n });\n this.agentInitializer.workspaceBuilder.registerBuilder(new PiBuilder());\n registerCommunicator(\"pi\", (backendConfig) => new PiCommunicator(configFromBackend(backendConfig)));\n logger.info(\"Pi backend registered (in-process, acp mode only)\");\n }\n\n private async loadDomainComponents(): Promise<void> {\n const dirs: { manager: { setPersistDir(dir: string): void; loadFromDirectory(dirPath: string): Promise<number> }; sub: string }[] = [\n { manager: this.skillManager, sub: \"skills\" },\n { manager: this.promptManager, sub: \"prompts\" },\n { manager: this.mcpConfigManager, sub: \"mcp\" },\n { manager: this.workflowManager, sub: \"workflows\" },\n { manager: this.pluginManager, sub: \"plugins\" },\n { manager: this.templateRegistry, sub: \"templates\" },\n ];\n\n for (const { manager, sub } of dirs) {\n const dirPath = join(this.configsDir, sub);\n manager.setPersistDir(dirPath);\n try {\n await manager.loadFromDirectory(dirPath);\n } catch {\n logger.debug({ dirPath }, `No ${sub} configs found, skipping`);\n }\n }\n }\n}\n","import { createServer, type Server, type Socket } from \"node:net\";\nimport {\n createLogger,\n ActantError,\n RPC_ERROR_CODES,\n type RpcRequest,\n type RpcResponse,\n} from \"@actant/shared\";\nimport type { HandlerRegistry } from \"../handlers/index\";\nimport type { AppContext } from \"../services/app-context\";\n\nconst logger = createLogger(\"socket-server\");\n\nconst ERROR_CODE_MAP: Record<string, number> = {\n TEMPLATE_NOT_FOUND: RPC_ERROR_CODES.TEMPLATE_NOT_FOUND,\n CONFIG_VALIDATION_ERROR: RPC_ERROR_CODES.CONFIG_VALIDATION,\n AGENT_NOT_FOUND: RPC_ERROR_CODES.AGENT_NOT_FOUND,\n AGENT_ALREADY_RUNNING: RPC_ERROR_CODES.AGENT_ALREADY_RUNNING,\n WORKSPACE_INIT_ERROR: RPC_ERROR_CODES.WORKSPACE_INIT,\n COMPONENT_REFERENCE_ERROR: RPC_ERROR_CODES.COMPONENT_REFERENCE,\n INSTANCE_CORRUPTED: RPC_ERROR_CODES.INSTANCE_CORRUPTED,\n AGENT_LAUNCH_ERROR: RPC_ERROR_CODES.AGENT_LAUNCH,\n AGENT_ALREADY_ATTACHED: RPC_ERROR_CODES.AGENT_ALREADY_ATTACHED,\n AGENT_NOT_ATTACHED: RPC_ERROR_CODES.AGENT_NOT_ATTACHED,\n};\n\nfunction mapErrorCode(err: ActantError): number {\n return ERROR_CODE_MAP[err.code] ?? RPC_ERROR_CODES.GENERIC_BUSINESS;\n}\n\nexport class SocketServer {\n private server: Server | null = null;\n private connections = new Set<Socket>();\n\n constructor(\n private readonly handlers: HandlerRegistry,\n private readonly ctx: AppContext,\n ) {}\n\n listen(socketPath: string): Promise<void> {\n return new Promise((resolve, reject) => {\n this.server = createServer((socket) => this.handleConnection(socket));\n\n this.server.on(\"error\", (err) => {\n logger.error({ error: err }, \"Socket server error\");\n reject(err);\n });\n\n this.server.listen(socketPath, () => {\n logger.info({ socketPath }, \"Socket server listening\");\n resolve();\n });\n });\n }\n\n async close(): Promise<void> {\n for (const conn of this.connections) {\n conn.destroy();\n }\n this.connections.clear();\n\n return new Promise((resolve) => {\n if (!this.server) {\n resolve();\n return;\n }\n this.server.close(() => {\n logger.info(\"Socket server closed\");\n resolve();\n });\n });\n }\n\n private handleConnection(socket: Socket): void {\n this.connections.add(socket);\n let buffer = \"\";\n\n socket.on(\"data\", (chunk) => {\n buffer += chunk.toString();\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n this.processMessage(trimmed, socket);\n }\n });\n\n socket.on(\"close\", () => {\n this.connections.delete(socket);\n });\n\n socket.on(\"error\", (err) => {\n logger.debug({ error: err.message }, \"Client connection error\");\n this.connections.delete(socket);\n });\n }\n\n private processMessage(raw: string, socket: Socket): void {\n let request: RpcRequest;\n\n try {\n request = JSON.parse(raw) as RpcRequest;\n } catch {\n this.sendResponse(socket, {\n jsonrpc: \"2.0\",\n id: 0,\n error: { code: RPC_ERROR_CODES.PARSE_ERROR, message: \"Invalid JSON\" },\n });\n return;\n }\n\n if (!request.jsonrpc || request.jsonrpc !== \"2.0\" || !request.method || request.id == null) {\n this.sendResponse(socket, {\n jsonrpc: \"2.0\",\n id: request.id ?? 0,\n error: { code: RPC_ERROR_CODES.INVALID_REQUEST, message: \"Invalid JSON-RPC 2.0 request\" },\n });\n return;\n }\n\n const handler = this.handlers.get(request.method);\n if (!handler) {\n this.sendResponse(socket, {\n jsonrpc: \"2.0\",\n id: request.id,\n error: { code: RPC_ERROR_CODES.METHOD_NOT_FOUND, message: `Method not found: ${request.method}` },\n });\n return;\n }\n\n handler(request.params ?? {}, this.ctx)\n .then((result) => {\n this.sendResponse(socket, {\n jsonrpc: \"2.0\",\n id: request.id,\n result,\n });\n })\n .catch((err: unknown) => {\n if (err instanceof ActantError) {\n this.sendResponse(socket, {\n jsonrpc: \"2.0\",\n id: request.id,\n error: {\n code: mapErrorCode(err),\n message: err.message,\n data: { errorCode: err.code, context: err.context },\n },\n });\n } else {\n logger.error({ error: err }, \"Unhandled handler error\");\n this.sendResponse(socket, {\n jsonrpc: \"2.0\",\n id: request.id,\n error: { code: RPC_ERROR_CODES.INTERNAL_ERROR, message: err instanceof Error ? err.message : \"Internal error\" },\n });\n }\n });\n }\n\n private sendResponse(socket: Socket, response: RpcResponse): void {\n if (!socket.destroyed) {\n socket.write(JSON.stringify(response) + \"\\n\");\n }\n }\n}\n","import type { AppContext } from \"../services/app-context\";\n\nexport type RpcHandler = (params: Record<string, unknown>, ctx: AppContext) => Promise<unknown>;\n\nexport class HandlerRegistry {\n private handlers = new Map<string, RpcHandler>();\n\n register(method: string, handler: RpcHandler): void {\n this.handlers.set(method, handler);\n }\n\n get(method: string): RpcHandler | undefined {\n return this.handlers.get(method);\n }\n\n has(method: string): boolean {\n return this.handlers.has(method);\n }\n\n methods(): string[] {\n return Array.from(this.handlers.keys());\n }\n}\n","import { resolve } from \"node:path\";\nimport type {\n TemplateListResult,\n TemplateGetParams,\n TemplateGetResult,\n TemplateLoadParams,\n TemplateLoadResult,\n TemplateUnloadParams,\n TemplateUnloadResult,\n TemplateValidateParams,\n TemplateValidateResult,\n} from \"@actant/shared\";\nimport type { AppContext } from \"../services/app-context\";\nimport type { HandlerRegistry } from \"./handler-registry\";\n\nexport function registerTemplateHandlers(registry: HandlerRegistry): void {\n registry.register(\"template.list\", handleTemplateList);\n registry.register(\"template.get\", handleTemplateGet);\n registry.register(\"template.load\", handleTemplateLoad);\n registry.register(\"template.unload\", handleTemplateUnload);\n registry.register(\"template.validate\", handleTemplateValidate);\n}\n\nasync function handleTemplateList(\n _params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<TemplateListResult> {\n return ctx.templateRegistry.list();\n}\n\nasync function handleTemplateGet(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<TemplateGetResult> {\n const { name } = params as unknown as TemplateGetParams;\n return ctx.templateRegistry.getOrThrow(name);\n}\n\nasync function handleTemplateLoad(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<TemplateLoadResult> {\n const { filePath } = params as unknown as TemplateLoadParams;\n const template = await ctx.templateLoader.loadFromFile(resolve(filePath));\n ctx.templateRegistry.register(template);\n await ctx.templateRegistry.persist(template);\n return template;\n}\n\nasync function handleTemplateUnload(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<TemplateUnloadResult> {\n const { name } = params as unknown as TemplateUnloadParams;\n const removed = ctx.templateRegistry.unregister(name);\n return { success: removed };\n}\n\nasync function handleTemplateValidate(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<TemplateValidateResult> {\n const { filePath } = params as unknown as TemplateValidateParams;\n try {\n const template = await ctx.templateLoader.loadFromFile(filePath);\n const { validateTemplate } = await import(\"@actant/core\");\n const deep = validateTemplate(template);\n return {\n valid: true,\n template,\n warnings: deep.warnings.map((w) => ({ path: w.path, message: w.message })),\n };\n } catch (err) {\n const validationErrors = (err as { validationErrors?: Array<{ path: string; message: string }> }).validationErrors;\n return {\n valid: false,\n errors: validationErrors ?? [{ path: \"\", message: err instanceof Error ? err.message : String(err) }],\n };\n }\n}\n","import { join } from \"node:path\";\nimport { readFile } from \"node:fs/promises\";\nimport type {\n AgentCreateParams,\n AgentCreateResult,\n AgentStartParams,\n AgentStartResult,\n AgentStopParams,\n AgentStopResult,\n AgentDestroyParams,\n AgentDestroyResult,\n AgentStatusParams,\n AgentStatusResult,\n AgentListResult,\n AgentAdoptParams,\n AgentAdoptResult,\n AgentResolveParams,\n AgentResolveResult,\n AgentOpenParams,\n AgentOpenResult,\n AgentAttachParams,\n AgentAttachResult,\n AgentDetachParams,\n AgentDetachResult,\n AgentRunParams,\n AgentRunResult,\n AgentPromptParams,\n AgentPromptResult,\n AgentUpdatePermissionsParams,\n AgentUpdatePermissionsResult,\n} from \"@actant/shared\";\nimport { AgentNotFoundError } from \"@actant/shared\";\nimport { resolvePermissionsWithMcp, PermissionAuditLogger } from \"@actant/core\";\nimport { updateInstanceMeta } from \"@actant/core\";\nimport type { AppContext } from \"../services/app-context\";\nimport type { HandlerRegistry } from \"./handler-registry\";\n\nexport function registerAgentHandlers(registry: HandlerRegistry): void {\n registry.register(\"agent.create\", handleAgentCreate);\n registry.register(\"agent.start\", handleAgentStart);\n registry.register(\"agent.stop\", handleAgentStop);\n registry.register(\"agent.destroy\", handleAgentDestroy);\n registry.register(\"agent.status\", handleAgentStatus);\n registry.register(\"agent.list\", handleAgentList);\n registry.register(\"agent.adopt\", handleAgentAdopt);\n registry.register(\"agent.resolve\", handleAgentResolve);\n registry.register(\"agent.open\", handleAgentOpen);\n registry.register(\"agent.attach\", handleAgentAttach);\n registry.register(\"agent.detach\", handleAgentDetach);\n registry.register(\"agent.run\", handleAgentRun);\n registry.register(\"agent.prompt\", handleAgentPrompt);\n registry.register(\"agent.updatePermissions\", handleAgentUpdatePermissions);\n registry.register(\"agent.processLogs\", handleAgentProcessLogs);\n}\n\nasync function handleAgentCreate(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<AgentCreateResult> {\n const { name, template, overrides } = params as unknown as AgentCreateParams;\n return ctx.agentManager.createAgent(name, template, overrides);\n}\n\nasync function handleAgentStart(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<AgentStartResult> {\n const { name } = params as unknown as AgentStartParams;\n await ctx.agentManager.startAgent(name);\n const meta = ctx.agentManager.getAgent(name);\n if (!meta) throw new AgentNotFoundError(name);\n return meta;\n}\n\nasync function handleAgentStop(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<AgentStopResult> {\n const { name } = params as unknown as AgentStopParams;\n await ctx.agentManager.stopAgent(name);\n const meta = ctx.agentManager.getAgent(name);\n if (!meta) throw new AgentNotFoundError(name);\n return meta;\n}\n\nasync function handleAgentDestroy(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<AgentDestroyResult> {\n const { name } = params as unknown as AgentDestroyParams;\n await ctx.agentManager.destroyAgent(name);\n return { success: true };\n}\n\nasync function handleAgentStatus(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<AgentStatusResult> {\n const { name } = params as unknown as AgentStatusParams;\n const meta = ctx.agentManager.getAgent(name);\n if (!meta) throw new AgentNotFoundError(name);\n return meta;\n}\n\nasync function handleAgentList(\n _params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<AgentListResult> {\n return ctx.agentManager.listAgents();\n}\n\nasync function handleAgentAdopt(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<AgentAdoptResult> {\n const { path, rename } = params as unknown as AgentAdoptParams;\n const entry = await ctx.instanceRegistry.adopt(path, rename);\n return {\n name: entry.name,\n template: entry.template,\n workspacePath: entry.workspacePath,\n location: entry.location,\n createdAt: entry.createdAt,\n status: entry.status,\n };\n}\n\nasync function handleAgentResolve(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<AgentResolveResult> {\n const { name, template, overrides } = params as unknown as AgentResolveParams;\n return ctx.agentManager.resolveAgent(name, template, overrides);\n}\n\nasync function handleAgentOpen(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<AgentOpenResult> {\n const { name } = params as unknown as AgentOpenParams;\n return ctx.agentManager.openAgent(name);\n}\n\nasync function handleAgentAttach(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<AgentAttachResult> {\n const { name, pid, metadata } = params as unknown as AgentAttachParams;\n return ctx.agentManager.attachAgent(name, pid, metadata);\n}\n\nasync function handleAgentDetach(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<AgentDetachResult> {\n const { name, cleanup } = params as unknown as AgentDetachParams;\n return ctx.agentManager.detachAgent(name, { cleanup });\n}\n\nasync function handleAgentRun(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<AgentRunResult> {\n const { name, prompt, options } = params as unknown as AgentRunParams;\n return ctx.agentManager.runPrompt(name, prompt, options);\n}\n\nasync function handleAgentPrompt(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<AgentPromptResult> {\n const { name, message, sessionId } = params as unknown as AgentPromptParams;\n const result = await ctx.agentManager.promptAgent(name, message, sessionId);\n return {\n response: result.text,\n sessionId: result.sessionId ?? \"\",\n };\n}\n\nasync function handleAgentUpdatePermissions(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<AgentUpdatePermissionsResult> {\n const { name, permissions } = params as unknown as AgentUpdatePermissionsParams;\n const meta = ctx.agentManager.getAgent(name);\n if (!meta) throw new AgentNotFoundError(name);\n\n const workspaceDir = join(ctx.instancesDir, name);\n\n // Resolve MCP server names from the existing config\n const mcpServers = ctx.mcpConfigManager.list().map((s) => s.name);\n const resolved = resolvePermissionsWithMcp(permissions, mcpServers);\n\n // Update .actant.json\n await updateInstanceMeta(workspaceDir, { effectivePermissions: resolved });\n\n // Update ACP Client enforcer if connected\n ctx.acpConnectionManager.updatePermissionPolicy(name, resolved);\n\n const auditLogger = new PermissionAuditLogger(name);\n auditLogger.logUpdated(\"rpc:agent.updatePermissions\");\n\n return { effectivePermissions: resolved };\n}\n\ninterface AgentProcessLogsParams {\n name: string;\n stream?: \"stdout\" | \"stderr\";\n lines?: number;\n}\n\ninterface AgentProcessLogsResult {\n lines: string[];\n stream: string;\n logDir: string;\n}\n\nasync function handleAgentProcessLogs(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<AgentProcessLogsResult> {\n const { name, stream = \"stdout\", lines = 50 } = params as unknown as AgentProcessLogsParams;\n const meta = ctx.agentManager.getAgent(name);\n if (!meta) throw new AgentNotFoundError(name);\n\n const logDir = join(ctx.instancesDir, name, \"logs\");\n const logFile = join(logDir, `${stream}.log`);\n\n let content: string;\n try {\n content = await readFile(logFile, \"utf-8\");\n } catch {\n return { lines: [], stream, logDir };\n }\n\n const allLines = content.split(\"\\n\").filter(Boolean);\n return {\n lines: allLines.slice(-lines),\n stream,\n logDir,\n };\n}\n","import type {\n SessionCreateParams,\n SessionCreateResult,\n SessionPromptParams,\n SessionPromptResult,\n SessionCancelParams,\n SessionCancelResult,\n SessionCloseParams,\n SessionCloseResult,\n SessionListParams,\n SessionListResult,\n SessionLeaseInfo,\n} from \"@actant/shared\";\nimport { createLogger } from \"@actant/shared\";\nimport type { SessionLease } from \"@actant/core\";\nimport type { AppContext } from \"../services/app-context\";\nimport type { HandlerRegistry } from \"./handler-registry\";\n\nconst logger = createLogger(\"session-handlers\");\n\nexport function registerSessionHandlers(registry: HandlerRegistry): void {\n registry.register(\"session.create\", handleSessionCreate);\n registry.register(\"session.prompt\", handleSessionPrompt);\n registry.register(\"session.cancel\", handleSessionCancel);\n registry.register(\"session.close\", handleSessionClose);\n registry.register(\"session.list\", handleSessionList);\n}\n\nasync function handleSessionCreate(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<SessionCreateResult> {\n const { agentName, clientId, idleTtlMs } = params as unknown as SessionCreateParams;\n\n if (!agentName || typeof agentName !== 'string') {\n throw new Error('Required parameter \"agentName\" is missing or invalid');\n }\n if (!clientId || typeof clientId !== 'string') {\n throw new Error('Required parameter \"clientId\" is missing or invalid');\n }\n\n const meta = ctx.agentManager.getAgent(agentName);\n if (!meta) {\n throw new Error(`Agent \"${agentName}\" not found`);\n }\n if (meta.status !== \"running\") {\n throw new Error(`Agent \"${agentName}\" is not running (status: ${meta.status}). Start it with: actant agent start ${agentName}`);\n }\n if (!ctx.agentManager.hasAcpConnection(agentName)) {\n throw new Error(`Agent \"${agentName}\" has no ACP connection`);\n }\n\n const lease = ctx.sessionRegistry.create({ agentName, clientId, idleTtlMs });\n\n logger.info({ sessionId: lease.sessionId, agentName, clientId }, \"Session lease created\");\n return toLeaseInfo(lease);\n}\n\nasync function handleSessionPrompt(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<SessionPromptResult> {\n const { sessionId, text } = params as unknown as SessionPromptParams;\n\n if (!sessionId || typeof sessionId !== 'string') {\n throw new Error('Required parameter \"sessionId\" is missing or invalid');\n }\n if (!text || typeof text !== 'string') {\n throw new Error('Required parameter \"text\" is missing or invalid');\n }\n\n const lease = ctx.sessionRegistry.get(sessionId);\n if (!lease) {\n throw new Error(`Session \"${sessionId}\" not found`);\n }\n if (lease.state === \"expired\") {\n throw new Error(`Session \"${sessionId}\" has expired`);\n }\n\n ctx.sessionRegistry.touch(sessionId);\n\n const result = await ctx.agentManager.promptAgent(\n lease.agentName,\n text,\n );\n\n ctx.sessionRegistry.touch(sessionId);\n\n return {\n stopReason: \"end_turn\",\n text: result.text,\n };\n}\n\nasync function handleSessionCancel(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<SessionCancelResult> {\n const { sessionId } = params as unknown as SessionCancelParams;\n\n if (!sessionId || typeof sessionId !== 'string') {\n throw new Error('Required parameter \"sessionId\" is missing or invalid');\n }\n\n const lease = ctx.sessionRegistry.get(sessionId);\n if (!lease) {\n throw new Error(`Session \"${sessionId}\" not found`);\n }\n\n const conn = ctx.acpConnectionManager.getConnection(lease.agentName);\n if (!conn) {\n throw new Error(`Agent \"${lease.agentName}\" has no ACP connection`);\n }\n\n // Use the Agent's primary ACP session ID, not the lease session ID\n const acpSessionId = ctx.acpConnectionManager.getPrimarySessionId(lease.agentName);\n if (!acpSessionId) {\n throw new Error(`Agent \"${lease.agentName}\" has no primary ACP session`);\n }\n\n try {\n await conn.cancel(acpSessionId);\n logger.info({ sessionId, acpSessionId, agentName: lease.agentName }, \"Session cancel sent to ACP\");\n } catch (err) {\n logger.error({ sessionId, error: err }, \"Failed to cancel ACP session\");\n throw new Error(`Failed to cancel session: ${err instanceof Error ? err.message : String(err)}`, { cause: err });\n }\n\n return { ok: true };\n}\n\nasync function handleSessionClose(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<SessionCloseResult> {\n const { sessionId } = params as unknown as SessionCloseParams;\n\n if (!sessionId || typeof sessionId !== 'string') {\n throw new Error('Required parameter \"sessionId\" is missing or invalid');\n }\n\n const closed = ctx.sessionRegistry.close(sessionId);\n if (!closed) {\n throw new Error(`Session \"${sessionId}\" not found`);\n }\n\n return { ok: true };\n}\n\nasync function handleSessionList(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<SessionListResult> {\n const { agentName } = params as unknown as SessionListParams;\n return ctx.sessionRegistry.list(agentName).map(toLeaseInfo);\n}\n\nfunction toLeaseInfo(lease: SessionLease): SessionLeaseInfo {\n return {\n sessionId: lease.sessionId,\n agentName: lease.agentName,\n clientId: lease.clientId,\n state: lease.state,\n createdAt: lease.createdAt,\n lastActivityAt: lease.lastActivityAt,\n idleTtlMs: lease.idleTtlMs,\n };\n}\n","import { ConfigNotFoundError } from \"@actant/shared\";\nimport type {\n SkillGetParams,\n PromptGetParams,\n McpGetParams,\n WorkflowGetParams,\n PluginGetParams,\n PluginDefinition,\n ComponentAddParams,\n ComponentUpdateParams,\n ComponentRemoveParams,\n ComponentImportParams,\n ComponentExportParams,\n SkillDefinition,\n PromptDefinition,\n McpServerDefinition,\n WorkflowDefinition,\n} from \"@actant/shared\";\nimport type { BaseComponentManager, NamedComponent } from \"@actant/core\";\nimport type { AppContext } from \"../services/app-context\";\nimport type { HandlerRegistry, RpcHandler } from \"./handler-registry\";\n\n// ---------------------------------------------------------------------------\n// Generic CRUD handler factory\n// ---------------------------------------------------------------------------\n\ninterface CrudHandlers {\n add: RpcHandler;\n update: RpcHandler;\n remove: RpcHandler;\n import: RpcHandler;\n export: RpcHandler;\n}\n\nfunction createCrudHandlers<T extends NamedComponent>(\n getManager: (ctx: AppContext) => BaseComponentManager<T>,\n): CrudHandlers {\n return {\n add: async (params: Record<string, unknown>, ctx: AppContext) => {\n const { component } = params as unknown as ComponentAddParams;\n const mgr = getManager(ctx);\n await mgr.add(component as T, true);\n return { name: (component as { name: string }).name };\n },\n update: async (params: Record<string, unknown>, ctx: AppContext) => {\n const { name, patch } = params as unknown as ComponentUpdateParams;\n const result = await getManager(ctx).update(name, patch as Partial<T>, true);\n return { name: result.name };\n },\n remove: async (params: Record<string, unknown>, ctx: AppContext) => {\n const { name } = params as unknown as ComponentRemoveParams;\n const success = await getManager(ctx).remove(name, true);\n return { success };\n },\n import: async (params: Record<string, unknown>, ctx: AppContext) => {\n const { filePath } = params as unknown as ComponentImportParams;\n const result = await getManager(ctx).importFromFile(filePath);\n return { name: result.name };\n },\n export: async (params: Record<string, unknown>, ctx: AppContext) => {\n const { name, filePath } = params as unknown as ComponentExportParams;\n await getManager(ctx).exportToFile(name, filePath);\n return { success: true };\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Registration\n// ---------------------------------------------------------------------------\n\nexport function registerDomainHandlers(registry: HandlerRegistry): void {\n registry.register(\"skill.list\", handleSkillList);\n registry.register(\"skill.get\", handleSkillGet);\n registry.register(\"prompt.list\", handlePromptList);\n registry.register(\"prompt.get\", handlePromptGet);\n registry.register(\"mcp.list\", handleMcpList);\n registry.register(\"mcp.get\", handleMcpGet);\n registry.register(\"workflow.list\", handleWorkflowList);\n registry.register(\"workflow.get\", handleWorkflowGet);\n registry.register(\"plugin.list\", handlePluginList);\n registry.register(\"plugin.get\", handlePluginGet);\n\n const skillCrud = createCrudHandlers<SkillDefinition>((ctx) => ctx.skillManager);\n const promptCrud = createCrudHandlers<PromptDefinition>((ctx) => ctx.promptManager);\n const mcpCrud = createCrudHandlers<McpServerDefinition>((ctx) => ctx.mcpConfigManager);\n const workflowCrud = createCrudHandlers<WorkflowDefinition>((ctx) => ctx.workflowManager);\n const pluginCrud = createCrudHandlers<PluginDefinition>((ctx) => ctx.pluginManager);\n\n const crudSets = [\n { prefix: \"skill\", crud: skillCrud },\n { prefix: \"prompt\", crud: promptCrud },\n { prefix: \"mcp\", crud: mcpCrud },\n { prefix: \"workflow\", crud: workflowCrud },\n { prefix: \"plugin\", crud: pluginCrud },\n ];\n\n for (const { prefix, crud } of crudSets) {\n registry.register(`${prefix}.add`, crud.add);\n registry.register(`${prefix}.update`, crud.update);\n registry.register(`${prefix}.remove`, crud.remove);\n registry.register(`${prefix}.import`, crud.import);\n registry.register(`${prefix}.export`, crud.export);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Existing read-only handlers (preserved)\n// ---------------------------------------------------------------------------\n\nasync function handleSkillList(\n _params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<SkillDefinition[]> {\n return ctx.skillManager.list();\n}\n\nasync function handleSkillGet(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<SkillDefinition> {\n const { name } = params as unknown as SkillGetParams;\n const skill = ctx.skillManager.get(name);\n if (!skill) {\n throw new ConfigNotFoundError(`Skill \"${name}\" not found`);\n }\n return skill;\n}\n\nasync function handlePromptList(\n _params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<PromptDefinition[]> {\n return ctx.promptManager.list();\n}\n\nasync function handlePromptGet(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<PromptDefinition> {\n const { name } = params as unknown as PromptGetParams;\n const prompt = ctx.promptManager.get(name);\n if (!prompt) {\n throw new ConfigNotFoundError(`Prompt \"${name}\" not found`);\n }\n return prompt;\n}\n\nasync function handleMcpList(\n _params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<McpServerDefinition[]> {\n return ctx.mcpConfigManager.list();\n}\n\nasync function handleMcpGet(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<McpServerDefinition> {\n const { name } = params as unknown as McpGetParams;\n const mcp = ctx.mcpConfigManager.get(name);\n if (!mcp) {\n throw new ConfigNotFoundError(`MCP server \"${name}\" not found`);\n }\n return mcp;\n}\n\nasync function handleWorkflowList(\n _params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<WorkflowDefinition[]> {\n return ctx.workflowManager.list();\n}\n\nasync function handleWorkflowGet(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<WorkflowDefinition> {\n const { name } = params as unknown as WorkflowGetParams;\n const workflow = ctx.workflowManager.get(name);\n if (!workflow) {\n throw new ConfigNotFoundError(`Workflow \"${name}\" not found`);\n }\n return workflow;\n}\n\nasync function handlePluginList(\n _params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<PluginDefinition[]> {\n return ctx.pluginManager.list();\n}\n\nasync function handlePluginGet(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<PluginDefinition> {\n const { name } = params as unknown as PluginGetParams;\n const plugin = ctx.pluginManager.get(name);\n if (!plugin) {\n throw new ConfigNotFoundError(`Plugin \"${name}\" not found`);\n }\n return plugin;\n}\n","import type {\n SourceAddParams,\n SourceRemoveParams,\n SourceSyncParams,\n SourceValidateParams,\n SourceValidateResult,\n SourceEntry,\n} from \"@actant/shared\";\nimport { SourceValidator } from \"@actant/core\";\nimport type { AppContext } from \"../services/app-context\";\nimport type { HandlerRegistry } from \"./handler-registry\";\n\nexport function registerSourceHandlers(registry: HandlerRegistry): void {\n registry.register(\"source.list\", handleSourceList);\n registry.register(\"source.add\", handleSourceAdd);\n registry.register(\"source.remove\", handleSourceRemove);\n registry.register(\"source.sync\", handleSourceSync);\n registry.register(\"source.validate\", handleSourceValidate);\n}\n\nasync function handleSourceList(\n _params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<SourceEntry[]> {\n return ctx.sourceManager.listSources();\n}\n\nasync function handleSourceAdd(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<{ name: string; components: Record<string, number> }> {\n const { name, config } = params as unknown as SourceAddParams;\n const result = await ctx.sourceManager.addSource(name, config);\n return {\n name,\n components: {\n skills: result.skills.length,\n prompts: result.prompts.length,\n mcp: result.mcpServers.length,\n workflows: result.workflows.length,\n presets: result.presets.length,\n },\n };\n}\n\nasync function handleSourceRemove(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<{ success: boolean }> {\n const { name } = params as unknown as SourceRemoveParams;\n const success = await ctx.sourceManager.removeSource(name);\n return { success };\n}\n\nasync function handleSourceSync(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<{ synced: string[]; report?: { addedCount: number; updatedCount: number; removedCount: number; hasBreakingChanges: boolean } }> {\n const { name } = params as unknown as SourceSyncParams;\n if (name) {\n const { report } = await ctx.sourceManager.syncSourceWithReport(name);\n return {\n synced: [name],\n report: {\n addedCount: report.added.length,\n updatedCount: report.updated.length,\n removedCount: report.removed.length,\n hasBreakingChanges: report.hasBreakingChanges,\n },\n };\n }\n const { report } = await ctx.sourceManager.syncAllWithReport();\n return {\n synced: ctx.sourceManager.listSources().map((s) => s.name),\n report: {\n addedCount: report.added.length,\n updatedCount: report.updated.length,\n removedCount: report.removed.length,\n hasBreakingChanges: report.hasBreakingChanges,\n },\n };\n}\n\nasync function handleSourceValidate(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<SourceValidateResult> {\n const { name, path, strict, compat } = params as unknown as SourceValidateParams;\n\n let rootDir: string;\n if (path) {\n rootDir = path;\n } else if (name) {\n rootDir = ctx.sourceManager.getSourceRootDir(name);\n } else {\n throw new Error(\"Either 'name' or 'path' parameter is required\");\n }\n\n const validator = new SourceValidator();\n return validator.validate(rootDir, {\n strict,\n compat: compat as \"agent-skills\" | undefined,\n });\n}\n","import { ConfigNotFoundError } from \"@actant/shared\";\nimport type {\n PresetListParams,\n PresetShowParams,\n PresetApplyParams,\n PresetDefinition,\n AgentTemplate,\n} from \"@actant/shared\";\nimport type { AppContext } from \"../services/app-context\";\nimport type { HandlerRegistry } from \"./handler-registry\";\n\nexport function registerPresetHandlers(registry: HandlerRegistry): void {\n registry.register(\"preset.list\", handlePresetList);\n registry.register(\"preset.show\", handlePresetShow);\n registry.register(\"preset.apply\", handlePresetApply);\n}\n\nasync function handlePresetList(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<PresetDefinition[]> {\n const { packageName } = params as unknown as PresetListParams;\n return ctx.sourceManager.listPresets(packageName);\n}\n\nasync function handlePresetShow(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<PresetDefinition> {\n const { qualifiedName } = params as unknown as PresetShowParams;\n const preset = ctx.sourceManager.getPreset(qualifiedName);\n if (!preset) {\n throw new ConfigNotFoundError(`Preset \"${qualifiedName}\" not found`);\n }\n return preset;\n}\n\nasync function handlePresetApply(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<AgentTemplate> {\n const { qualifiedName, templateName } = params as unknown as PresetApplyParams;\n const template = ctx.templateRegistry.get(templateName);\n if (!template) {\n throw new ConfigNotFoundError(`Template \"${templateName}\" not found`);\n }\n return ctx.sourceManager.applyPreset(qualifiedName, template);\n}\n","import type {\n DaemonPingResult,\n DaemonShutdownResult,\n} from \"@actant/shared\";\nimport type { AppContext } from \"../services/app-context\";\nimport type { HandlerRegistry } from \"./handler-registry\";\n\nexport function registerDaemonHandlers(\n registry: HandlerRegistry,\n shutdownFn: () => Promise<void>,\n): void {\n registry.register(\"daemon.ping\", async (_params, ctx) => handleDaemonPing(ctx));\n registry.register(\"daemon.shutdown\", async () => handleDaemonShutdown(shutdownFn));\n}\n\nasync function handleDaemonPing(ctx: AppContext): Promise<DaemonPingResult> {\n return {\n version: \"0.1.0\",\n uptime: ctx.uptime,\n agents: ctx.agentManager.size,\n };\n}\n\nasync function handleDaemonShutdown(\n shutdownFn: () => Promise<void>,\n): Promise<DaemonShutdownResult> {\n setImmediate(() => shutdownFn());\n return { success: true };\n}\n","import { randomUUID } from \"node:crypto\";\nimport type {\n ProxyConnectParams,\n ProxyConnectResult,\n ProxyDisconnectParams,\n ProxyDisconnectResult,\n ProxyForwardParams,\n ProxyForwardResult,\n ProxySession,\n} from \"@actant/shared\";\nimport { createLogger } from \"@actant/shared\";\nimport type { AppContext } from \"../services/app-context\";\nimport type { HandlerRegistry } from \"./handler-registry\";\n\nconst logger = createLogger(\"proxy-handlers\");\n\nconst proxySessions = new Map<string, ProxySession>();\n\n/**\n * @deprecated Legacy RPC-relay proxy handlers. Retained for backward compatibility.\n * New proxy connections should use Direct Bridge mode (CLI spawns agent directly)\n * or Session Lease mode (session.* RPC methods). See issue #35.\n */\nexport function registerProxyHandlers(registry: HandlerRegistry): void {\n registry.register(\"proxy.connect\", handleProxyConnect);\n registry.register(\"proxy.disconnect\", handleProxyDisconnect);\n registry.register(\"proxy.forward\", handleProxyForward);\n}\n\nasync function handleProxyConnect(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<ProxyConnectResult> {\n const { agentName, envPassthrough } = params as unknown as ProxyConnectParams;\n\n const meta = ctx.agentManager.getAgent(agentName);\n if (!meta) {\n throw new Error(`Agent \"${agentName}\" not found`);\n }\n\n if (meta.status !== \"running\") {\n throw new Error(`Agent \"${agentName}\" is not running (status: ${meta.status})`);\n }\n\n if (!ctx.agentManager.hasAcpConnection(agentName)) {\n throw new Error(`Agent \"${agentName}\" has no ACP connection`);\n }\n\n const sessionId = randomUUID();\n const session: ProxySession = {\n sessionId,\n agentName,\n envPassthrough: envPassthrough ?? false,\n connectedAt: new Date().toISOString(),\n };\n proxySessions.set(sessionId, session);\n\n logger.info({ sessionId, agentName, envPassthrough }, \"Proxy session connected\");\n return session;\n}\n\nasync function handleProxyDisconnect(\n params: Record<string, unknown>,\n _ctx: AppContext,\n): Promise<ProxyDisconnectResult> {\n const { sessionId } = params as unknown as ProxyDisconnectParams;\n\n const session = proxySessions.get(sessionId);\n if (!session) {\n throw new Error(`Proxy session \"${sessionId}\" not found`);\n }\n\n proxySessions.delete(sessionId);\n logger.info({ sessionId, agentName: session.agentName }, \"Proxy session disconnected\");\n return { ok: true };\n}\n\nasync function handleProxyForward(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<ProxyForwardResult> {\n const { sessionId, acpMessage } = params as unknown as ProxyForwardParams;\n\n const session = proxySessions.get(sessionId);\n if (!session) {\n throw new Error(`Proxy session \"${sessionId}\" not found`);\n }\n\n const method = acpMessage[\"method\"] as string | undefined;\n if (!method) {\n throw new Error(\"ACP message missing 'method' field\");\n }\n\n const acpParams = (acpMessage[\"params\"] ?? {}) as Record<string, unknown>;\n\n switch (method) {\n case \"session/prompt\": {\n const prompt = acpParams[\"prompt\"] as Array<{ type: string; text?: string }> | undefined;\n const text = prompt?.find((p) => p.type === \"text\")?.text ?? \"\";\n const result = await ctx.agentManager.promptAgent(session.agentName, text);\n return { result: { stopReason: \"end_turn\", text: result.text } };\n }\n case \"session/cancel\": {\n return { result: { ok: true } };\n }\n default:\n throw new Error(`Unsupported ACP method: ${method}`);\n }\n}\n","import type {\n AgentDispatchParams,\n AgentDispatchResult,\n AgentTasksParams,\n AgentTasksResult,\n AgentLogsParams,\n AgentLogsResult,\n ScheduleListParams,\n ScheduleListResult,\n} from \"@actant/shared\";\nimport type { AppContext } from \"../services/app-context\";\nimport type { HandlerRegistry } from \"./handler-registry\";\n\nexport function registerScheduleHandlers(registry: HandlerRegistry): void {\n registry.register(\"agent.dispatch\", handleAgentDispatch);\n registry.register(\"agent.tasks\", handleAgentTasks);\n registry.register(\"agent.logs\", handleAgentLogs);\n registry.register(\"schedule.list\", handleScheduleList);\n}\n\nasync function handleAgentDispatch(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<AgentDispatchResult> {\n const { name, prompt, priority } = params as unknown as AgentDispatchParams;\n const scheduler = ctx.schedulers.get(name);\n if (!scheduler) {\n return { queued: false };\n }\n const p = (priority ?? \"normal\") as \"low\" | \"normal\" | \"high\" | \"critical\";\n scheduler.dispatch(prompt, p);\n return { queued: true };\n}\n\nasync function handleAgentTasks(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<AgentTasksResult> {\n const { name } = params as unknown as AgentTasksParams;\n const scheduler = ctx.schedulers.get(name);\n if (!scheduler) {\n return { queued: 0, processing: false, tasks: [] };\n }\n return scheduler.getTasks();\n}\n\nasync function handleAgentLogs(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<AgentLogsResult> {\n const { name, limit } = params as unknown as AgentLogsParams;\n const scheduler = ctx.schedulers.get(name);\n if (!scheduler) {\n return [];\n }\n return scheduler.getLogs(limit);\n}\n\nasync function handleScheduleList(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<ScheduleListResult> {\n const { name } = params as unknown as ScheduleListParams;\n const scheduler = ctx.schedulers.get(name);\n if (!scheduler) {\n return { sources: [], running: false };\n }\n return {\n sources: scheduler.getSources(),\n running: scheduler.running,\n };\n}\n","import { writeFile, readFile, unlink } from \"node:fs/promises\";\n\nexport async function writePidFile(path: string): Promise<void> {\n await writeFile(path, String(process.pid), \"utf-8\");\n}\n\nexport async function readPidFile(path: string): Promise<number | null> {\n try {\n const content = await readFile(path, \"utf-8\");\n const pid = parseInt(content.trim(), 10);\n return Number.isNaN(pid) ? null : pid;\n } catch {\n return null;\n }\n}\n\nexport async function removePidFile(path: string): Promise<void> {\n try {\n await unlink(path);\n } catch {\n // file may not exist\n }\n}\n\nexport function isProcessRunning(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n"],"mappings":"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","names":["unlink","createLogger","createLogger","logger","resolve","join","createLogger","logger","report","ConfigNotFoundError","createLogger","logger","readFile","logger","createLogger","unlink"]}
1
+ {"version":3,"sources":["../src/daemon/daemon.ts","../src/services/app-context.ts","../src/daemon/socket-server.ts","../src/handlers/handler-registry.ts","../src/handlers/template-handlers.ts","../src/handlers/agent-handlers.ts","../src/handlers/session-handlers.ts","../src/handlers/domain-handlers.ts","../src/handlers/source-handlers.ts","../src/handlers/preset-handlers.ts","../src/handlers/daemon-handlers.ts","../src/handlers/proxy-handlers.ts","../src/handlers/schedule-handlers.ts","../src/daemon/pid-file.ts"],"sourcesContent":["import { unlink } from \"node:fs/promises\";\nimport { createLogger, ipcRequiresFileCleanup } from \"@actant/shared\";\nimport { AppContext, type AppConfig } from \"../services/app-context\";\nimport { SocketServer } from \"./socket-server\";\nimport {\n HandlerRegistry,\n registerTemplateHandlers,\n registerAgentHandlers,\n registerSessionHandlers,\n registerDomainHandlers,\n registerSourceHandlers,\n registerPresetHandlers,\n registerDaemonHandlers,\n registerProxyHandlers,\n registerScheduleHandlers,\n} from \"../handlers/index\";\nimport { writePidFile, removePidFile, readPidFile, isProcessRunning } from \"./pid-file\";\n\nconst logger = createLogger(\"daemon\");\n\nexport class Daemon {\n private ctx: AppContext;\n private server: SocketServer;\n private handlers: HandlerRegistry;\n private running = false;\n\n constructor(config?: AppConfig) {\n this.ctx = new AppContext(config);\n this.handlers = new HandlerRegistry();\n this.server = new SocketServer(this.handlers, this.ctx);\n\n registerTemplateHandlers(this.handlers);\n registerAgentHandlers(this.handlers);\n registerSessionHandlers(this.handlers);\n registerDomainHandlers(this.handlers);\n registerSourceHandlers(this.handlers);\n registerPresetHandlers(this.handlers);\n registerDaemonHandlers(this.handlers, () => this.stop());\n registerProxyHandlers(this.handlers);\n registerScheduleHandlers(this.handlers);\n }\n\n get socketPath(): string {\n return this.ctx.socketPath;\n }\n\n get appContext(): AppContext {\n return this.ctx;\n }\n\n async start(): Promise<void> {\n if (this.running) return;\n\n const existingPid = await readPidFile(this.ctx.pidFilePath);\n if (existingPid !== null && isProcessRunning(existingPid)) {\n throw new Error(`Daemon already running (PID ${existingPid})`);\n }\n\n await this.ctx.init();\n\n if (ipcRequiresFileCleanup()) {\n try {\n await unlink(this.ctx.socketPath);\n } catch {\n // socket file may not exist\n }\n }\n\n await this.server.listen(this.ctx.socketPath);\n await writePidFile(this.ctx.pidFilePath);\n this.running = true;\n\n logger.info({ pid: process.pid, socket: this.ctx.socketPath, homeDir: this.ctx.homeDir }, \"Daemon started\");\n }\n\n async stop(): Promise<void> {\n if (!this.running) return;\n this.running = false;\n\n logger.info(\"Daemon shutting down...\");\n\n const agents = this.ctx.agentManager.listAgents();\n for (const agent of agents) {\n if (agent.status === \"running\" || agent.status === \"starting\") {\n try {\n await this.ctx.agentManager.stopAgent(agent.name);\n } catch (err) {\n logger.warn({ name: agent.name, error: err }, \"Failed to stop agent during shutdown\");\n }\n }\n }\n\n this.ctx.templateWatcher.stop();\n await this.server.close();\n await removePidFile(this.ctx.pidFilePath);\n\n if (ipcRequiresFileCleanup()) {\n try {\n await unlink(this.ctx.socketPath);\n } catch {\n // socket file may have been cleaned up already\n }\n }\n\n logger.info(\"Daemon stopped\");\n }\n\n get isRunning(): boolean {\n return this.running;\n }\n}\n","import { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { mkdir } from \"node:fs/promises\";\nimport { readFileSync } from \"node:fs\";\nimport {\n TemplateRegistry,\n TemplateLoader,\n TemplateFileWatcher,\n AgentInitializer,\n AgentManager,\n SessionRegistry,\n SkillManager,\n PromptManager,\n McpConfigManager,\n WorkflowManager,\n PluginManager,\n SourceManager,\n createLauncher,\n EmployeeScheduler,\n InstanceRegistry,\n createDefaultStepRegistry,\n registerCommunicator,\n getBackendManager,\n modelProviderRegistry,\n registerBuiltinProviders,\n type LauncherMode,\n} from \"@actant/core\";\nimport type { ModelApiProtocol } from \"@actant/shared\";\nimport { AcpConnectionManager } from \"@actant/acp\";\nimport { PiBuilder, PiCommunicator, configFromBackend, ACP_BRIDGE_PATH } from \"@actant/pi\";\nimport { createLogger, getIpcPath } from \"@actant/shared\";\n\nconst logger = createLogger(\"app-context\");\n\nconst DEFAULT_HOME = join(homedir(), \".actant\");\n\n/** Shape of ~/.actant/config.json as written by `actant setup`. */\ninterface UserConfig {\n provider?: {\n type: string;\n protocol?: string;\n baseUrl?: string;\n apiKey?: string;\n };\n providers?: Array<{\n type: string;\n protocol?: string;\n baseUrl?: string;\n apiKey?: string;\n }>;\n [key: string]: unknown;\n}\n\nexport interface AppConfig {\n homeDir?: string;\n /** Override configs directory. Default: `{homeDir}/configs/` or `./configs/` fallback. */\n configsDir?: string;\n /** \"mock\" for testing, \"real\" for production. Default: auto-detect from ACTANT_LAUNCHER_MODE env. */\n launcherMode?: LauncherMode;\n}\n\nexport class AppContext {\n readonly homeDir: string;\n readonly configsDir: string;\n readonly sourcesDir: string;\n readonly templatesDir: string;\n readonly instancesDir: string;\n readonly registryPath: string;\n readonly builtinInstancesDir: string;\n readonly socketPath: string;\n readonly pidFilePath: string;\n\n readonly instanceRegistry: InstanceRegistry;\n readonly templateLoader: TemplateLoader;\n readonly templateRegistry: TemplateRegistry;\n readonly skillManager: SkillManager;\n readonly promptManager: PromptManager;\n readonly mcpConfigManager: McpConfigManager;\n readonly workflowManager: WorkflowManager;\n readonly pluginManager: PluginManager;\n readonly agentInitializer: AgentInitializer;\n readonly acpConnectionManager: AcpConnectionManager;\n readonly agentManager: AgentManager;\n readonly sessionRegistry: SessionRegistry;\n readonly sourceManager: SourceManager;\n readonly templateWatcher: TemplateFileWatcher;\n readonly schedulers: Map<string, EmployeeScheduler>;\n\n private initialized = false;\n private startTime = Date.now();\n\n constructor(config?: AppConfig) {\n this.homeDir = config?.homeDir ?? process.env.ACTANT_HOME ?? DEFAULT_HOME;\n this.configsDir = config?.configsDir ?? join(this.homeDir, \"configs\");\n this.sourcesDir = join(this.homeDir, \"sources\");\n this.templatesDir = join(this.configsDir, \"templates\");\n this.instancesDir = join(this.homeDir, \"instances\");\n this.registryPath = join(this.homeDir, \"instances\", \"registry.json\");\n this.builtinInstancesDir = join(this.homeDir, \"instances\");\n this.socketPath = process.env.ACTANT_SOCKET ?? getIpcPath(this.homeDir);\n this.pidFilePath = join(this.homeDir, \"daemon.pid\");\n\n this.instanceRegistry = new InstanceRegistry(this.registryPath, this.builtinInstancesDir);\n this.templateLoader = new TemplateLoader();\n this.templateRegistry = new TemplateRegistry({ allowOverwrite: true });\n\n this.skillManager = new SkillManager();\n this.promptManager = new PromptManager();\n this.mcpConfigManager = new McpConfigManager();\n this.workflowManager = new WorkflowManager();\n this.pluginManager = new PluginManager();\n\n const resolvedLauncherMode = config?.launcherMode\n ?? (process.env[\"ACTANT_LAUNCHER_MODE\"] as LauncherMode | undefined);\n this.sourceManager = new SourceManager(this.homeDir, {\n skillManager: this.skillManager,\n promptManager: this.promptManager,\n mcpConfigManager: this.mcpConfigManager,\n workflowManager: this.workflowManager,\n backendManager: getBackendManager(),\n templateRegistry: this.templateRegistry,\n }, { skipDefaultSource: resolvedLauncherMode === \"mock\" });\n\n this.agentInitializer = new AgentInitializer(\n this.templateRegistry,\n this.instancesDir,\n {\n domainManagers: {\n skills: this.skillManager,\n prompts: this.promptManager,\n mcp: this.mcpConfigManager,\n workflows: this.workflowManager,\n },\n stepRegistry: createDefaultStepRegistry(),\n },\n );\n this.acpConnectionManager = new AcpConnectionManager();\n this.sessionRegistry = new SessionRegistry();\n const launcherMode = resolvedLauncherMode;\n this.agentManager = new AgentManager(\n this.agentInitializer,\n createLauncher({ mode: launcherMode }),\n this.instancesDir,\n {\n acpManager: launcherMode !== \"mock\" ? this.acpConnectionManager : undefined,\n instanceRegistry: this.instanceRegistry,\n watcherPollIntervalMs: launcherMode === \"mock\" ? 2_147_483_647 : undefined,\n },\n );\n this.templateWatcher = new TemplateFileWatcher(this.templatesDir, this.templateRegistry);\n this.schedulers = new Map();\n }\n\n async init(): Promise<void> {\n if (this.initialized) return;\n\n await mkdir(this.homeDir, { recursive: true });\n await mkdir(this.instancesDir, { recursive: true });\n\n this.loadProviderRegistry();\n\n await this.instanceRegistry.load();\n const { orphaned, adopted } = await this.instanceRegistry.reconcile();\n if (orphaned.length > 0 || adopted.length > 0) {\n logger.info({ orphaned, adopted }, \"Instance registry reconciled\");\n }\n\n await this.loadDomainComponents();\n this.registerPiBackend();\n await this.sourceManager.initialize();\n\n await this.agentManager.initialize();\n this.templateWatcher.start();\n this.initialized = true;\n this.startTime = Date.now();\n logger.info(\"AppContext initialized\");\n }\n\n get uptime(): number {\n return Math.floor((Date.now() - this.startTime) / 1000);\n }\n\n /**\n * Initialize the provider registry:\n * 1. Register built-in providers\n * 2. Read config.json and register default + extra providers\n */\n private loadProviderRegistry(): void {\n registerBuiltinProviders();\n\n const configFile = join(this.homeDir, \"config.json\");\n let userConfig: UserConfig;\n try {\n userConfig = JSON.parse(readFileSync(configFile, \"utf-8\")) as UserConfig;\n } catch {\n logger.debug(\"No config.json found or failed to parse, using built-in providers only\");\n return;\n }\n\n if (userConfig.provider) {\n const p = userConfig.provider;\n modelProviderRegistry.register({\n type: p.type,\n displayName: p.type,\n protocol: (p.protocol ?? \"custom\") as ModelApiProtocol,\n defaultBaseUrl: p.baseUrl,\n apiKey: p.apiKey,\n });\n modelProviderRegistry.setDefault(p.type);\n logger.info({ type: p.type }, \"Default provider loaded from config.json\");\n }\n\n if (userConfig.providers) {\n for (const p of userConfig.providers) {\n modelProviderRegistry.register({\n type: p.type,\n displayName: p.type,\n protocol: (p.protocol ?? \"custom\") as ModelApiProtocol,\n defaultBaseUrl: p.baseUrl,\n apiKey: p.apiKey,\n });\n logger.debug({ type: p.type }, \"Extra provider loaded from config.json\");\n }\n }\n }\n\n private registerPiBackend(): void {\n const mgr = getBackendManager();\n const existing = mgr.get(\"pi\");\n if (existing) {\n mgr.register({ ...existing, acpOwnsProcess: true, origin: { type: \"builtin\" } });\n } else {\n mgr.register({\n name: \"pi\",\n version: \"1.0.0\",\n description: \"Pi — lightweight in-process AI agent powered by local/cloud LLMs\",\n tags: [\"agent\", \"in-process\", \"llm\"],\n origin: { type: \"builtin\" },\n supportedModes: [\"acp\"],\n acpOwnsProcess: true,\n install: [\n { type: \"manual\", label: \"Included with Actant\", instructions: \"Pi is bundled with Actant — no separate installation required.\" },\n ],\n });\n }\n mgr.registerAcpResolver(\"pi\", () => ({\n command: process.execPath,\n args: [ACP_BRIDGE_PATH],\n }));\n this.agentInitializer.workspaceBuilder.registerBuilder(new PiBuilder());\n registerCommunicator(\"pi\", (backendConfig) => new PiCommunicator(configFromBackend(backendConfig)));\n logger.info(\"Pi backend registered (in-process, acp mode only)\");\n }\n\n private async loadDomainComponents(): Promise<void> {\n const backendManager = getBackendManager();\n const dirs: { manager: { setPersistDir(dir: string): void; loadFromDirectory(dirPath: string): Promise<number> }; sub: string }[] = [\n { manager: this.skillManager, sub: \"skills\" },\n { manager: this.promptManager, sub: \"prompts\" },\n { manager: this.mcpConfigManager, sub: \"mcp\" },\n { manager: this.workflowManager, sub: \"workflows\" },\n { manager: this.pluginManager, sub: \"plugins\" },\n { manager: this.templateRegistry, sub: \"templates\" },\n { manager: backendManager, sub: \"backends\" },\n ];\n\n for (const { manager, sub } of dirs) {\n const dirPath = join(this.configsDir, sub);\n manager.setPersistDir(dirPath);\n try {\n await manager.loadFromDirectory(dirPath);\n } catch {\n logger.debug({ dirPath }, `No ${sub} configs found, skipping`);\n }\n }\n }\n}\n","import { createServer, type Server, type Socket } from \"node:net\";\nimport {\n createLogger,\n ActantError,\n RPC_ERROR_CODES,\n type RpcRequest,\n type RpcResponse,\n} from \"@actant/shared\";\nimport type { HandlerRegistry } from \"../handlers/index\";\nimport type { AppContext } from \"../services/app-context\";\n\nconst logger = createLogger(\"socket-server\");\n\nconst ERROR_CODE_MAP: Record<string, number> = {\n TEMPLATE_NOT_FOUND: RPC_ERROR_CODES.TEMPLATE_NOT_FOUND,\n CONFIG_VALIDATION_ERROR: RPC_ERROR_CODES.CONFIG_VALIDATION,\n AGENT_NOT_FOUND: RPC_ERROR_CODES.AGENT_NOT_FOUND,\n AGENT_ALREADY_RUNNING: RPC_ERROR_CODES.AGENT_ALREADY_RUNNING,\n WORKSPACE_INIT_ERROR: RPC_ERROR_CODES.WORKSPACE_INIT,\n COMPONENT_REFERENCE_ERROR: RPC_ERROR_CODES.COMPONENT_REFERENCE,\n INSTANCE_CORRUPTED: RPC_ERROR_CODES.INSTANCE_CORRUPTED,\n AGENT_LAUNCH_ERROR: RPC_ERROR_CODES.AGENT_LAUNCH,\n AGENT_ALREADY_ATTACHED: RPC_ERROR_CODES.AGENT_ALREADY_ATTACHED,\n AGENT_NOT_ATTACHED: RPC_ERROR_CODES.AGENT_NOT_ATTACHED,\n};\n\nfunction mapErrorCode(err: ActantError): number {\n return ERROR_CODE_MAP[err.code] ?? RPC_ERROR_CODES.GENERIC_BUSINESS;\n}\n\nexport class SocketServer {\n private server: Server | null = null;\n private connections = new Set<Socket>();\n\n constructor(\n private readonly handlers: HandlerRegistry,\n private readonly ctx: AppContext,\n ) {}\n\n listen(socketPath: string): Promise<void> {\n return new Promise((resolve, reject) => {\n this.server = createServer((socket) => this.handleConnection(socket));\n\n this.server.on(\"error\", (err) => {\n logger.error({ error: err }, \"Socket server error\");\n reject(err);\n });\n\n this.server.listen(socketPath, () => {\n logger.info({ socketPath }, \"Socket server listening\");\n resolve();\n });\n });\n }\n\n async close(): Promise<void> {\n for (const conn of this.connections) {\n conn.destroy();\n }\n this.connections.clear();\n\n return new Promise((resolve) => {\n if (!this.server) {\n resolve();\n return;\n }\n this.server.close(() => {\n logger.info(\"Socket server closed\");\n resolve();\n });\n });\n }\n\n private handleConnection(socket: Socket): void {\n this.connections.add(socket);\n let buffer = \"\";\n\n socket.on(\"data\", (chunk) => {\n buffer += chunk.toString();\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n this.processMessage(trimmed, socket);\n }\n });\n\n socket.on(\"close\", () => {\n this.connections.delete(socket);\n });\n\n socket.on(\"error\", (err) => {\n logger.debug({ error: err.message }, \"Client connection error\");\n this.connections.delete(socket);\n });\n }\n\n private processMessage(raw: string, socket: Socket): void {\n let request: RpcRequest;\n\n try {\n request = JSON.parse(raw) as RpcRequest;\n } catch {\n this.sendResponse(socket, {\n jsonrpc: \"2.0\",\n id: 0,\n error: { code: RPC_ERROR_CODES.PARSE_ERROR, message: \"Invalid JSON\" },\n });\n return;\n }\n\n if (!request.jsonrpc || request.jsonrpc !== \"2.0\" || !request.method || request.id == null) {\n this.sendResponse(socket, {\n jsonrpc: \"2.0\",\n id: request.id ?? 0,\n error: { code: RPC_ERROR_CODES.INVALID_REQUEST, message: \"Invalid JSON-RPC 2.0 request\" },\n });\n return;\n }\n\n const handler = this.handlers.get(request.method);\n if (!handler) {\n this.sendResponse(socket, {\n jsonrpc: \"2.0\",\n id: request.id,\n error: { code: RPC_ERROR_CODES.METHOD_NOT_FOUND, message: `Method not found: ${request.method}` },\n });\n return;\n }\n\n handler(request.params ?? {}, this.ctx)\n .then((result) => {\n this.sendResponse(socket, {\n jsonrpc: \"2.0\",\n id: request.id,\n result,\n });\n })\n .catch((err: unknown) => {\n if (err instanceof ActantError) {\n this.sendResponse(socket, {\n jsonrpc: \"2.0\",\n id: request.id,\n error: {\n code: mapErrorCode(err),\n message: err.message,\n data: { errorCode: err.code, context: err.context },\n },\n });\n } else {\n logger.error({ error: err }, \"Unhandled handler error\");\n this.sendResponse(socket, {\n jsonrpc: \"2.0\",\n id: request.id,\n error: { code: RPC_ERROR_CODES.INTERNAL_ERROR, message: err instanceof Error ? err.message : \"Internal error\" },\n });\n }\n });\n }\n\n private sendResponse(socket: Socket, response: RpcResponse): void {\n if (!socket.destroyed) {\n socket.write(JSON.stringify(response) + \"\\n\");\n }\n }\n}\n","import type { AppContext } from \"../services/app-context\";\n\nexport type RpcHandler = (params: Record<string, unknown>, ctx: AppContext) => Promise<unknown>;\n\nexport class HandlerRegistry {\n private handlers = new Map<string, RpcHandler>();\n\n register(method: string, handler: RpcHandler): void {\n this.handlers.set(method, handler);\n }\n\n get(method: string): RpcHandler | undefined {\n return this.handlers.get(method);\n }\n\n has(method: string): boolean {\n return this.handlers.has(method);\n }\n\n methods(): string[] {\n return Array.from(this.handlers.keys());\n }\n}\n","import { resolve } from \"node:path\";\nimport type {\n TemplateListResult,\n TemplateGetParams,\n TemplateGetResult,\n TemplateLoadParams,\n TemplateLoadResult,\n TemplateUnloadParams,\n TemplateUnloadResult,\n TemplateValidateParams,\n TemplateValidateResult,\n} from \"@actant/shared\";\nimport type { AppContext } from \"../services/app-context\";\nimport type { HandlerRegistry } from \"./handler-registry\";\n\nexport function registerTemplateHandlers(registry: HandlerRegistry): void {\n registry.register(\"template.list\", handleTemplateList);\n registry.register(\"template.get\", handleTemplateGet);\n registry.register(\"template.load\", handleTemplateLoad);\n registry.register(\"template.unload\", handleTemplateUnload);\n registry.register(\"template.validate\", handleTemplateValidate);\n}\n\nasync function handleTemplateList(\n _params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<TemplateListResult> {\n return ctx.templateRegistry.list();\n}\n\nasync function handleTemplateGet(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<TemplateGetResult> {\n const { name } = params as unknown as TemplateGetParams;\n return ctx.templateRegistry.getOrThrow(name);\n}\n\nasync function handleTemplateLoad(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<TemplateLoadResult> {\n const { filePath } = params as unknown as TemplateLoadParams;\n const template = await ctx.templateLoader.loadFromFile(resolve(filePath));\n ctx.templateRegistry.register(template);\n await ctx.templateRegistry.persist(template);\n return template;\n}\n\nasync function handleTemplateUnload(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<TemplateUnloadResult> {\n const { name } = params as unknown as TemplateUnloadParams;\n const removed = ctx.templateRegistry.unregister(name);\n return { success: removed };\n}\n\nasync function handleTemplateValidate(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<TemplateValidateResult> {\n const { filePath } = params as unknown as TemplateValidateParams;\n try {\n const template = await ctx.templateLoader.loadFromFile(filePath);\n const { validateTemplate } = await import(\"@actant/core\");\n const deep = validateTemplate(template);\n return {\n valid: true,\n template,\n warnings: deep.warnings.map((w) => ({ path: w.path, message: w.message })),\n };\n } catch (err) {\n const validationErrors = (err as { validationErrors?: Array<{ path: string; message: string }> }).validationErrors;\n return {\n valid: false,\n errors: validationErrors ?? [{ path: \"\", message: err instanceof Error ? err.message : String(err) }],\n };\n }\n}\n","import { join } from \"node:path\";\nimport { readFile } from \"node:fs/promises\";\nimport type {\n AgentCreateParams,\n AgentCreateResult,\n AgentStartParams,\n AgentStartResult,\n AgentStopParams,\n AgentStopResult,\n AgentDestroyParams,\n AgentDestroyResult,\n AgentStatusParams,\n AgentStatusResult,\n AgentListResult,\n AgentAdoptParams,\n AgentAdoptResult,\n AgentResolveParams,\n AgentResolveResult,\n AgentOpenParams,\n AgentOpenResult,\n AgentAttachParams,\n AgentAttachResult,\n AgentDetachParams,\n AgentDetachResult,\n AgentRunParams,\n AgentRunResult,\n AgentPromptParams,\n AgentPromptResult,\n AgentUpdatePermissionsParams,\n AgentUpdatePermissionsResult,\n} from \"@actant/shared\";\nimport { AgentNotFoundError } from \"@actant/shared\";\nimport { resolvePermissionsWithMcp, PermissionAuditLogger } from \"@actant/core\";\nimport { updateInstanceMeta } from \"@actant/core\";\nimport type { AppContext } from \"../services/app-context\";\nimport type { HandlerRegistry } from \"./handler-registry\";\n\nexport function registerAgentHandlers(registry: HandlerRegistry): void {\n registry.register(\"agent.create\", handleAgentCreate);\n registry.register(\"agent.start\", handleAgentStart);\n registry.register(\"agent.stop\", handleAgentStop);\n registry.register(\"agent.destroy\", handleAgentDestroy);\n registry.register(\"agent.status\", handleAgentStatus);\n registry.register(\"agent.list\", handleAgentList);\n registry.register(\"agent.adopt\", handleAgentAdopt);\n registry.register(\"agent.resolve\", handleAgentResolve);\n registry.register(\"agent.open\", handleAgentOpen);\n registry.register(\"agent.attach\", handleAgentAttach);\n registry.register(\"agent.detach\", handleAgentDetach);\n registry.register(\"agent.run\", handleAgentRun);\n registry.register(\"agent.prompt\", handleAgentPrompt);\n registry.register(\"agent.updatePermissions\", handleAgentUpdatePermissions);\n registry.register(\"agent.processLogs\", handleAgentProcessLogs);\n}\n\nasync function handleAgentCreate(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<AgentCreateResult> {\n const { name, template, overrides } = params as unknown as AgentCreateParams;\n return ctx.agentManager.createAgent(name, template, overrides);\n}\n\nasync function handleAgentStart(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<AgentStartResult> {\n const { name } = params as unknown as AgentStartParams;\n await ctx.agentManager.startAgent(name);\n const meta = ctx.agentManager.getAgent(name);\n if (!meta) throw new AgentNotFoundError(name);\n return meta;\n}\n\nasync function handleAgentStop(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<AgentStopResult> {\n const { name } = params as unknown as AgentStopParams;\n await ctx.agentManager.stopAgent(name);\n const meta = ctx.agentManager.getAgent(name);\n if (!meta) throw new AgentNotFoundError(name);\n return meta;\n}\n\nasync function handleAgentDestroy(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<AgentDestroyResult> {\n const { name } = params as unknown as AgentDestroyParams;\n await ctx.agentManager.destroyAgent(name);\n return { success: true };\n}\n\nasync function handleAgentStatus(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<AgentStatusResult> {\n const { name } = params as unknown as AgentStatusParams;\n const meta = ctx.agentManager.getAgent(name);\n if (!meta) throw new AgentNotFoundError(name);\n return meta;\n}\n\nasync function handleAgentList(\n _params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<AgentListResult> {\n return ctx.agentManager.listAgents();\n}\n\nasync function handleAgentAdopt(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<AgentAdoptResult> {\n const { path, rename } = params as unknown as AgentAdoptParams;\n const entry = await ctx.instanceRegistry.adopt(path, rename);\n return {\n name: entry.name,\n template: entry.template,\n workspacePath: entry.workspacePath,\n location: entry.location,\n createdAt: entry.createdAt,\n status: entry.status,\n };\n}\n\nasync function handleAgentResolve(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<AgentResolveResult> {\n const { name, template, overrides } = params as unknown as AgentResolveParams;\n return ctx.agentManager.resolveAgent(name, template, overrides);\n}\n\nasync function handleAgentOpen(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<AgentOpenResult> {\n const { name } = params as unknown as AgentOpenParams;\n return ctx.agentManager.openAgent(name);\n}\n\nasync function handleAgentAttach(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<AgentAttachResult> {\n const { name, pid, metadata } = params as unknown as AgentAttachParams;\n return ctx.agentManager.attachAgent(name, pid, metadata);\n}\n\nasync function handleAgentDetach(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<AgentDetachResult> {\n const { name, cleanup } = params as unknown as AgentDetachParams;\n return ctx.agentManager.detachAgent(name, { cleanup });\n}\n\nasync function handleAgentRun(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<AgentRunResult> {\n const { name, prompt, options } = params as unknown as AgentRunParams;\n return ctx.agentManager.runPrompt(name, prompt, options);\n}\n\nasync function handleAgentPrompt(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<AgentPromptResult> {\n const { name, message, sessionId } = params as unknown as AgentPromptParams;\n const result = await ctx.agentManager.promptAgent(name, message, sessionId);\n return {\n response: result.text,\n sessionId: result.sessionId ?? \"\",\n };\n}\n\nasync function handleAgentUpdatePermissions(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<AgentUpdatePermissionsResult> {\n const { name, permissions } = params as unknown as AgentUpdatePermissionsParams;\n const meta = ctx.agentManager.getAgent(name);\n if (!meta) throw new AgentNotFoundError(name);\n\n const workspaceDir = join(ctx.instancesDir, name);\n\n // Resolve MCP server names from the existing config\n const mcpServers = ctx.mcpConfigManager.list().map((s) => s.name);\n const resolved = resolvePermissionsWithMcp(permissions, mcpServers);\n\n // Update .actant.json\n await updateInstanceMeta(workspaceDir, { effectivePermissions: resolved });\n\n // Update ACP Client enforcer if connected\n ctx.acpConnectionManager.updatePermissionPolicy(name, resolved);\n\n const auditLogger = new PermissionAuditLogger(name);\n auditLogger.logUpdated(\"rpc:agent.updatePermissions\");\n\n return { effectivePermissions: resolved };\n}\n\ninterface AgentProcessLogsParams {\n name: string;\n stream?: \"stdout\" | \"stderr\";\n lines?: number;\n}\n\ninterface AgentProcessLogsResult {\n lines: string[];\n stream: string;\n logDir: string;\n}\n\nasync function handleAgentProcessLogs(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<AgentProcessLogsResult> {\n const { name, stream = \"stdout\", lines = 50 } = params as unknown as AgentProcessLogsParams;\n const meta = ctx.agentManager.getAgent(name);\n if (!meta) throw new AgentNotFoundError(name);\n\n const logDir = join(ctx.instancesDir, name, \"logs\");\n const logFile = join(logDir, `${stream}.log`);\n\n let content: string;\n try {\n content = await readFile(logFile, \"utf-8\");\n } catch {\n return { lines: [], stream, logDir };\n }\n\n const allLines = content.split(\"\\n\").filter(Boolean);\n return {\n lines: allLines.slice(-lines),\n stream,\n logDir,\n };\n}\n","import type {\n SessionCreateParams,\n SessionCreateResult,\n SessionPromptParams,\n SessionPromptResult,\n SessionCancelParams,\n SessionCancelResult,\n SessionCloseParams,\n SessionCloseResult,\n SessionListParams,\n SessionListResult,\n SessionLeaseInfo,\n} from \"@actant/shared\";\nimport { createLogger } from \"@actant/shared\";\nimport type { SessionLease } from \"@actant/core\";\nimport type { AppContext } from \"../services/app-context\";\nimport type { HandlerRegistry } from \"./handler-registry\";\n\nconst logger = createLogger(\"session-handlers\");\n\nexport function registerSessionHandlers(registry: HandlerRegistry): void {\n registry.register(\"session.create\", handleSessionCreate);\n registry.register(\"session.prompt\", handleSessionPrompt);\n registry.register(\"session.cancel\", handleSessionCancel);\n registry.register(\"session.close\", handleSessionClose);\n registry.register(\"session.list\", handleSessionList);\n}\n\nasync function handleSessionCreate(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<SessionCreateResult> {\n const { agentName, clientId, idleTtlMs } = params as unknown as SessionCreateParams;\n\n if (!agentName || typeof agentName !== 'string') {\n throw new Error('Required parameter \"agentName\" is missing or invalid');\n }\n if (!clientId || typeof clientId !== 'string') {\n throw new Error('Required parameter \"clientId\" is missing or invalid');\n }\n\n const meta = ctx.agentManager.getAgent(agentName);\n if (!meta) {\n throw new Error(`Agent \"${agentName}\" not found`);\n }\n if (meta.status !== \"running\") {\n throw new Error(`Agent \"${agentName}\" is not running (status: ${meta.status}). Start it with: actant agent start ${agentName}`);\n }\n if (!ctx.agentManager.hasAcpConnection(agentName)) {\n throw new Error(`Agent \"${agentName}\" has no ACP connection`);\n }\n\n const lease = ctx.sessionRegistry.create({ agentName, clientId, idleTtlMs });\n\n logger.info({ sessionId: lease.sessionId, agentName, clientId }, \"Session lease created\");\n return toLeaseInfo(lease);\n}\n\nasync function handleSessionPrompt(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<SessionPromptResult> {\n const { sessionId, text } = params as unknown as SessionPromptParams;\n\n if (!sessionId || typeof sessionId !== 'string') {\n throw new Error('Required parameter \"sessionId\" is missing or invalid');\n }\n if (!text || typeof text !== 'string') {\n throw new Error('Required parameter \"text\" is missing or invalid');\n }\n\n const lease = ctx.sessionRegistry.get(sessionId);\n if (!lease) {\n throw new Error(`Session \"${sessionId}\" not found`);\n }\n if (lease.state === \"expired\") {\n throw new Error(`Session \"${sessionId}\" has expired`);\n }\n\n ctx.sessionRegistry.touch(sessionId);\n\n const result = await ctx.agentManager.promptAgent(\n lease.agentName,\n text,\n );\n\n ctx.sessionRegistry.touch(sessionId);\n\n return {\n stopReason: \"end_turn\",\n text: result.text,\n };\n}\n\nasync function handleSessionCancel(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<SessionCancelResult> {\n const { sessionId } = params as unknown as SessionCancelParams;\n\n if (!sessionId || typeof sessionId !== 'string') {\n throw new Error('Required parameter \"sessionId\" is missing or invalid');\n }\n\n const lease = ctx.sessionRegistry.get(sessionId);\n if (!lease) {\n throw new Error(`Session \"${sessionId}\" not found`);\n }\n\n const conn = ctx.acpConnectionManager.getConnection(lease.agentName);\n if (!conn) {\n throw new Error(`Agent \"${lease.agentName}\" has no ACP connection`);\n }\n\n // Use the Agent's primary ACP session ID, not the lease session ID\n const acpSessionId = ctx.acpConnectionManager.getPrimarySessionId(lease.agentName);\n if (!acpSessionId) {\n throw new Error(`Agent \"${lease.agentName}\" has no primary ACP session`);\n }\n\n try {\n await conn.cancel(acpSessionId);\n logger.info({ sessionId, acpSessionId, agentName: lease.agentName }, \"Session cancel sent to ACP\");\n } catch (err) {\n logger.error({ sessionId, error: err }, \"Failed to cancel ACP session\");\n throw new Error(`Failed to cancel session: ${err instanceof Error ? err.message : String(err)}`, { cause: err });\n }\n\n return { ok: true };\n}\n\nasync function handleSessionClose(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<SessionCloseResult> {\n const { sessionId } = params as unknown as SessionCloseParams;\n\n if (!sessionId || typeof sessionId !== 'string') {\n throw new Error('Required parameter \"sessionId\" is missing or invalid');\n }\n\n const closed = ctx.sessionRegistry.close(sessionId);\n if (!closed) {\n throw new Error(`Session \"${sessionId}\" not found`);\n }\n\n return { ok: true };\n}\n\nasync function handleSessionList(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<SessionListResult> {\n const { agentName } = params as unknown as SessionListParams;\n return ctx.sessionRegistry.list(agentName).map(toLeaseInfo);\n}\n\nfunction toLeaseInfo(lease: SessionLease): SessionLeaseInfo {\n return {\n sessionId: lease.sessionId,\n agentName: lease.agentName,\n clientId: lease.clientId,\n state: lease.state,\n createdAt: lease.createdAt,\n lastActivityAt: lease.lastActivityAt,\n idleTtlMs: lease.idleTtlMs,\n };\n}\n","import { ConfigNotFoundError } from \"@actant/shared\";\nimport type {\n SkillGetParams,\n PromptGetParams,\n McpGetParams,\n WorkflowGetParams,\n PluginGetParams,\n PluginDefinition,\n ComponentAddParams,\n ComponentUpdateParams,\n ComponentRemoveParams,\n ComponentImportParams,\n ComponentExportParams,\n SkillDefinition,\n PromptDefinition,\n McpServerDefinition,\n WorkflowDefinition,\n} from \"@actant/shared\";\nimport type { BaseComponentManager, NamedComponent } from \"@actant/core\";\nimport type { AppContext } from \"../services/app-context\";\nimport type { HandlerRegistry, RpcHandler } from \"./handler-registry\";\n\n// ---------------------------------------------------------------------------\n// Generic CRUD handler factory\n// ---------------------------------------------------------------------------\n\ninterface CrudHandlers {\n add: RpcHandler;\n update: RpcHandler;\n remove: RpcHandler;\n import: RpcHandler;\n export: RpcHandler;\n}\n\nfunction createCrudHandlers<T extends NamedComponent>(\n getManager: (ctx: AppContext) => BaseComponentManager<T>,\n): CrudHandlers {\n return {\n add: async (params: Record<string, unknown>, ctx: AppContext) => {\n const { component } = params as unknown as ComponentAddParams;\n const mgr = getManager(ctx);\n await mgr.add(component as T, true);\n return { name: (component as { name: string }).name };\n },\n update: async (params: Record<string, unknown>, ctx: AppContext) => {\n const { name, patch } = params as unknown as ComponentUpdateParams;\n const result = await getManager(ctx).update(name, patch as Partial<T>, true);\n return { name: result.name };\n },\n remove: async (params: Record<string, unknown>, ctx: AppContext) => {\n const { name } = params as unknown as ComponentRemoveParams;\n const success = await getManager(ctx).remove(name, true);\n return { success };\n },\n import: async (params: Record<string, unknown>, ctx: AppContext) => {\n const { filePath } = params as unknown as ComponentImportParams;\n const result = await getManager(ctx).importFromFile(filePath);\n return { name: result.name };\n },\n export: async (params: Record<string, unknown>, ctx: AppContext) => {\n const { name, filePath } = params as unknown as ComponentExportParams;\n await getManager(ctx).exportToFile(name, filePath);\n return { success: true };\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Registration\n// ---------------------------------------------------------------------------\n\nexport function registerDomainHandlers(registry: HandlerRegistry): void {\n registry.register(\"skill.list\", handleSkillList);\n registry.register(\"skill.get\", handleSkillGet);\n registry.register(\"prompt.list\", handlePromptList);\n registry.register(\"prompt.get\", handlePromptGet);\n registry.register(\"mcp.list\", handleMcpList);\n registry.register(\"mcp.get\", handleMcpGet);\n registry.register(\"workflow.list\", handleWorkflowList);\n registry.register(\"workflow.get\", handleWorkflowGet);\n registry.register(\"plugin.list\", handlePluginList);\n registry.register(\"plugin.get\", handlePluginGet);\n\n const skillCrud = createCrudHandlers<SkillDefinition>((ctx) => ctx.skillManager);\n const promptCrud = createCrudHandlers<PromptDefinition>((ctx) => ctx.promptManager);\n const mcpCrud = createCrudHandlers<McpServerDefinition>((ctx) => ctx.mcpConfigManager);\n const workflowCrud = createCrudHandlers<WorkflowDefinition>((ctx) => ctx.workflowManager);\n const pluginCrud = createCrudHandlers<PluginDefinition>((ctx) => ctx.pluginManager);\n\n const crudSets = [\n { prefix: \"skill\", crud: skillCrud },\n { prefix: \"prompt\", crud: promptCrud },\n { prefix: \"mcp\", crud: mcpCrud },\n { prefix: \"workflow\", crud: workflowCrud },\n { prefix: \"plugin\", crud: pluginCrud },\n ];\n\n for (const { prefix, crud } of crudSets) {\n registry.register(`${prefix}.add`, crud.add);\n registry.register(`${prefix}.update`, crud.update);\n registry.register(`${prefix}.remove`, crud.remove);\n registry.register(`${prefix}.import`, crud.import);\n registry.register(`${prefix}.export`, crud.export);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Existing read-only handlers (preserved)\n// ---------------------------------------------------------------------------\n\nasync function handleSkillList(\n _params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<SkillDefinition[]> {\n return ctx.skillManager.list();\n}\n\nasync function handleSkillGet(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<SkillDefinition> {\n const { name } = params as unknown as SkillGetParams;\n const skill = ctx.skillManager.get(name);\n if (!skill) {\n throw new ConfigNotFoundError(`Skill \"${name}\" not found`);\n }\n return skill;\n}\n\nasync function handlePromptList(\n _params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<PromptDefinition[]> {\n return ctx.promptManager.list();\n}\n\nasync function handlePromptGet(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<PromptDefinition> {\n const { name } = params as unknown as PromptGetParams;\n const prompt = ctx.promptManager.get(name);\n if (!prompt) {\n throw new ConfigNotFoundError(`Prompt \"${name}\" not found`);\n }\n return prompt;\n}\n\nasync function handleMcpList(\n _params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<McpServerDefinition[]> {\n return ctx.mcpConfigManager.list();\n}\n\nasync function handleMcpGet(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<McpServerDefinition> {\n const { name } = params as unknown as McpGetParams;\n const mcp = ctx.mcpConfigManager.get(name);\n if (!mcp) {\n throw new ConfigNotFoundError(`MCP server \"${name}\" not found`);\n }\n return mcp;\n}\n\nasync function handleWorkflowList(\n _params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<WorkflowDefinition[]> {\n return ctx.workflowManager.list();\n}\n\nasync function handleWorkflowGet(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<WorkflowDefinition> {\n const { name } = params as unknown as WorkflowGetParams;\n const workflow = ctx.workflowManager.get(name);\n if (!workflow) {\n throw new ConfigNotFoundError(`Workflow \"${name}\" not found`);\n }\n return workflow;\n}\n\nasync function handlePluginList(\n _params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<PluginDefinition[]> {\n return ctx.pluginManager.list();\n}\n\nasync function handlePluginGet(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<PluginDefinition> {\n const { name } = params as unknown as PluginGetParams;\n const plugin = ctx.pluginManager.get(name);\n if (!plugin) {\n throw new ConfigNotFoundError(`Plugin \"${name}\" not found`);\n }\n return plugin;\n}\n","import type {\n SourceAddParams,\n SourceRemoveParams,\n SourceSyncParams,\n SourceValidateParams,\n SourceValidateResult,\n SourceEntry,\n} from \"@actant/shared\";\nimport { SourceValidator } from \"@actant/core\";\nimport type { AppContext } from \"../services/app-context\";\nimport type { HandlerRegistry } from \"./handler-registry\";\n\nexport function registerSourceHandlers(registry: HandlerRegistry): void {\n registry.register(\"source.list\", handleSourceList);\n registry.register(\"source.add\", handleSourceAdd);\n registry.register(\"source.remove\", handleSourceRemove);\n registry.register(\"source.sync\", handleSourceSync);\n registry.register(\"source.validate\", handleSourceValidate);\n}\n\nasync function handleSourceList(\n _params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<SourceEntry[]> {\n return ctx.sourceManager.listSources();\n}\n\nasync function handleSourceAdd(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<{ name: string; components: Record<string, number> }> {\n const { name, config } = params as unknown as SourceAddParams;\n const result = await ctx.sourceManager.addSource(name, config);\n return {\n name,\n components: {\n skills: result.skills.length,\n prompts: result.prompts.length,\n mcp: result.mcpServers.length,\n workflows: result.workflows.length,\n presets: result.presets.length,\n },\n };\n}\n\nasync function handleSourceRemove(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<{ success: boolean }> {\n const { name } = params as unknown as SourceRemoveParams;\n const success = await ctx.sourceManager.removeSource(name);\n return { success };\n}\n\nasync function handleSourceSync(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<{ synced: string[]; report?: { addedCount: number; updatedCount: number; removedCount: number; hasBreakingChanges: boolean } }> {\n const { name } = params as unknown as SourceSyncParams;\n if (name) {\n const { report } = await ctx.sourceManager.syncSourceWithReport(name);\n return {\n synced: [name],\n report: {\n addedCount: report.added.length,\n updatedCount: report.updated.length,\n removedCount: report.removed.length,\n hasBreakingChanges: report.hasBreakingChanges,\n },\n };\n }\n const { report } = await ctx.sourceManager.syncAllWithReport();\n return {\n synced: ctx.sourceManager.listSources().map((s) => s.name),\n report: {\n addedCount: report.added.length,\n updatedCount: report.updated.length,\n removedCount: report.removed.length,\n hasBreakingChanges: report.hasBreakingChanges,\n },\n };\n}\n\nasync function handleSourceValidate(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<SourceValidateResult> {\n const { name, path, strict, compat } = params as unknown as SourceValidateParams;\n\n let rootDir: string;\n if (path) {\n rootDir = path;\n } else if (name) {\n rootDir = ctx.sourceManager.getSourceRootDir(name);\n } else {\n throw new Error(\"Either 'name' or 'path' parameter is required\");\n }\n\n const validator = new SourceValidator();\n return validator.validate(rootDir, {\n strict,\n compat: compat as \"agent-skills\" | undefined,\n });\n}\n","import { ConfigNotFoundError } from \"@actant/shared\";\nimport type {\n PresetListParams,\n PresetShowParams,\n PresetApplyParams,\n PresetDefinition,\n AgentTemplate,\n} from \"@actant/shared\";\nimport type { AppContext } from \"../services/app-context\";\nimport type { HandlerRegistry } from \"./handler-registry\";\n\nexport function registerPresetHandlers(registry: HandlerRegistry): void {\n registry.register(\"preset.list\", handlePresetList);\n registry.register(\"preset.show\", handlePresetShow);\n registry.register(\"preset.apply\", handlePresetApply);\n}\n\nasync function handlePresetList(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<PresetDefinition[]> {\n const { packageName } = params as unknown as PresetListParams;\n return ctx.sourceManager.listPresets(packageName);\n}\n\nasync function handlePresetShow(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<PresetDefinition> {\n const { qualifiedName } = params as unknown as PresetShowParams;\n const preset = ctx.sourceManager.getPreset(qualifiedName);\n if (!preset) {\n throw new ConfigNotFoundError(`Preset \"${qualifiedName}\" not found`);\n }\n return preset;\n}\n\nasync function handlePresetApply(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<AgentTemplate> {\n const { qualifiedName, templateName } = params as unknown as PresetApplyParams;\n const template = ctx.templateRegistry.get(templateName);\n if (!template) {\n throw new ConfigNotFoundError(`Template \"${templateName}\" not found`);\n }\n return ctx.sourceManager.applyPreset(qualifiedName, template);\n}\n","import type {\n DaemonPingResult,\n DaemonShutdownResult,\n} from \"@actant/shared\";\nimport type { AppContext } from \"../services/app-context\";\nimport type { HandlerRegistry } from \"./handler-registry\";\n\nexport function registerDaemonHandlers(\n registry: HandlerRegistry,\n shutdownFn: () => Promise<void>,\n): void {\n registry.register(\"daemon.ping\", async (_params, ctx) => handleDaemonPing(ctx));\n registry.register(\"daemon.shutdown\", async () => handleDaemonShutdown(shutdownFn));\n}\n\nasync function handleDaemonPing(ctx: AppContext): Promise<DaemonPingResult> {\n return {\n version: \"0.1.0\",\n uptime: ctx.uptime,\n agents: ctx.agentManager.size,\n };\n}\n\nasync function handleDaemonShutdown(\n shutdownFn: () => Promise<void>,\n): Promise<DaemonShutdownResult> {\n setImmediate(() => shutdownFn());\n return { success: true };\n}\n","import { randomUUID } from \"node:crypto\";\nimport type {\n ProxyConnectParams,\n ProxyConnectResult,\n ProxyDisconnectParams,\n ProxyDisconnectResult,\n ProxyForwardParams,\n ProxyForwardResult,\n ProxySession,\n} from \"@actant/shared\";\nimport { createLogger } from \"@actant/shared\";\nimport type { AppContext } from \"../services/app-context\";\nimport type { HandlerRegistry } from \"./handler-registry\";\n\nconst logger = createLogger(\"proxy-handlers\");\n\nconst proxySessions = new Map<string, ProxySession>();\n\n/**\n * @deprecated Legacy RPC-relay proxy handlers. Retained for backward compatibility.\n * New proxy connections should use Direct Bridge mode (CLI spawns agent directly)\n * or Session Lease mode (session.* RPC methods). See issue #35.\n */\nexport function registerProxyHandlers(registry: HandlerRegistry): void {\n registry.register(\"proxy.connect\", handleProxyConnect);\n registry.register(\"proxy.disconnect\", handleProxyDisconnect);\n registry.register(\"proxy.forward\", handleProxyForward);\n}\n\nasync function handleProxyConnect(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<ProxyConnectResult> {\n const { agentName, envPassthrough } = params as unknown as ProxyConnectParams;\n\n const meta = ctx.agentManager.getAgent(agentName);\n if (!meta) {\n throw new Error(`Agent \"${agentName}\" not found`);\n }\n\n if (meta.status !== \"running\") {\n throw new Error(`Agent \"${agentName}\" is not running (status: ${meta.status})`);\n }\n\n if (!ctx.agentManager.hasAcpConnection(agentName)) {\n throw new Error(`Agent \"${agentName}\" has no ACP connection`);\n }\n\n const sessionId = randomUUID();\n const session: ProxySession = {\n sessionId,\n agentName,\n envPassthrough: envPassthrough ?? false,\n connectedAt: new Date().toISOString(),\n };\n proxySessions.set(sessionId, session);\n\n logger.info({ sessionId, agentName, envPassthrough }, \"Proxy session connected\");\n return session;\n}\n\nasync function handleProxyDisconnect(\n params: Record<string, unknown>,\n _ctx: AppContext,\n): Promise<ProxyDisconnectResult> {\n const { sessionId } = params as unknown as ProxyDisconnectParams;\n\n const session = proxySessions.get(sessionId);\n if (!session) {\n throw new Error(`Proxy session \"${sessionId}\" not found`);\n }\n\n proxySessions.delete(sessionId);\n logger.info({ sessionId, agentName: session.agentName }, \"Proxy session disconnected\");\n return { ok: true };\n}\n\nasync function handleProxyForward(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<ProxyForwardResult> {\n const { sessionId, acpMessage } = params as unknown as ProxyForwardParams;\n\n const session = proxySessions.get(sessionId);\n if (!session) {\n throw new Error(`Proxy session \"${sessionId}\" not found`);\n }\n\n const method = acpMessage[\"method\"] as string | undefined;\n if (!method) {\n throw new Error(\"ACP message missing 'method' field\");\n }\n\n const acpParams = (acpMessage[\"params\"] ?? {}) as Record<string, unknown>;\n\n switch (method) {\n case \"session/prompt\": {\n const prompt = acpParams[\"prompt\"] as Array<{ type: string; text?: string }> | undefined;\n const text = prompt?.find((p) => p.type === \"text\")?.text ?? \"\";\n const result = await ctx.agentManager.promptAgent(session.agentName, text);\n return { result: { stopReason: \"end_turn\", text: result.text } };\n }\n case \"session/cancel\": {\n return { result: { ok: true } };\n }\n default:\n throw new Error(`Unsupported ACP method: ${method}`);\n }\n}\n","import type {\n AgentDispatchParams,\n AgentDispatchResult,\n AgentTasksParams,\n AgentTasksResult,\n AgentLogsParams,\n AgentLogsResult,\n ScheduleListParams,\n ScheduleListResult,\n} from \"@actant/shared\";\nimport type { AppContext } from \"../services/app-context\";\nimport type { HandlerRegistry } from \"./handler-registry\";\n\nexport function registerScheduleHandlers(registry: HandlerRegistry): void {\n registry.register(\"agent.dispatch\", handleAgentDispatch);\n registry.register(\"agent.tasks\", handleAgentTasks);\n registry.register(\"agent.logs\", handleAgentLogs);\n registry.register(\"schedule.list\", handleScheduleList);\n}\n\nasync function handleAgentDispatch(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<AgentDispatchResult> {\n const { name, prompt, priority } = params as unknown as AgentDispatchParams;\n const scheduler = ctx.schedulers.get(name);\n if (!scheduler) {\n return { queued: false };\n }\n const p = (priority ?? \"normal\") as \"low\" | \"normal\" | \"high\" | \"critical\";\n scheduler.dispatch(prompt, p);\n return { queued: true };\n}\n\nasync function handleAgentTasks(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<AgentTasksResult> {\n const { name } = params as unknown as AgentTasksParams;\n const scheduler = ctx.schedulers.get(name);\n if (!scheduler) {\n return { queued: 0, processing: false, tasks: [] };\n }\n return scheduler.getTasks();\n}\n\nasync function handleAgentLogs(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<AgentLogsResult> {\n const { name, limit } = params as unknown as AgentLogsParams;\n const scheduler = ctx.schedulers.get(name);\n if (!scheduler) {\n return [];\n }\n return scheduler.getLogs(limit);\n}\n\nasync function handleScheduleList(\n params: Record<string, unknown>,\n ctx: AppContext,\n): Promise<ScheduleListResult> {\n const { name } = params as unknown as ScheduleListParams;\n const scheduler = ctx.schedulers.get(name);\n if (!scheduler) {\n return { sources: [], running: false };\n }\n return {\n sources: scheduler.getSources(),\n running: scheduler.running,\n };\n}\n","import { writeFile, readFile, unlink } from \"node:fs/promises\";\n\nexport async function writePidFile(path: string): Promise<void> {\n await writeFile(path, String(process.pid), \"utf-8\");\n}\n\nexport async function readPidFile(path: string): Promise<number | null> {\n try {\n const content = await readFile(path, \"utf-8\");\n const pid = parseInt(content.trim(), 10);\n return Number.isNaN(pid) ? null : pid;\n } catch {\n return null;\n }\n}\n\nexport async function removePidFile(path: string): Promise<void> {\n try {\n await unlink(path);\n } catch {\n // file may not exist\n }\n}\n\nexport function isProcessRunning(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n"],"mappings":"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","names":["unlink","createLogger","createLogger","logger","resolve","join","createLogger","logger","report","ConfigNotFoundError","createLogger","logger","readFile","logger","createLogger","unlink"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@actant/api",
3
- "version": "0.2.1",
3
+ "version": "0.2.2",
4
4
  "description": "High-level API for the Actant AI agent platform",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -32,10 +32,10 @@
32
32
  }
33
33
  },
34
34
  "dependencies": {
35
- "@actant/acp": "0.2.1",
36
- "@actant/core": "0.2.1",
37
- "@actant/pi": "0.2.1",
38
- "@actant/shared": "0.2.1"
35
+ "@actant/core": "0.2.2",
36
+ "@actant/pi": "0.2.2",
37
+ "@actant/shared": "0.2.2",
38
+ "@actant/acp": "0.2.2"
39
39
  },
40
40
  "scripts": {
41
41
  "build": "tsup",