@actant/api 0.1.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.
@@ -0,0 +1,72 @@
1
+ import { LauncherMode, InstanceRegistry, TemplateLoader, TemplateRegistry, SkillManager, PromptManager, McpConfigManager, WorkflowManager, PluginManager, AgentInitializer, AgentManager, SessionRegistry, SourceManager, TemplateFileWatcher, EmployeeScheduler } from '@actant/core';
2
+ import { AcpConnectionManager } from '@actant/acp';
3
+
4
+ interface AppConfig {
5
+ homeDir?: string;
6
+ /** Override configs directory. Default: `{homeDir}/configs/` or `./configs/` fallback. */
7
+ configsDir?: string;
8
+ /** "mock" for testing, "real" for production. Default: auto-detect from ACTANT_LAUNCHER_MODE env. */
9
+ launcherMode?: LauncherMode;
10
+ }
11
+ declare class AppContext {
12
+ readonly homeDir: string;
13
+ readonly configsDir: string;
14
+ readonly sourcesDir: string;
15
+ readonly templatesDir: string;
16
+ readonly instancesDir: string;
17
+ readonly registryPath: string;
18
+ readonly builtinInstancesDir: string;
19
+ readonly socketPath: string;
20
+ readonly pidFilePath: string;
21
+ readonly instanceRegistry: InstanceRegistry;
22
+ readonly templateLoader: TemplateLoader;
23
+ readonly templateRegistry: TemplateRegistry;
24
+ readonly skillManager: SkillManager;
25
+ readonly promptManager: PromptManager;
26
+ readonly mcpConfigManager: McpConfigManager;
27
+ readonly workflowManager: WorkflowManager;
28
+ readonly pluginManager: PluginManager;
29
+ readonly agentInitializer: AgentInitializer;
30
+ readonly acpConnectionManager: AcpConnectionManager;
31
+ readonly agentManager: AgentManager;
32
+ readonly sessionRegistry: SessionRegistry;
33
+ readonly sourceManager: SourceManager;
34
+ readonly templateWatcher: TemplateFileWatcher;
35
+ readonly schedulers: Map<string, EmployeeScheduler>;
36
+ private initialized;
37
+ private startTime;
38
+ constructor(config?: AppConfig);
39
+ init(): Promise<void>;
40
+ get uptime(): number;
41
+ private loadDomainComponents;
42
+ }
43
+
44
+ declare class Daemon {
45
+ private ctx;
46
+ private server;
47
+ private handlers;
48
+ private running;
49
+ constructor(config?: AppConfig);
50
+ get socketPath(): string;
51
+ get appContext(): AppContext;
52
+ start(): Promise<void>;
53
+ stop(): Promise<void>;
54
+ get isRunning(): boolean;
55
+ }
56
+
57
+ type RpcHandler = (params: Record<string, unknown>, ctx: AppContext) => Promise<unknown>;
58
+ declare class HandlerRegistry {
59
+ private handlers;
60
+ register(method: string, handler: RpcHandler): void;
61
+ get(method: string): RpcHandler | undefined;
62
+ has(method: string): boolean;
63
+ methods(): string[];
64
+ }
65
+
66
+ declare function registerTemplateHandlers(registry: HandlerRegistry): void;
67
+
68
+ declare function registerAgentHandlers(registry: HandlerRegistry): void;
69
+
70
+ declare function registerDaemonHandlers(registry: HandlerRegistry, shutdownFn: () => Promise<void>): void;
71
+
72
+ export { type AppConfig, AppContext, Daemon, HandlerRegistry, registerAgentHandlers, registerDaemonHandlers, registerTemplateHandlers };
package/dist/index.js ADDED
@@ -0,0 +1,1037 @@
1
+ // src/daemon/daemon.ts
2
+ import { unlink as unlink2 } from "fs/promises";
3
+ import { createLogger as createLogger5, ipcRequiresFileCleanup } from "@actant/shared";
4
+
5
+ // src/services/app-context.ts
6
+ import { join } from "path";
7
+ import { homedir } from "os";
8
+ import { mkdir } from "fs/promises";
9
+ import {
10
+ TemplateRegistry,
11
+ TemplateLoader,
12
+ TemplateFileWatcher,
13
+ AgentInitializer,
14
+ AgentManager,
15
+ SessionRegistry,
16
+ SkillManager,
17
+ PromptManager,
18
+ McpConfigManager,
19
+ WorkflowManager,
20
+ PluginManager,
21
+ SourceManager,
22
+ createLauncher,
23
+ InstanceRegistry,
24
+ createDefaultStepRegistry
25
+ } from "@actant/core";
26
+ import { AcpConnectionManager } from "@actant/acp";
27
+ import { createLogger, getIpcPath } from "@actant/shared";
28
+ var logger = createLogger("app-context");
29
+ var DEFAULT_HOME = join(homedir(), ".actant");
30
+ var AppContext = class {
31
+ homeDir;
32
+ configsDir;
33
+ sourcesDir;
34
+ templatesDir;
35
+ instancesDir;
36
+ registryPath;
37
+ builtinInstancesDir;
38
+ socketPath;
39
+ pidFilePath;
40
+ instanceRegistry;
41
+ templateLoader;
42
+ templateRegistry;
43
+ skillManager;
44
+ promptManager;
45
+ mcpConfigManager;
46
+ workflowManager;
47
+ pluginManager;
48
+ agentInitializer;
49
+ acpConnectionManager;
50
+ agentManager;
51
+ sessionRegistry;
52
+ sourceManager;
53
+ templateWatcher;
54
+ schedulers;
55
+ initialized = false;
56
+ startTime = Date.now();
57
+ constructor(config) {
58
+ this.homeDir = config?.homeDir ?? process.env.ACTANT_HOME ?? DEFAULT_HOME;
59
+ this.configsDir = config?.configsDir ?? join(this.homeDir, "configs");
60
+ this.sourcesDir = join(this.homeDir, "sources");
61
+ this.templatesDir = join(this.configsDir, "templates");
62
+ this.instancesDir = join(this.homeDir, "instances");
63
+ this.registryPath = join(this.homeDir, "instances", "registry.json");
64
+ this.builtinInstancesDir = join(this.homeDir, "instances");
65
+ this.socketPath = getIpcPath(this.homeDir);
66
+ this.pidFilePath = join(this.homeDir, "daemon.pid");
67
+ this.instanceRegistry = new InstanceRegistry(this.registryPath, this.builtinInstancesDir);
68
+ this.templateLoader = new TemplateLoader();
69
+ this.templateRegistry = new TemplateRegistry({ allowOverwrite: true });
70
+ this.skillManager = new SkillManager();
71
+ this.promptManager = new PromptManager();
72
+ this.mcpConfigManager = new McpConfigManager();
73
+ this.workflowManager = new WorkflowManager();
74
+ this.pluginManager = new PluginManager();
75
+ this.sourceManager = new SourceManager(this.homeDir, {
76
+ skillManager: this.skillManager,
77
+ promptManager: this.promptManager,
78
+ mcpConfigManager: this.mcpConfigManager,
79
+ workflowManager: this.workflowManager,
80
+ templateRegistry: this.templateRegistry
81
+ });
82
+ this.agentInitializer = new AgentInitializer(
83
+ this.templateRegistry,
84
+ this.instancesDir,
85
+ {
86
+ domainManagers: {
87
+ skills: this.skillManager,
88
+ prompts: this.promptManager,
89
+ mcp: this.mcpConfigManager,
90
+ workflows: this.workflowManager
91
+ },
92
+ stepRegistry: createDefaultStepRegistry()
93
+ }
94
+ );
95
+ this.acpConnectionManager = new AcpConnectionManager();
96
+ this.sessionRegistry = new SessionRegistry();
97
+ const launcherMode = config?.launcherMode ?? process.env["ACTANT_LAUNCHER_MODE"];
98
+ this.agentManager = new AgentManager(
99
+ this.agentInitializer,
100
+ createLauncher({ mode: launcherMode }),
101
+ this.instancesDir,
102
+ {
103
+ acpManager: launcherMode !== "mock" ? this.acpConnectionManager : void 0,
104
+ instanceRegistry: this.instanceRegistry
105
+ }
106
+ );
107
+ this.templateWatcher = new TemplateFileWatcher(this.templatesDir, this.templateRegistry);
108
+ this.schedulers = /* @__PURE__ */ new Map();
109
+ }
110
+ async init() {
111
+ if (this.initialized) return;
112
+ await mkdir(this.homeDir, { recursive: true });
113
+ await mkdir(this.instancesDir, { recursive: true });
114
+ await this.instanceRegistry.load();
115
+ const { orphaned, adopted } = await this.instanceRegistry.reconcile();
116
+ if (orphaned.length > 0 || adopted.length > 0) {
117
+ logger.info({ orphaned, adopted }, "Instance registry reconciled");
118
+ }
119
+ await this.loadDomainComponents();
120
+ await this.sourceManager.initialize();
121
+ await this.agentManager.initialize();
122
+ this.templateWatcher.start();
123
+ this.initialized = true;
124
+ this.startTime = Date.now();
125
+ logger.info("AppContext initialized");
126
+ }
127
+ get uptime() {
128
+ return Math.floor((Date.now() - this.startTime) / 1e3);
129
+ }
130
+ async loadDomainComponents() {
131
+ const dirs = [
132
+ { manager: this.skillManager, sub: "skills" },
133
+ { manager: this.promptManager, sub: "prompts" },
134
+ { manager: this.mcpConfigManager, sub: "mcp" },
135
+ { manager: this.workflowManager, sub: "workflows" },
136
+ { manager: this.pluginManager, sub: "plugins" },
137
+ { manager: this.templateRegistry, sub: "templates" }
138
+ ];
139
+ for (const { manager, sub } of dirs) {
140
+ const dirPath = join(this.configsDir, sub);
141
+ manager.setPersistDir(dirPath);
142
+ try {
143
+ await manager.loadFromDirectory(dirPath);
144
+ } catch {
145
+ logger.debug({ dirPath }, `No ${sub} configs found, skipping`);
146
+ }
147
+ }
148
+ }
149
+ };
150
+
151
+ // src/daemon/socket-server.ts
152
+ import { createServer } from "net";
153
+ import {
154
+ createLogger as createLogger2,
155
+ ActantError,
156
+ RPC_ERROR_CODES
157
+ } from "@actant/shared";
158
+ var logger2 = createLogger2("socket-server");
159
+ var ERROR_CODE_MAP = {
160
+ TEMPLATE_NOT_FOUND: RPC_ERROR_CODES.TEMPLATE_NOT_FOUND,
161
+ CONFIG_VALIDATION_ERROR: RPC_ERROR_CODES.CONFIG_VALIDATION,
162
+ AGENT_NOT_FOUND: RPC_ERROR_CODES.AGENT_NOT_FOUND,
163
+ AGENT_ALREADY_RUNNING: RPC_ERROR_CODES.AGENT_ALREADY_RUNNING,
164
+ WORKSPACE_INIT_ERROR: RPC_ERROR_CODES.WORKSPACE_INIT,
165
+ COMPONENT_REFERENCE_ERROR: RPC_ERROR_CODES.COMPONENT_REFERENCE,
166
+ INSTANCE_CORRUPTED: RPC_ERROR_CODES.INSTANCE_CORRUPTED,
167
+ AGENT_LAUNCH_ERROR: RPC_ERROR_CODES.AGENT_LAUNCH,
168
+ AGENT_ALREADY_ATTACHED: RPC_ERROR_CODES.AGENT_ALREADY_ATTACHED,
169
+ AGENT_NOT_ATTACHED: RPC_ERROR_CODES.AGENT_NOT_ATTACHED
170
+ };
171
+ function mapErrorCode(err) {
172
+ return ERROR_CODE_MAP[err.code] ?? RPC_ERROR_CODES.GENERIC_BUSINESS;
173
+ }
174
+ var SocketServer = class {
175
+ constructor(handlers, ctx) {
176
+ this.handlers = handlers;
177
+ this.ctx = ctx;
178
+ }
179
+ server = null;
180
+ connections = /* @__PURE__ */ new Set();
181
+ listen(socketPath) {
182
+ return new Promise((resolve2, reject) => {
183
+ this.server = createServer((socket) => this.handleConnection(socket));
184
+ this.server.on("error", (err) => {
185
+ logger2.error({ error: err }, "Socket server error");
186
+ reject(err);
187
+ });
188
+ this.server.listen(socketPath, () => {
189
+ logger2.info({ socketPath }, "Socket server listening");
190
+ resolve2();
191
+ });
192
+ });
193
+ }
194
+ async close() {
195
+ for (const conn of this.connections) {
196
+ conn.destroy();
197
+ }
198
+ this.connections.clear();
199
+ return new Promise((resolve2) => {
200
+ if (!this.server) {
201
+ resolve2();
202
+ return;
203
+ }
204
+ this.server.close(() => {
205
+ logger2.info("Socket server closed");
206
+ resolve2();
207
+ });
208
+ });
209
+ }
210
+ handleConnection(socket) {
211
+ this.connections.add(socket);
212
+ let buffer = "";
213
+ socket.on("data", (chunk) => {
214
+ buffer += chunk.toString();
215
+ const lines = buffer.split("\n");
216
+ buffer = lines.pop() ?? "";
217
+ for (const line of lines) {
218
+ const trimmed = line.trim();
219
+ if (!trimmed) continue;
220
+ this.processMessage(trimmed, socket);
221
+ }
222
+ });
223
+ socket.on("close", () => {
224
+ this.connections.delete(socket);
225
+ });
226
+ socket.on("error", (err) => {
227
+ logger2.debug({ error: err.message }, "Client connection error");
228
+ this.connections.delete(socket);
229
+ });
230
+ }
231
+ processMessage(raw, socket) {
232
+ let request;
233
+ try {
234
+ request = JSON.parse(raw);
235
+ } catch {
236
+ this.sendResponse(socket, {
237
+ jsonrpc: "2.0",
238
+ id: 0,
239
+ error: { code: RPC_ERROR_CODES.PARSE_ERROR, message: "Invalid JSON" }
240
+ });
241
+ return;
242
+ }
243
+ if (!request.jsonrpc || request.jsonrpc !== "2.0" || !request.method || request.id == null) {
244
+ this.sendResponse(socket, {
245
+ jsonrpc: "2.0",
246
+ id: request.id ?? 0,
247
+ error: { code: RPC_ERROR_CODES.INVALID_REQUEST, message: "Invalid JSON-RPC 2.0 request" }
248
+ });
249
+ return;
250
+ }
251
+ const handler = this.handlers.get(request.method);
252
+ if (!handler) {
253
+ this.sendResponse(socket, {
254
+ jsonrpc: "2.0",
255
+ id: request.id,
256
+ error: { code: RPC_ERROR_CODES.METHOD_NOT_FOUND, message: `Method not found: ${request.method}` }
257
+ });
258
+ return;
259
+ }
260
+ handler(request.params ?? {}, this.ctx).then((result) => {
261
+ this.sendResponse(socket, {
262
+ jsonrpc: "2.0",
263
+ id: request.id,
264
+ result
265
+ });
266
+ }).catch((err) => {
267
+ if (err instanceof ActantError) {
268
+ this.sendResponse(socket, {
269
+ jsonrpc: "2.0",
270
+ id: request.id,
271
+ error: {
272
+ code: mapErrorCode(err),
273
+ message: err.message,
274
+ data: { errorCode: err.code, context: err.context }
275
+ }
276
+ });
277
+ } else {
278
+ logger2.error({ error: err }, "Unhandled handler error");
279
+ this.sendResponse(socket, {
280
+ jsonrpc: "2.0",
281
+ id: request.id,
282
+ error: { code: RPC_ERROR_CODES.INTERNAL_ERROR, message: err instanceof Error ? err.message : "Internal error" }
283
+ });
284
+ }
285
+ });
286
+ }
287
+ sendResponse(socket, response) {
288
+ if (!socket.destroyed) {
289
+ socket.write(JSON.stringify(response) + "\n");
290
+ }
291
+ }
292
+ };
293
+
294
+ // src/handlers/handler-registry.ts
295
+ var HandlerRegistry = class {
296
+ handlers = /* @__PURE__ */ new Map();
297
+ register(method, handler) {
298
+ this.handlers.set(method, handler);
299
+ }
300
+ get(method) {
301
+ return this.handlers.get(method);
302
+ }
303
+ has(method) {
304
+ return this.handlers.has(method);
305
+ }
306
+ methods() {
307
+ return Array.from(this.handlers.keys());
308
+ }
309
+ };
310
+
311
+ // src/handlers/template-handlers.ts
312
+ import { resolve } from "path";
313
+ function registerTemplateHandlers(registry) {
314
+ registry.register("template.list", handleTemplateList);
315
+ registry.register("template.get", handleTemplateGet);
316
+ registry.register("template.load", handleTemplateLoad);
317
+ registry.register("template.unload", handleTemplateUnload);
318
+ registry.register("template.validate", handleTemplateValidate);
319
+ }
320
+ async function handleTemplateList(_params, ctx) {
321
+ return ctx.templateRegistry.list();
322
+ }
323
+ async function handleTemplateGet(params, ctx) {
324
+ const { name } = params;
325
+ return ctx.templateRegistry.getOrThrow(name);
326
+ }
327
+ async function handleTemplateLoad(params, ctx) {
328
+ const { filePath } = params;
329
+ const template = await ctx.templateLoader.loadFromFile(resolve(filePath));
330
+ ctx.templateRegistry.register(template);
331
+ await ctx.templateRegistry.persist(template);
332
+ return template;
333
+ }
334
+ async function handleTemplateUnload(params, ctx) {
335
+ const { name } = params;
336
+ const removed = ctx.templateRegistry.unregister(name);
337
+ return { success: removed };
338
+ }
339
+ async function handleTemplateValidate(params, ctx) {
340
+ const { filePath } = params;
341
+ try {
342
+ const template = await ctx.templateLoader.loadFromFile(filePath);
343
+ const { validateTemplate } = await import("@actant/core");
344
+ const deep = validateTemplate(template);
345
+ return {
346
+ valid: true,
347
+ template,
348
+ warnings: deep.warnings.map((w) => ({ path: w.path, message: w.message }))
349
+ };
350
+ } catch (err) {
351
+ const validationErrors = err.validationErrors;
352
+ return {
353
+ valid: false,
354
+ errors: validationErrors ?? [{ path: "", message: err instanceof Error ? err.message : String(err) }]
355
+ };
356
+ }
357
+ }
358
+
359
+ // src/handlers/agent-handlers.ts
360
+ import { join as join2 } from "path";
361
+ import { readFile } from "fs/promises";
362
+ import { AgentNotFoundError } from "@actant/shared";
363
+ import { resolvePermissionsWithMcp, PermissionAuditLogger } from "@actant/core";
364
+ import { updateInstanceMeta } from "@actant/core";
365
+ function registerAgentHandlers(registry) {
366
+ registry.register("agent.create", handleAgentCreate);
367
+ registry.register("agent.start", handleAgentStart);
368
+ registry.register("agent.stop", handleAgentStop);
369
+ registry.register("agent.destroy", handleAgentDestroy);
370
+ registry.register("agent.status", handleAgentStatus);
371
+ registry.register("agent.list", handleAgentList);
372
+ registry.register("agent.adopt", handleAgentAdopt);
373
+ registry.register("agent.resolve", handleAgentResolve);
374
+ registry.register("agent.attach", handleAgentAttach);
375
+ registry.register("agent.detach", handleAgentDetach);
376
+ registry.register("agent.run", handleAgentRun);
377
+ registry.register("agent.prompt", handleAgentPrompt);
378
+ registry.register("agent.updatePermissions", handleAgentUpdatePermissions);
379
+ registry.register("agent.processLogs", handleAgentProcessLogs);
380
+ }
381
+ async function handleAgentCreate(params, ctx) {
382
+ const { name, template, overrides } = params;
383
+ return ctx.agentManager.createAgent(name, template, overrides);
384
+ }
385
+ async function handleAgentStart(params, ctx) {
386
+ const { name } = params;
387
+ await ctx.agentManager.startAgent(name);
388
+ const meta = ctx.agentManager.getAgent(name);
389
+ if (!meta) throw new AgentNotFoundError(name);
390
+ return meta;
391
+ }
392
+ async function handleAgentStop(params, ctx) {
393
+ const { name } = params;
394
+ await ctx.agentManager.stopAgent(name);
395
+ const meta = ctx.agentManager.getAgent(name);
396
+ if (!meta) throw new AgentNotFoundError(name);
397
+ return meta;
398
+ }
399
+ async function handleAgentDestroy(params, ctx) {
400
+ const { name } = params;
401
+ await ctx.agentManager.destroyAgent(name);
402
+ return { success: true };
403
+ }
404
+ async function handleAgentStatus(params, ctx) {
405
+ const { name } = params;
406
+ const meta = ctx.agentManager.getAgent(name);
407
+ if (!meta) throw new AgentNotFoundError(name);
408
+ return meta;
409
+ }
410
+ async function handleAgentList(_params, ctx) {
411
+ return ctx.agentManager.listAgents();
412
+ }
413
+ async function handleAgentAdopt(params, ctx) {
414
+ const { path, rename } = params;
415
+ const entry = await ctx.instanceRegistry.adopt(path, rename);
416
+ return {
417
+ name: entry.name,
418
+ template: entry.template,
419
+ workspacePath: entry.workspacePath,
420
+ location: entry.location,
421
+ createdAt: entry.createdAt,
422
+ status: entry.status
423
+ };
424
+ }
425
+ async function handleAgentResolve(params, ctx) {
426
+ const { name, template, overrides } = params;
427
+ return ctx.agentManager.resolveAgent(name, template, overrides);
428
+ }
429
+ async function handleAgentAttach(params, ctx) {
430
+ const { name, pid, metadata } = params;
431
+ return ctx.agentManager.attachAgent(name, pid, metadata);
432
+ }
433
+ async function handleAgentDetach(params, ctx) {
434
+ const { name, cleanup } = params;
435
+ return ctx.agentManager.detachAgent(name, { cleanup });
436
+ }
437
+ async function handleAgentRun(params, ctx) {
438
+ const { name, prompt, options } = params;
439
+ return ctx.agentManager.runPrompt(name, prompt, options);
440
+ }
441
+ async function handleAgentPrompt(params, ctx) {
442
+ const { name, message, sessionId } = params;
443
+ const result = await ctx.agentManager.promptAgent(name, message, sessionId);
444
+ return {
445
+ response: result.text,
446
+ sessionId: result.sessionId ?? ""
447
+ };
448
+ }
449
+ async function handleAgentUpdatePermissions(params, ctx) {
450
+ const { name, permissions } = params;
451
+ const meta = ctx.agentManager.getAgent(name);
452
+ if (!meta) throw new AgentNotFoundError(name);
453
+ const workspaceDir = join2(ctx.instancesDir, name);
454
+ const mcpServers = ctx.mcpConfigManager.list().map((s) => s.name);
455
+ const resolved = resolvePermissionsWithMcp(permissions, mcpServers);
456
+ await updateInstanceMeta(workspaceDir, { effectivePermissions: resolved });
457
+ ctx.acpConnectionManager.updatePermissionPolicy(name, resolved);
458
+ const auditLogger = new PermissionAuditLogger(name);
459
+ auditLogger.logUpdated("rpc:agent.updatePermissions");
460
+ return { effectivePermissions: resolved };
461
+ }
462
+ async function handleAgentProcessLogs(params, ctx) {
463
+ const { name, stream = "stdout", lines = 50 } = params;
464
+ const meta = ctx.agentManager.getAgent(name);
465
+ if (!meta) throw new AgentNotFoundError(name);
466
+ const logDir = join2(ctx.instancesDir, name, "logs");
467
+ const logFile = join2(logDir, `${stream}.log`);
468
+ let content;
469
+ try {
470
+ content = await readFile(logFile, "utf-8");
471
+ } catch {
472
+ return { lines: [], stream, logDir };
473
+ }
474
+ const allLines = content.split("\n").filter(Boolean);
475
+ return {
476
+ lines: allLines.slice(-lines),
477
+ stream,
478
+ logDir
479
+ };
480
+ }
481
+
482
+ // src/handlers/session-handlers.ts
483
+ import { createLogger as createLogger3 } from "@actant/shared";
484
+ var logger3 = createLogger3("session-handlers");
485
+ function registerSessionHandlers(registry) {
486
+ registry.register("session.create", handleSessionCreate);
487
+ registry.register("session.prompt", handleSessionPrompt);
488
+ registry.register("session.cancel", handleSessionCancel);
489
+ registry.register("session.close", handleSessionClose);
490
+ registry.register("session.list", handleSessionList);
491
+ }
492
+ async function handleSessionCreate(params, ctx) {
493
+ const { agentName, clientId, idleTtlMs } = params;
494
+ if (!agentName || typeof agentName !== "string") {
495
+ throw new Error('Required parameter "agentName" is missing or invalid');
496
+ }
497
+ if (!clientId || typeof clientId !== "string") {
498
+ throw new Error('Required parameter "clientId" is missing or invalid');
499
+ }
500
+ const meta = ctx.agentManager.getAgent(agentName);
501
+ if (!meta) {
502
+ throw new Error(`Agent "${agentName}" not found`);
503
+ }
504
+ if (meta.status !== "running") {
505
+ throw new Error(`Agent "${agentName}" is not running (status: ${meta.status}). Start it with: actant agent start ${agentName}`);
506
+ }
507
+ if (!ctx.agentManager.hasAcpConnection(agentName)) {
508
+ throw new Error(`Agent "${agentName}" has no ACP connection`);
509
+ }
510
+ const lease = ctx.sessionRegistry.create({ agentName, clientId, idleTtlMs });
511
+ logger3.info({ sessionId: lease.sessionId, agentName, clientId }, "Session lease created");
512
+ return toLeaseInfo(lease);
513
+ }
514
+ async function handleSessionPrompt(params, ctx) {
515
+ const { sessionId, text } = params;
516
+ if (!sessionId || typeof sessionId !== "string") {
517
+ throw new Error('Required parameter "sessionId" is missing or invalid');
518
+ }
519
+ if (!text || typeof text !== "string") {
520
+ throw new Error('Required parameter "text" is missing or invalid');
521
+ }
522
+ const lease = ctx.sessionRegistry.get(sessionId);
523
+ if (!lease) {
524
+ throw new Error(`Session "${sessionId}" not found`);
525
+ }
526
+ if (lease.state === "expired") {
527
+ throw new Error(`Session "${sessionId}" has expired`);
528
+ }
529
+ ctx.sessionRegistry.touch(sessionId);
530
+ const result = await ctx.agentManager.promptAgent(
531
+ lease.agentName,
532
+ text
533
+ );
534
+ ctx.sessionRegistry.touch(sessionId);
535
+ return {
536
+ stopReason: "end_turn",
537
+ text: result.text
538
+ };
539
+ }
540
+ async function handleSessionCancel(params, ctx) {
541
+ const { sessionId } = params;
542
+ if (!sessionId || typeof sessionId !== "string") {
543
+ throw new Error('Required parameter "sessionId" is missing or invalid');
544
+ }
545
+ const lease = ctx.sessionRegistry.get(sessionId);
546
+ if (!lease) {
547
+ throw new Error(`Session "${sessionId}" not found`);
548
+ }
549
+ const conn = ctx.acpConnectionManager.getConnection(lease.agentName);
550
+ if (!conn) {
551
+ throw new Error(`Agent "${lease.agentName}" has no ACP connection`);
552
+ }
553
+ const acpSessionId = ctx.acpConnectionManager.getPrimarySessionId(lease.agentName);
554
+ if (!acpSessionId) {
555
+ throw new Error(`Agent "${lease.agentName}" has no primary ACP session`);
556
+ }
557
+ try {
558
+ await conn.cancel(acpSessionId);
559
+ logger3.info({ sessionId, acpSessionId, agentName: lease.agentName }, "Session cancel sent to ACP");
560
+ } catch (err) {
561
+ logger3.error({ sessionId, error: err }, "Failed to cancel ACP session");
562
+ throw new Error(`Failed to cancel session: ${err instanceof Error ? err.message : String(err)}`, { cause: err });
563
+ }
564
+ return { ok: true };
565
+ }
566
+ async function handleSessionClose(params, ctx) {
567
+ const { sessionId } = params;
568
+ if (!sessionId || typeof sessionId !== "string") {
569
+ throw new Error('Required parameter "sessionId" is missing or invalid');
570
+ }
571
+ const closed = ctx.sessionRegistry.close(sessionId);
572
+ if (!closed) {
573
+ throw new Error(`Session "${sessionId}" not found`);
574
+ }
575
+ return { ok: true };
576
+ }
577
+ async function handleSessionList(params, ctx) {
578
+ const { agentName } = params;
579
+ return ctx.sessionRegistry.list(agentName).map(toLeaseInfo);
580
+ }
581
+ function toLeaseInfo(lease) {
582
+ return {
583
+ sessionId: lease.sessionId,
584
+ agentName: lease.agentName,
585
+ clientId: lease.clientId,
586
+ state: lease.state,
587
+ createdAt: lease.createdAt,
588
+ lastActivityAt: lease.lastActivityAt,
589
+ idleTtlMs: lease.idleTtlMs
590
+ };
591
+ }
592
+
593
+ // src/handlers/domain-handlers.ts
594
+ import { ConfigNotFoundError } from "@actant/shared";
595
+ function createCrudHandlers(getManager) {
596
+ return {
597
+ add: async (params, ctx) => {
598
+ const { component } = params;
599
+ const mgr = getManager(ctx);
600
+ await mgr.add(component, true);
601
+ return { name: component.name };
602
+ },
603
+ update: async (params, ctx) => {
604
+ const { name, patch } = params;
605
+ const result = await getManager(ctx).update(name, patch, true);
606
+ return { name: result.name };
607
+ },
608
+ remove: async (params, ctx) => {
609
+ const { name } = params;
610
+ const success = await getManager(ctx).remove(name, true);
611
+ return { success };
612
+ },
613
+ import: async (params, ctx) => {
614
+ const { filePath } = params;
615
+ const result = await getManager(ctx).importFromFile(filePath);
616
+ return { name: result.name };
617
+ },
618
+ export: async (params, ctx) => {
619
+ const { name, filePath } = params;
620
+ await getManager(ctx).exportToFile(name, filePath);
621
+ return { success: true };
622
+ }
623
+ };
624
+ }
625
+ function registerDomainHandlers(registry) {
626
+ registry.register("skill.list", handleSkillList);
627
+ registry.register("skill.get", handleSkillGet);
628
+ registry.register("prompt.list", handlePromptList);
629
+ registry.register("prompt.get", handlePromptGet);
630
+ registry.register("mcp.list", handleMcpList);
631
+ registry.register("mcp.get", handleMcpGet);
632
+ registry.register("workflow.list", handleWorkflowList);
633
+ registry.register("workflow.get", handleWorkflowGet);
634
+ registry.register("plugin.list", handlePluginList);
635
+ registry.register("plugin.get", handlePluginGet);
636
+ const skillCrud = createCrudHandlers((ctx) => ctx.skillManager);
637
+ const promptCrud = createCrudHandlers((ctx) => ctx.promptManager);
638
+ const mcpCrud = createCrudHandlers((ctx) => ctx.mcpConfigManager);
639
+ const workflowCrud = createCrudHandlers((ctx) => ctx.workflowManager);
640
+ const pluginCrud = createCrudHandlers((ctx) => ctx.pluginManager);
641
+ const crudSets = [
642
+ { prefix: "skill", crud: skillCrud },
643
+ { prefix: "prompt", crud: promptCrud },
644
+ { prefix: "mcp", crud: mcpCrud },
645
+ { prefix: "workflow", crud: workflowCrud },
646
+ { prefix: "plugin", crud: pluginCrud }
647
+ ];
648
+ for (const { prefix, crud } of crudSets) {
649
+ registry.register(`${prefix}.add`, crud.add);
650
+ registry.register(`${prefix}.update`, crud.update);
651
+ registry.register(`${prefix}.remove`, crud.remove);
652
+ registry.register(`${prefix}.import`, crud.import);
653
+ registry.register(`${prefix}.export`, crud.export);
654
+ }
655
+ }
656
+ async function handleSkillList(_params, ctx) {
657
+ return ctx.skillManager.list();
658
+ }
659
+ async function handleSkillGet(params, ctx) {
660
+ const { name } = params;
661
+ const skill = ctx.skillManager.get(name);
662
+ if (!skill) {
663
+ throw new ConfigNotFoundError(`Skill "${name}" not found`);
664
+ }
665
+ return skill;
666
+ }
667
+ async function handlePromptList(_params, ctx) {
668
+ return ctx.promptManager.list();
669
+ }
670
+ async function handlePromptGet(params, ctx) {
671
+ const { name } = params;
672
+ const prompt = ctx.promptManager.get(name);
673
+ if (!prompt) {
674
+ throw new ConfigNotFoundError(`Prompt "${name}" not found`);
675
+ }
676
+ return prompt;
677
+ }
678
+ async function handleMcpList(_params, ctx) {
679
+ return ctx.mcpConfigManager.list();
680
+ }
681
+ async function handleMcpGet(params, ctx) {
682
+ const { name } = params;
683
+ const mcp = ctx.mcpConfigManager.get(name);
684
+ if (!mcp) {
685
+ throw new ConfigNotFoundError(`MCP server "${name}" not found`);
686
+ }
687
+ return mcp;
688
+ }
689
+ async function handleWorkflowList(_params, ctx) {
690
+ return ctx.workflowManager.list();
691
+ }
692
+ async function handleWorkflowGet(params, ctx) {
693
+ const { name } = params;
694
+ const workflow = ctx.workflowManager.get(name);
695
+ if (!workflow) {
696
+ throw new ConfigNotFoundError(`Workflow "${name}" not found`);
697
+ }
698
+ return workflow;
699
+ }
700
+ async function handlePluginList(_params, ctx) {
701
+ return ctx.pluginManager.list();
702
+ }
703
+ async function handlePluginGet(params, ctx) {
704
+ const { name } = params;
705
+ const plugin = ctx.pluginManager.get(name);
706
+ if (!plugin) {
707
+ throw new ConfigNotFoundError(`Plugin "${name}" not found`);
708
+ }
709
+ return plugin;
710
+ }
711
+
712
+ // src/handlers/source-handlers.ts
713
+ function registerSourceHandlers(registry) {
714
+ registry.register("source.list", handleSourceList);
715
+ registry.register("source.add", handleSourceAdd);
716
+ registry.register("source.remove", handleSourceRemove);
717
+ registry.register("source.sync", handleSourceSync);
718
+ }
719
+ async function handleSourceList(_params, ctx) {
720
+ return ctx.sourceManager.listSources();
721
+ }
722
+ async function handleSourceAdd(params, ctx) {
723
+ const { name, config } = params;
724
+ const result = await ctx.sourceManager.addSource(name, config);
725
+ return {
726
+ name,
727
+ components: {
728
+ skills: result.skills.length,
729
+ prompts: result.prompts.length,
730
+ mcp: result.mcpServers.length,
731
+ workflows: result.workflows.length,
732
+ presets: result.presets.length
733
+ }
734
+ };
735
+ }
736
+ async function handleSourceRemove(params, ctx) {
737
+ const { name } = params;
738
+ const success = await ctx.sourceManager.removeSource(name);
739
+ return { success };
740
+ }
741
+ async function handleSourceSync(params, ctx) {
742
+ const { name } = params;
743
+ if (name) {
744
+ const { report: report2 } = await ctx.sourceManager.syncSourceWithReport(name);
745
+ return {
746
+ synced: [name],
747
+ report: {
748
+ addedCount: report2.added.length,
749
+ updatedCount: report2.updated.length,
750
+ removedCount: report2.removed.length,
751
+ hasBreakingChanges: report2.hasBreakingChanges
752
+ }
753
+ };
754
+ }
755
+ const { report } = await ctx.sourceManager.syncAllWithReport();
756
+ return {
757
+ synced: ctx.sourceManager.listSources().map((s) => s.name),
758
+ report: {
759
+ addedCount: report.added.length,
760
+ updatedCount: report.updated.length,
761
+ removedCount: report.removed.length,
762
+ hasBreakingChanges: report.hasBreakingChanges
763
+ }
764
+ };
765
+ }
766
+
767
+ // src/handlers/preset-handlers.ts
768
+ import { ConfigNotFoundError as ConfigNotFoundError2 } from "@actant/shared";
769
+ function registerPresetHandlers(registry) {
770
+ registry.register("preset.list", handlePresetList);
771
+ registry.register("preset.show", handlePresetShow);
772
+ registry.register("preset.apply", handlePresetApply);
773
+ }
774
+ async function handlePresetList(params, ctx) {
775
+ const { packageName } = params;
776
+ return ctx.sourceManager.listPresets(packageName);
777
+ }
778
+ async function handlePresetShow(params, ctx) {
779
+ const { qualifiedName } = params;
780
+ const preset = ctx.sourceManager.getPreset(qualifiedName);
781
+ if (!preset) {
782
+ throw new ConfigNotFoundError2(`Preset "${qualifiedName}" not found`);
783
+ }
784
+ return preset;
785
+ }
786
+ async function handlePresetApply(params, ctx) {
787
+ const { qualifiedName, templateName } = params;
788
+ const template = ctx.templateRegistry.get(templateName);
789
+ if (!template) {
790
+ throw new ConfigNotFoundError2(`Template "${templateName}" not found`);
791
+ }
792
+ return ctx.sourceManager.applyPreset(qualifiedName, template);
793
+ }
794
+
795
+ // src/handlers/daemon-handlers.ts
796
+ function registerDaemonHandlers(registry, shutdownFn) {
797
+ registry.register("daemon.ping", async (_params, ctx) => handleDaemonPing(ctx));
798
+ registry.register("daemon.shutdown", async () => handleDaemonShutdown(shutdownFn));
799
+ }
800
+ async function handleDaemonPing(ctx) {
801
+ return {
802
+ version: "0.1.0",
803
+ uptime: ctx.uptime,
804
+ agents: ctx.agentManager.size
805
+ };
806
+ }
807
+ async function handleDaemonShutdown(shutdownFn) {
808
+ setImmediate(() => shutdownFn());
809
+ return { success: true };
810
+ }
811
+
812
+ // src/handlers/proxy-handlers.ts
813
+ import { randomUUID } from "crypto";
814
+ import { createLogger as createLogger4 } from "@actant/shared";
815
+ var logger4 = createLogger4("proxy-handlers");
816
+ var proxySessions = /* @__PURE__ */ new Map();
817
+ function registerProxyHandlers(registry) {
818
+ registry.register("proxy.connect", handleProxyConnect);
819
+ registry.register("proxy.disconnect", handleProxyDisconnect);
820
+ registry.register("proxy.forward", handleProxyForward);
821
+ }
822
+ async function handleProxyConnect(params, ctx) {
823
+ const { agentName, envPassthrough } = params;
824
+ const meta = ctx.agentManager.getAgent(agentName);
825
+ if (!meta) {
826
+ throw new Error(`Agent "${agentName}" not found`);
827
+ }
828
+ if (meta.status !== "running") {
829
+ throw new Error(`Agent "${agentName}" is not running (status: ${meta.status})`);
830
+ }
831
+ if (!ctx.agentManager.hasAcpConnection(agentName)) {
832
+ throw new Error(`Agent "${agentName}" has no ACP connection`);
833
+ }
834
+ const sessionId = randomUUID();
835
+ const session = {
836
+ sessionId,
837
+ agentName,
838
+ envPassthrough: envPassthrough ?? false,
839
+ connectedAt: (/* @__PURE__ */ new Date()).toISOString()
840
+ };
841
+ proxySessions.set(sessionId, session);
842
+ logger4.info({ sessionId, agentName, envPassthrough }, "Proxy session connected");
843
+ return session;
844
+ }
845
+ async function handleProxyDisconnect(params, _ctx) {
846
+ const { sessionId } = params;
847
+ const session = proxySessions.get(sessionId);
848
+ if (!session) {
849
+ throw new Error(`Proxy session "${sessionId}" not found`);
850
+ }
851
+ proxySessions.delete(sessionId);
852
+ logger4.info({ sessionId, agentName: session.agentName }, "Proxy session disconnected");
853
+ return { ok: true };
854
+ }
855
+ async function handleProxyForward(params, ctx) {
856
+ const { sessionId, acpMessage } = params;
857
+ const session = proxySessions.get(sessionId);
858
+ if (!session) {
859
+ throw new Error(`Proxy session "${sessionId}" not found`);
860
+ }
861
+ const method = acpMessage["method"];
862
+ if (!method) {
863
+ throw new Error("ACP message missing 'method' field");
864
+ }
865
+ const acpParams = acpMessage["params"] ?? {};
866
+ switch (method) {
867
+ case "session/prompt": {
868
+ const prompt = acpParams["prompt"];
869
+ const text = prompt?.find((p) => p.type === "text")?.text ?? "";
870
+ const result = await ctx.agentManager.promptAgent(session.agentName, text);
871
+ return { result: { stopReason: "end_turn", text: result.text } };
872
+ }
873
+ case "session/cancel": {
874
+ return { result: { ok: true } };
875
+ }
876
+ default:
877
+ throw new Error(`Unsupported ACP method: ${method}`);
878
+ }
879
+ }
880
+
881
+ // src/handlers/schedule-handlers.ts
882
+ function registerScheduleHandlers(registry) {
883
+ registry.register("agent.dispatch", handleAgentDispatch);
884
+ registry.register("agent.tasks", handleAgentTasks);
885
+ registry.register("agent.logs", handleAgentLogs);
886
+ registry.register("schedule.list", handleScheduleList);
887
+ }
888
+ async function handleAgentDispatch(params, ctx) {
889
+ const { name, prompt, priority } = params;
890
+ const scheduler = ctx.schedulers.get(name);
891
+ if (!scheduler) {
892
+ return { queued: false };
893
+ }
894
+ const p = priority ?? "normal";
895
+ scheduler.dispatch(prompt, p);
896
+ return { queued: true };
897
+ }
898
+ async function handleAgentTasks(params, ctx) {
899
+ const { name } = params;
900
+ const scheduler = ctx.schedulers.get(name);
901
+ if (!scheduler) {
902
+ return { queued: 0, processing: false, tasks: [] };
903
+ }
904
+ return scheduler.getTasks();
905
+ }
906
+ async function handleAgentLogs(params, ctx) {
907
+ const { name, limit } = params;
908
+ const scheduler = ctx.schedulers.get(name);
909
+ if (!scheduler) {
910
+ return [];
911
+ }
912
+ return scheduler.getLogs(limit);
913
+ }
914
+ async function handleScheduleList(params, ctx) {
915
+ const { name } = params;
916
+ const scheduler = ctx.schedulers.get(name);
917
+ if (!scheduler) {
918
+ return { sources: [], running: false };
919
+ }
920
+ return {
921
+ sources: scheduler.getSources(),
922
+ running: scheduler.running
923
+ };
924
+ }
925
+
926
+ // src/daemon/pid-file.ts
927
+ import { writeFile, readFile as readFile2, unlink } from "fs/promises";
928
+ async function writePidFile(path) {
929
+ await writeFile(path, String(process.pid), "utf-8");
930
+ }
931
+ async function readPidFile(path) {
932
+ try {
933
+ const content = await readFile2(path, "utf-8");
934
+ const pid = parseInt(content.trim(), 10);
935
+ return Number.isNaN(pid) ? null : pid;
936
+ } catch {
937
+ return null;
938
+ }
939
+ }
940
+ async function removePidFile(path) {
941
+ try {
942
+ await unlink(path);
943
+ } catch {
944
+ }
945
+ }
946
+ function isProcessRunning(pid) {
947
+ try {
948
+ process.kill(pid, 0);
949
+ return true;
950
+ } catch {
951
+ return false;
952
+ }
953
+ }
954
+
955
+ // src/daemon/daemon.ts
956
+ var logger5 = createLogger5("daemon");
957
+ var Daemon = class {
958
+ ctx;
959
+ server;
960
+ handlers;
961
+ running = false;
962
+ constructor(config) {
963
+ this.ctx = new AppContext(config);
964
+ this.handlers = new HandlerRegistry();
965
+ this.server = new SocketServer(this.handlers, this.ctx);
966
+ registerTemplateHandlers(this.handlers);
967
+ registerAgentHandlers(this.handlers);
968
+ registerSessionHandlers(this.handlers);
969
+ registerDomainHandlers(this.handlers);
970
+ registerSourceHandlers(this.handlers);
971
+ registerPresetHandlers(this.handlers);
972
+ registerDaemonHandlers(this.handlers, () => this.stop());
973
+ registerProxyHandlers(this.handlers);
974
+ registerScheduleHandlers(this.handlers);
975
+ }
976
+ get socketPath() {
977
+ return this.ctx.socketPath;
978
+ }
979
+ get appContext() {
980
+ return this.ctx;
981
+ }
982
+ async start() {
983
+ if (this.running) return;
984
+ const existingPid = await readPidFile(this.ctx.pidFilePath);
985
+ if (existingPid !== null && isProcessRunning(existingPid)) {
986
+ throw new Error(`Daemon already running (PID ${existingPid})`);
987
+ }
988
+ await this.ctx.init();
989
+ if (ipcRequiresFileCleanup()) {
990
+ try {
991
+ await unlink2(this.ctx.socketPath);
992
+ } catch {
993
+ }
994
+ }
995
+ await this.server.listen(this.ctx.socketPath);
996
+ await writePidFile(this.ctx.pidFilePath);
997
+ this.running = true;
998
+ logger5.info({ pid: process.pid, socket: this.ctx.socketPath, homeDir: this.ctx.homeDir }, "Daemon started");
999
+ }
1000
+ async stop() {
1001
+ if (!this.running) return;
1002
+ this.running = false;
1003
+ logger5.info("Daemon shutting down...");
1004
+ const agents = this.ctx.agentManager.listAgents();
1005
+ for (const agent of agents) {
1006
+ if (agent.status === "running" || agent.status === "starting") {
1007
+ try {
1008
+ await this.ctx.agentManager.stopAgent(agent.name);
1009
+ } catch (err) {
1010
+ logger5.warn({ name: agent.name, error: err }, "Failed to stop agent during shutdown");
1011
+ }
1012
+ }
1013
+ }
1014
+ this.ctx.templateWatcher.stop();
1015
+ await this.server.close();
1016
+ await removePidFile(this.ctx.pidFilePath);
1017
+ if (ipcRequiresFileCleanup()) {
1018
+ try {
1019
+ await unlink2(this.ctx.socketPath);
1020
+ } catch {
1021
+ }
1022
+ }
1023
+ logger5.info("Daemon stopped");
1024
+ }
1025
+ get isRunning() {
1026
+ return this.running;
1027
+ }
1028
+ };
1029
+ export {
1030
+ AppContext,
1031
+ Daemon,
1032
+ HandlerRegistry,
1033
+ registerAgentHandlers,
1034
+ registerDaemonHandlers,
1035
+ registerTemplateHandlers
1036
+ };
1037
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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 {\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 type LauncherMode,\n} from \"@actant/core\";\nimport { AcpConnectionManager } from \"@actant/acp\";\nimport { createLogger, getIpcPath } from \"@actant/shared\";\n\nconst logger = createLogger(\"app-context\");\n\nconst DEFAULT_HOME = join(homedir(), \".actant\");\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 = 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 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 });\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 = config?.launcherMode\n ?? (process.env[\"ACTANT_LAUNCHER_MODE\"] as LauncherMode | undefined);\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 },\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 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 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 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 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.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 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 SourceEntry,\n} from \"@actant/shared\";\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}\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","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 ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@actant/api",
3
+ "version": "0.1.2",
4
+ "description": "High-level API for the Actant AI agent platform",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "author": "blackplume <blackplume233@gmail.com>",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/blackplume233/Actant.git",
11
+ "directory": "packages/api"
12
+ },
13
+ "homepage": "https://github.com/blackplume233/Actant#readme",
14
+ "bugs": "https://github.com/blackplume233/Actant/issues",
15
+ "keywords": [
16
+ "actant",
17
+ "ai-agent",
18
+ "api"
19
+ ],
20
+ "publishConfig": {
21
+ "access": "public"
22
+ },
23
+ "files": [
24
+ "dist"
25
+ ],
26
+ "main": "./dist/index.js",
27
+ "types": "./dist/index.d.ts",
28
+ "exports": {
29
+ ".": {
30
+ "import": "./dist/index.js",
31
+ "types": "./dist/index.d.ts"
32
+ }
33
+ },
34
+ "dependencies": {
35
+ "@actant/acp": "0.1.2",
36
+ "@actant/core": "0.1.2",
37
+ "@actant/shared": "0.1.2"
38
+ },
39
+ "scripts": {
40
+ "build": "tsup",
41
+ "dev": "tsx --watch src/index.ts",
42
+ "type-check": "tsc --noEmit",
43
+ "test": "vitest run",
44
+ "clean": "rimraf dist"
45
+ }
46
+ }