@meetquinn/animactl 0.1.3 → 0.1.4-canary.101.1.7eafcd7

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.
Files changed (50) hide show
  1. package/dist/server/providers/child-process.d.ts +7 -0
  2. package/dist/server/providers/child-process.d.ts.map +1 -1
  3. package/dist/server/providers/child-process.js +19 -0
  4. package/dist/server/providers/claude.d.ts +2 -2
  5. package/dist/server/providers/claude.d.ts.map +1 -1
  6. package/dist/server/providers/claude.js +8 -6
  7. package/dist/server/providers/codex.d.ts +2 -2
  8. package/dist/server/providers/codex.d.ts.map +1 -1
  9. package/dist/server/providers/codex.js +8 -6
  10. package/dist/server/providers/contract.d.ts +5 -1
  11. package/dist/server/providers/contract.d.ts.map +1 -1
  12. package/dist/server/providers/kimi.d.ts +2 -2
  13. package/dist/server/providers/kimi.d.ts.map +1 -1
  14. package/dist/server/providers/kimi.js +8 -6
  15. package/dist/server/runtime/agent-restart-command.store.d.ts +27 -0
  16. package/dist/server/runtime/agent-restart-command.store.d.ts.map +1 -0
  17. package/dist/server/runtime/agent-restart-command.store.js +84 -0
  18. package/dist/server/runtime/agent-runner.d.ts +2 -3
  19. package/dist/server/runtime/agent-runner.d.ts.map +1 -1
  20. package/dist/server/runtime/agent-runner.js +1 -1
  21. package/dist/server/runtime/host.d.ts +10 -0
  22. package/dist/server/runtime/host.d.ts.map +1 -1
  23. package/dist/server/runtime/host.js +72 -0
  24. package/dist/server/runtime/runtime-worker.d.ts +7 -4
  25. package/dist/server/runtime/runtime-worker.d.ts.map +1 -1
  26. package/dist/server/runtime/runtime-worker.js +7 -3
  27. package/dist/server/runtime/runtime.service.d.ts +3 -0
  28. package/dist/server/runtime/runtime.service.d.ts.map +1 -1
  29. package/dist/server/runtime/runtime.service.js +10 -0
  30. package/dist/server/runtime/types.d.ts +1 -1
  31. package/dist/server/runtime/types.d.ts.map +1 -1
  32. package/dist/server/tests/runtime-worker.test.js +51 -0
  33. package/dist/server/tests/runtime.test.js +102 -3
  34. package/dist/server/tests/web-api.test.js +57 -0
  35. package/dist/server/web/agent-routes.d.ts.map +1 -1
  36. package/dist/server/web/agent-routes.js +4 -0
  37. package/dist/shared/activity.d.ts +1 -1
  38. package/dist/shared/activity.d.ts.map +1 -1
  39. package/dist/web/assets/{activity-DHjip8tY.js → activity-CxRY8Svf.js} +2 -2
  40. package/dist/web/assets/{clipboard-D2NSC52v.js → clipboard-BQwkQdnx.js} +1 -1
  41. package/dist/web/assets/{external-link-Bhr1WdRS.js → external-link-B1-TzIvP.js} +1 -1
  42. package/dist/web/assets/{file-text-CYMA_SMA.js → file-text-DLLVzqjf.js} +1 -1
  43. package/dist/web/assets/{index-CVpew409.js → index-DnbAPTX8.js} +6 -6
  44. package/dist/web/assets/{index-mh0uJTkY.css → index-J_OIXqpN.css} +1 -1
  45. package/dist/web/assets/{kb-DDVpYkT9.js → kb-Dcc1XQBf.js} +1 -1
  46. package/dist/web/assets/profile-DrTGJ7WI.js +1 -0
  47. package/dist/web/assets/{reminders-Bbwb9QNT.js → reminders-BYsvC5NC.js} +1 -1
  48. package/dist/web/index.html +2 -2
  49. package/package.json +1 -1
  50. package/dist/web/assets/profile-CBy6GNzp.js +0 -1
@@ -7,6 +7,10 @@ export interface RunningChildProcess {
7
7
  kill(signal?: NodeJS.Signals): void;
8
8
  writeStdin(input: string): void;
9
9
  }
10
+ export interface ChildProcessTerminationOptions {
11
+ forceAfterMs?: number;
12
+ signal?: NodeJS.Signals;
13
+ }
10
14
  export declare function startChildProcess(input: {
11
15
  args: string[];
12
16
  bufferOutput?: boolean;
@@ -18,4 +22,7 @@ export declare function startChildProcess(input: {
18
22
  onStdoutChunk?: (chunk: string) => Promise<void>;
19
23
  signal?: AbortSignal;
20
24
  }): RunningChildProcess;
25
+ export declare function terminateChildProcess(child: Pick<RunningChildProcess, 'completion' | 'kill'>, options?: ChildProcessTerminationOptions): Promise<{
26
+ forced: boolean;
27
+ }>;
21
28
  //# sourceMappingURL=child-process.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"child-process.d.ts","sourceRoot":"","sources":["../../../server/providers/child-process.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxD,QAAQ,IAAI,IAAI,CAAC;IACjB,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;IACpC,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IACvC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GAAG,mBAAmB,CA0EtB"}
1
+ {"version":3,"file":"child-process.d.ts","sourceRoot":"","sources":["../../../server/providers/child-process.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxD,QAAQ,IAAI,IAAI,CAAC;IACjB,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;IACpC,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED,MAAM,WAAW,8BAA8B;IAC7C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC;CACzB;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IACvC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GAAG,mBAAmB,CA0EtB;AAED,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,IAAI,CAAC,mBAAmB,EAAE,YAAY,GAAG,MAAM,CAAC,EACvD,OAAO,GAAE,8BAAmC,GAC3C,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,CAiB9B"}
@@ -76,6 +76,25 @@ export function startChildProcess(input) {
76
76
  },
77
77
  };
78
78
  }
79
+ export async function terminateChildProcess(child, options = {}) {
80
+ let forced = false;
81
+ child.kill(options.signal ?? 'SIGTERM');
82
+ const forceAfterMs = options.forceAfterMs;
83
+ const forceTimer = forceAfterMs !== undefined
84
+ ? setTimeout(() => {
85
+ forced = true;
86
+ child.kill('SIGKILL');
87
+ }, Math.max(0, forceAfterMs))
88
+ : undefined;
89
+ try {
90
+ await child.completion.catch(() => { });
91
+ return { forced };
92
+ }
93
+ finally {
94
+ if (forceTimer)
95
+ clearTimeout(forceTimer);
96
+ }
97
+ }
79
98
  function childProcessExitError(label, exit, stdout, stderr) {
80
99
  if (exit.signal) {
81
100
  return new Error(`${label} terminated by ${exit.signal}${stderr ? `: ${stderr.trim()}` : ''}`);
@@ -1,4 +1,4 @@
1
- import { AgentRuntime, AgentRuntimeDrainInput, AgentRuntimeFollowupInput, AgentRuntimeFollowupResult, AgentRuntimeInput, AgentRuntimeResult, ClaudeCodeAgentProviderConfig } from './contract.js';
1
+ import { type AgentRuntimeCloseOptions, AgentRuntime, AgentRuntimeDrainInput, AgentRuntimeFollowupInput, AgentRuntimeFollowupResult, AgentRuntimeInput, AgentRuntimeResult, ClaudeCodeAgentProviderConfig } from './contract.js';
2
2
  export declare const CLAUDE_DISALLOWED_TOOLS: string[];
3
3
  export declare class ClaudeCodeAgentRuntime implements AgentRuntime {
4
4
  readonly env: Record<string, string> | undefined;
@@ -7,7 +7,7 @@ export declare class ClaudeCodeAgentRuntime implements AgentRuntime {
7
7
  private controller?;
8
8
  private readonly activeRun;
9
9
  constructor(config: ClaudeCodeAgentProviderConfig);
10
- close(): Promise<void>;
10
+ close(options?: AgentRuntimeCloseOptions): Promise<void>;
11
11
  run(input: AgentRuntimeInput): Promise<AgentRuntimeResult>;
12
12
  appendToActiveRun(input: AgentRuntimeFollowupInput): Promise<AgentRuntimeFollowupResult>;
13
13
  requestDrain(input: AgentRuntimeDrainInput): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../../server/providers/claude.ts"],"names":[],"mappings":"AAQA,OAAO,EAIL,YAAY,EACZ,sBAAsB,EACtB,yBAAyB,EACzB,0BAA0B,EAC1B,iBAAiB,EACjB,kBAAkB,EAClB,6BAA6B,EAC9B,MAAM,eAAe,CAAC;AAMvB,eAAO,MAAM,uBAAuB,UAQnC,CAAC;AAIF,qBAAa,sBAAuB,YAAW,YAAY;IACzD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IACjD,QAAQ,CAAC,IAAI,iBAAiB;IAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgC;IACvD,OAAO,CAAC,UAAU,CAAC,CAA6B;IAChD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0B;gBAExC,MAAM,EAAE,6BAA6B;IAQ3C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,GAAG,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA0F1D,iBAAiB,CAAC,KAAK,EAAE,yBAAyB,GAAG,OAAO,CAAC,0BAA0B,CAAC;IAQxF,YAAY,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;YAOlD,gBAAgB;YA2BhB,OAAO;YAgBP,eAAe;IAQ7B,OAAO,CAAC,UAAU;CAgBnB"}
1
+ {"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../../server/providers/claude.ts"],"names":[],"mappings":"AAQA,OAAO,EAEL,KAAK,wBAAwB,EAG7B,YAAY,EACZ,sBAAsB,EACtB,yBAAyB,EACzB,0BAA0B,EAC1B,iBAAiB,EACjB,kBAAkB,EAClB,6BAA6B,EAC9B,MAAM,eAAe,CAAC;AAMvB,eAAO,MAAM,uBAAuB,UAQnC,CAAC;AAIF,qBAAa,sBAAuB,YAAW,YAAY;IACzD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IACjD,QAAQ,CAAC,IAAI,iBAAiB;IAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgC;IACvD,OAAO,CAAC,UAAU,CAAC,CAA6B;IAChD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0B;gBAExC,MAAM,EAAE,6BAA6B;IAQ3C,KAAK,CAAC,OAAO,GAAE,wBAA6B,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5D,GAAG,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA0F1D,iBAAiB,CAAC,KAAK,EAAE,yBAAyB,GAAG,OAAO,CAAC,0BAA0B,CAAC;IAQxF,YAAY,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;YAOlD,gBAAgB;YA2BhB,OAAO;YAgBP,eAAe;IAa7B,OAAO,CAAC,UAAU;CAgBnB"}
@@ -3,7 +3,7 @@ import { dirname } from 'node:path';
3
3
  import { isRecord, stringField } from '../json.js';
4
4
  import { runtimeErrorPayload } from '../activities/format.js';
5
5
  import { ActiveRuntimeRun } from './active-runtime.js';
6
- import { startChildProcess } from './child-process.js';
6
+ import { startChildProcess, terminateChildProcess } from './child-process.js';
7
7
  import { createClaudeJsonlActivityMapper, parseClaudeRuntimeOutput } from './claude-events.js';
8
8
  import { CLAUDE_DEFAULT_AUTO_COMPACT_WINDOW, providerSessionPayload, } from './contract.js';
9
9
  const CLAUDE_COMMAND = 'claude';
@@ -33,8 +33,8 @@ export class ClaudeCodeAgentRuntime {
33
33
  ...(config.env ?? {}),
34
34
  };
35
35
  }
36
- async close() {
37
- await this.resetController();
36
+ async close(options = {}) {
37
+ await this.resetController(options.signal, options);
38
38
  }
39
39
  async run(input) {
40
40
  await input.effects.recordRuntime('runtime.started', {
@@ -183,13 +183,15 @@ export class ClaudeCodeAgentRuntime {
183
183
  }
184
184
  return turn;
185
185
  }
186
- async resetController(signal = 'SIGTERM') {
186
+ async resetController(signal = 'SIGTERM', options = {}) {
187
187
  const controller = this.controller;
188
188
  if (!controller)
189
189
  return;
190
190
  this.controller = undefined;
191
- controller.kill(signal);
192
- await controller.completion.catch(() => { });
191
+ await terminateChildProcess(controller, {
192
+ signal,
193
+ ...(options.forceAfterMs === undefined ? {} : { forceAfterMs: options.forceAfterMs }),
194
+ });
193
195
  }
194
196
  claudeArgs(providerSession, systemPromptFilePath) {
195
197
  const args = [
@@ -1,4 +1,4 @@
1
- import { type AgentRuntime, type AgentRuntimeDrainInput, type AgentRuntimeFollowupInput, type AgentRuntimeFollowupResult, type AgentRuntimeInput, type AgentRuntimeResult, type CodexCliAgentProviderConfig } from './contract.js';
1
+ import { type AgentRuntimeCloseOptions, type AgentRuntime, type AgentRuntimeDrainInput, type AgentRuntimeFollowupInput, type AgentRuntimeFollowupResult, type AgentRuntimeInput, type AgentRuntimeResult, type CodexCliAgentProviderConfig } from './contract.js';
2
2
  export declare class CodexCliAgentRuntime implements AgentRuntime {
3
3
  readonly env: Record<string, string> | undefined;
4
4
  readonly kind = "codex-cli";
@@ -6,7 +6,7 @@ export declare class CodexCliAgentRuntime implements AgentRuntime {
6
6
  private controller?;
7
7
  private readonly activeRun;
8
8
  constructor(config: CodexCliAgentProviderConfig);
9
- close(): Promise<void>;
9
+ close(options?: AgentRuntimeCloseOptions): Promise<void>;
10
10
  run(input: AgentRuntimeInput): Promise<AgentRuntimeResult>;
11
11
  appendToActiveRun(input: AgentRuntimeFollowupInput): Promise<AgentRuntimeFollowupResult>;
12
12
  requestDrain(input: AgentRuntimeDrainInput): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../../server/providers/codex.ts"],"names":[],"mappings":"AAKA,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,sBAAsB,EAC3B,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,2BAA2B,EACjC,MAAM,eAAe,CAAC;AAIvB,qBAAa,oBAAqB,YAAW,YAAY;IACvD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IACjD,QAAQ,CAAC,IAAI,eAAe;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA8B;IACrD,OAAO,CAAC,UAAU,CAAC,CAA2B;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0B;gBAExC,MAAM,EAAE,2BAA2B;IAKzC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,GAAG,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAqC1D,iBAAiB,CAAC,KAAK,EAAE,yBAAyB,GAAG,OAAO,CAAC,0BAA0B,CAAC;IAaxF,YAAY,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAOhE,OAAO,CAAC,gBAAgB;YAyBV,eAAe;IAQ7B,OAAO,CAAC,YAAY;CAcrB"}
1
+ {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../../server/providers/codex.ts"],"names":[],"mappings":"AAKA,OAAO,EAEL,KAAK,wBAAwB,EAC7B,KAAK,YAAY,EACjB,KAAK,sBAAsB,EAC3B,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,2BAA2B,EACjC,MAAM,eAAe,CAAC;AAIvB,qBAAa,oBAAqB,YAAW,YAAY;IACvD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IACjD,QAAQ,CAAC,IAAI,eAAe;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA8B;IACrD,OAAO,CAAC,UAAU,CAAC,CAA2B;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0B;gBAExC,MAAM,EAAE,2BAA2B;IAKzC,KAAK,CAAC,OAAO,GAAE,wBAA6B,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5D,GAAG,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAqC1D,iBAAiB,CAAC,KAAK,EAAE,yBAAyB,GAAG,OAAO,CAAC,0BAA0B,CAAC;IAaxF,YAAY,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAOhE,OAAO,CAAC,gBAAgB;YAyBV,eAAe;IAa7B,OAAO,CAAC,YAAY;CAcrB"}
@@ -1,7 +1,7 @@
1
1
  import { nowIso } from '../ids.js';
2
2
  import { runtimeErrorPayload } from '../activities/format.js';
3
3
  import { ActiveRuntimeRun } from './active-runtime.js';
4
- import { startChildProcess } from './child-process.js';
4
+ import { startChildProcess, terminateChildProcess } from './child-process.js';
5
5
  import { CodexAppServerController } from './codex-app-server.js';
6
6
  import { providerSessionPayload, } from './contract.js';
7
7
  const CODEX_COMMAND = 'codex';
@@ -15,8 +15,8 @@ export class CodexCliAgentRuntime {
15
15
  this.config = config;
16
16
  this.env = config.env;
17
17
  }
18
- async close() {
19
- await this.resetController();
18
+ async close(options = {}) {
19
+ await this.resetController(options.signal, options);
20
20
  }
21
21
  async run(input) {
22
22
  await input.effects.recordRuntime('runtime.started', {
@@ -99,13 +99,15 @@ export class CodexCliAgentRuntime {
99
99
  });
100
100
  return controller;
101
101
  }
102
- async resetController(signal = 'SIGTERM') {
102
+ async resetController(signal = 'SIGTERM', options = {}) {
103
103
  const controller = this.controller;
104
104
  if (!controller)
105
105
  return;
106
106
  this.controller = undefined;
107
- controller.kill(signal);
108
- await controller.completion.catch(() => { });
107
+ await terminateChildProcess(controller, {
108
+ signal,
109
+ ...(options.forceAfterMs === undefined ? {} : { forceAfterMs: options.forceAfterMs }),
110
+ });
109
111
  }
110
112
  threadParams(input) {
111
113
  const config = {
@@ -44,10 +44,14 @@ export interface AgentRuntimeDrainInput {
44
44
  activeItemId: string;
45
45
  signal?: AbortSignal;
46
46
  }
47
+ export interface AgentRuntimeCloseOptions {
48
+ forceAfterMs?: number;
49
+ signal?: NodeJS.Signals;
50
+ }
47
51
  export interface AgentRuntime {
48
52
  readonly env?: Record<string, string>;
49
53
  readonly kind: string;
50
- close?(): Promise<void>;
54
+ close?(options?: AgentRuntimeCloseOptions): Promise<void>;
51
55
  run(input: AgentRuntimeInput): Promise<AgentRuntimeResult>;
52
56
  appendToActiveRun(input: AgentRuntimeFollowupInput): Promise<AgentRuntimeFollowupResult>;
53
57
  requestDrain?(input: AgentRuntimeDrainInput): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../../server/providers/contract.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../../server/providers/contract.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { type AgentRuntime, type AgentRuntimeDrainInput, type AgentRuntimeFollowupInput, type AgentRuntimeFollowupResult, type AgentRuntimeInput, type AgentRuntimeResult, type KimiCliAgentProviderConfig } from './contract.js';
1
+ import { type AgentRuntimeCloseOptions, type AgentRuntime, type AgentRuntimeDrainInput, type AgentRuntimeFollowupInput, type AgentRuntimeFollowupResult, type AgentRuntimeInput, type AgentRuntimeResult, type KimiCliAgentProviderConfig } from './contract.js';
2
2
  export declare class KimiCliAgentRuntime implements AgentRuntime {
3
3
  readonly env: Record<string, string> | undefined;
4
4
  readonly kind = "kimi-cli";
@@ -6,7 +6,7 @@ export declare class KimiCliAgentRuntime implements AgentRuntime {
6
6
  private controller?;
7
7
  private readonly activeRun;
8
8
  constructor(config: KimiCliAgentProviderConfig);
9
- close(): Promise<void>;
9
+ close(options?: AgentRuntimeCloseOptions): Promise<void>;
10
10
  run(input: AgentRuntimeInput): Promise<AgentRuntimeResult>;
11
11
  appendToActiveRun(input: AgentRuntimeFollowupInput): Promise<AgentRuntimeFollowupResult>;
12
12
  requestDrain(input: AgentRuntimeDrainInput): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"kimi.d.ts","sourceRoot":"","sources":["../../../server/providers/kimi.ts"],"names":[],"mappings":"AAUA,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,sBAAsB,EAC3B,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,0BAA0B,EAChC,MAAM,eAAe,CAAC;AAKvB,qBAAa,mBAAoB,YAAW,YAAY;IACtD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IACjD,QAAQ,CAAC,IAAI,cAAc;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6B;IACpD,OAAO,CAAC,UAAU,CAAC,CAAqB;IACxC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0B;gBAExC,MAAM,EAAE,0BAA0B;IAKxC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,GAAG,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA8B1D,iBAAiB,CAAC,KAAK,EAAE,yBAAyB,GAAG,OAAO,CAAC,0BAA0B,CAAC;IAQxF,YAAY,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;YAOlD,gBAAgB;IA8B9B,OAAO,CAAC,QAAQ;YAcF,eAAe;CAO9B"}
1
+ {"version":3,"file":"kimi.d.ts","sourceRoot":"","sources":["../../../server/providers/kimi.ts"],"names":[],"mappings":"AAUA,OAAO,EAEL,KAAK,wBAAwB,EAC7B,KAAK,YAAY,EACjB,KAAK,sBAAsB,EAC3B,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,0BAA0B,EAChC,MAAM,eAAe,CAAC;AAKvB,qBAAa,mBAAoB,YAAW,YAAY;IACtD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IACjD,QAAQ,CAAC,IAAI,cAAc;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6B;IACpD,OAAO,CAAC,UAAU,CAAC,CAAqB;IACxC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0B;gBAExC,MAAM,EAAE,0BAA0B;IAKxC,KAAK,CAAC,OAAO,GAAE,wBAA6B,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5D,GAAG,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA8B1D,iBAAiB,CAAC,KAAK,EAAE,yBAAyB,GAAG,OAAO,CAAC,0BAA0B,CAAC;IAQxF,YAAY,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;YAOlD,gBAAgB;IA8B9B,OAAO,CAAC,QAAQ;YAcF,eAAe;CAY9B"}
@@ -5,7 +5,7 @@ import { nowIso } from '../ids.js';
5
5
  import { isRecord, singleLineForActivity, stringField } from '../json.js';
6
6
  import { ActiveRuntimeRun } from './active-runtime.js';
7
7
  import { runtimeErrorPayload, truncateForActivity } from '../activities/format.js';
8
- import { startChildProcess } from './child-process.js';
8
+ import { startChildProcess, terminateChildProcess } from './child-process.js';
9
9
  import { kimiInitializeEvent, recordKimiWireEvent } from './kimi-events.js';
10
10
  import { providerSessionPayload, } from './contract.js';
11
11
  const KIMI_COMMAND = 'kimi';
@@ -20,8 +20,8 @@ export class KimiCliAgentRuntime {
20
20
  this.config = config;
21
21
  this.env = config.env;
22
22
  }
23
- async close() {
24
- await this.resetController();
23
+ async close(options = {}) {
24
+ await this.resetController(options.signal, options);
25
25
  }
26
26
  async run(input) {
27
27
  await input.effects.recordRuntime('runtime.started', {
@@ -112,13 +112,15 @@ export class KimiCliAgentRuntime {
112
112
  args.push('--model', this.config.model);
113
113
  return args;
114
114
  }
115
- async resetController(signal = 'SIGTERM') {
115
+ async resetController(signal = 'SIGTERM', options = {}) {
116
116
  const controller = this.controller;
117
117
  if (!controller)
118
118
  return;
119
119
  this.controller = undefined;
120
- controller.kill(signal);
121
- await controller.completion.catch(() => { });
120
+ await terminateChildProcess(controller, {
121
+ signal,
122
+ ...(options.forceAfterMs === undefined ? {} : { forceAfterMs: options.forceAfterMs }),
123
+ });
122
124
  }
123
125
  }
124
126
  class KimiWireController {
@@ -0,0 +1,27 @@
1
+ import { z } from 'zod';
2
+ declare const AgentRestartCommandSchema: z.ZodObject<{
3
+ agentId: z.ZodString;
4
+ reason: z.ZodLiteral<"operator_restart">;
5
+ requestId: z.ZodString;
6
+ requestedAt: z.ZodString;
7
+ }, z.core.$strip>;
8
+ export type AgentRestartCommand = z.infer<typeof AgentRestartCommandSchema>;
9
+ export declare class AgentRestartCommandStore {
10
+ private readonly options;
11
+ private readonly store;
12
+ constructor(options?: {
13
+ animaHome?: string;
14
+ });
15
+ directory(): string;
16
+ filename(): string;
17
+ path(): string;
18
+ ensureDirectory(): Promise<void>;
19
+ request(agentId: string): Promise<AgentRestartCommand>;
20
+ pendingAgentIds(): Promise<string[]>;
21
+ take(agentId: string): Promise<AgentRestartCommand | undefined>;
22
+ clear(agentId: string): Promise<void>;
23
+ private animaHome;
24
+ }
25
+ export declare const defaultAgentRestartCommandStore: AgentRestartCommandStore;
26
+ export {};
27
+ //# sourceMappingURL=agent-restart-command.store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-restart-command.store.d.ts","sourceRoot":"","sources":["../../../server/runtime/agent-restart-command.store.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB,QAAA,MAAM,yBAAyB;;;;;iBAK7B,CAAC;AAMH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E,qBAAa,wBAAwB;IAGvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA+D;gBAExD,OAAO,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO;IAQjE,SAAS,IAAI,MAAM;IAInB,QAAQ,IAAI,MAAM;IAIlB,IAAI,IAAI,MAAM;IAIR,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAIhC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAgBtD,eAAe,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAIpC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC;IAY/D,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS3C,OAAO,CAAC,SAAS;CAGlB;AAED,eAAO,MAAM,+BAA+B,0BAAiC,CAAC"}
@@ -0,0 +1,84 @@
1
+ import { mkdir } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { randomUUID } from 'node:crypto';
4
+ import { z } from 'zod';
5
+ import { resolveAnimaHome } from '../anima-home.js';
6
+ import { nowIso } from '../ids.js';
7
+ import { JsonStore } from '../storage/json-store.js';
8
+ const RESTART_COMMANDS_FILE = 'agent-restart-requests.json';
9
+ const AgentRestartCommandSchema = z.object({
10
+ agentId: z.string().min(1),
11
+ reason: z.literal('operator_restart'),
12
+ requestId: z.string().min(1),
13
+ requestedAt: z.string().min(1),
14
+ });
15
+ const AgentRestartCommandStoreSchema = z.object({
16
+ requests: z.record(z.string(), AgentRestartCommandSchema),
17
+ });
18
+ export class AgentRestartCommandStore {
19
+ options;
20
+ store;
21
+ constructor(options = {}) {
22
+ this.options = options;
23
+ this.store = new JsonStore({
24
+ empty: () => ({ requests: {} }),
25
+ parse: (value) => AgentRestartCommandStoreSchema.parse(value),
26
+ path: () => this.path(),
27
+ });
28
+ }
29
+ directory() {
30
+ return join(this.animaHome(), 'run');
31
+ }
32
+ filename() {
33
+ return RESTART_COMMANDS_FILE;
34
+ }
35
+ path() {
36
+ return join(this.directory(), this.filename());
37
+ }
38
+ async ensureDirectory() {
39
+ await mkdir(this.directory(), { recursive: true });
40
+ }
41
+ async request(agentId) {
42
+ const command = {
43
+ agentId,
44
+ reason: 'operator_restart',
45
+ requestId: randomUUID(),
46
+ requestedAt: nowIso(),
47
+ };
48
+ await this.store.update((current) => ({
49
+ requests: {
50
+ ...current.requests,
51
+ [agentId]: command,
52
+ },
53
+ }));
54
+ return command;
55
+ }
56
+ async pendingAgentIds() {
57
+ return Object.keys((await this.store.read()).requests).sort();
58
+ }
59
+ async take(agentId) {
60
+ let command;
61
+ await this.store.update((current) => {
62
+ command = current.requests[agentId];
63
+ if (!command)
64
+ return current;
65
+ const next = { ...current.requests };
66
+ delete next[agentId];
67
+ return { requests: next };
68
+ });
69
+ return command;
70
+ }
71
+ async clear(agentId) {
72
+ await this.store.update((current) => {
73
+ if (!current.requests[agentId])
74
+ return current;
75
+ const next = { ...current.requests };
76
+ delete next[agentId];
77
+ return { requests: next };
78
+ });
79
+ }
80
+ animaHome() {
81
+ return this.options.animaHome ?? resolveAnimaHome();
82
+ }
83
+ }
84
+ export const defaultAgentRestartCommandStore = new AgentRestartCommandStore();
@@ -1,4 +1,5 @@
1
1
  import type { AgentRuntime } from '../providers/contract.js';
2
+ import { type AgentRuntimeWorkerCloseOptions } from './runtime-worker.js';
2
3
  import type { RuntimeWorkerConfig } from './types.js';
3
4
  interface RunningAgentOptions extends RuntimeWorkerConfig {
4
5
  agentRuntime: AgentRuntime;
@@ -8,9 +9,7 @@ interface RunningAgentOptions extends RuntimeWorkerConfig {
8
9
  }
9
10
  export interface RunningAgentHandle {
10
11
  isActive?(): boolean;
11
- stop(options?: {
12
- drainActive?: boolean;
13
- }): Promise<void>;
12
+ stop(options?: AgentRuntimeWorkerCloseOptions): Promise<void>;
14
13
  }
15
14
  export declare function startRunningAgent(options: RunningAgentOptions): Promise<RunningAgentHandle>;
16
15
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"agent-runner.d.ts","sourceRoot":"","sources":["../../../server/runtime/agent-runner.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE7D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAGtD,UAAU,mBAAoB,SAAQ,mBAAmB;IACvD,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,OAAO,CAAC;IACrB,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1D;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA2CjG"}
1
+ {"version":3,"file":"agent-runner.d.ts","sourceRoot":"","sources":["../../../server/runtime/agent-runner.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAsB,KAAK,8BAA8B,EAAE,MAAM,qBAAqB,CAAC;AAC9F,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAGtD,UAAU,mBAAoB,SAAQ,mBAAmB;IACvD,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,OAAO,CAAC;IACrB,IAAI,CAAC,OAAO,CAAC,EAAE,8BAA8B,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/D;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA2CjG"}
@@ -44,7 +44,7 @@ export async function startRunningAgent(options) {
44
44
  async stop(stopOptions = {}) {
45
45
  await Promise.allSettled([
46
46
  subscriber.stop(),
47
- worker.close({ drainActive: stopOptions.drainActive }),
47
+ worker.close(stopOptions),
48
48
  ]);
49
49
  },
50
50
  };
@@ -1,4 +1,5 @@
1
1
  import type { AgentConfig } from '../../shared/agent-config.js';
2
+ import { AgentRestartCommandStore } from './agent-restart-command.store.js';
2
3
  import { type RunningAgentHandle } from './agent-runner.js';
3
4
  export interface RuntimeHostOptions {
4
5
  agent?: string;
@@ -7,9 +8,11 @@ export interface RuntimeHostOptions {
7
8
  export type { RunningAgentHandle } from './agent-runner.js';
8
9
  export interface RuntimeHostDependencies {
9
10
  animaHome?: string;
11
+ forceRestartTimeoutMs?: number;
10
12
  loadAgents?: (opts: RuntimeHostOptions) => Promise<AgentConfig[]>;
11
13
  ensureDefaultSkills?: () => Promise<void>;
12
14
  logger?: Pick<Console, 'error' | 'log'>;
15
+ restartCommands?: AgentRestartCommandStore;
13
16
  startAgent?: (agent: AgentConfig, animaHome: string) => Promise<RunningAgentHandle>;
14
17
  validateAgent?: (agent: AgentConfig) => Promise<void> | void;
15
18
  }
@@ -21,12 +24,15 @@ export declare class RuntimeHost {
21
24
  private readonly loadAgents;
22
25
  private readonly ensureDefaultSkills;
23
26
  private readonly logger;
27
+ private readonly restartCommands;
28
+ private readonly forceRestartTimeoutMs;
24
29
  private readonly startAgent;
25
30
  private readonly statusByAgent;
26
31
  private readonly validateAgent;
27
32
  private pollTimer?;
28
33
  private reconcile?;
29
34
  private readonly configWatchers;
35
+ private restartCommandWatcher?;
30
36
  private configWatchDebounce?;
31
37
  constructor(opts?: RuntimeHostOptions, deps?: RuntimeHostDependencies);
32
38
  start(): Promise<void>;
@@ -34,13 +40,17 @@ export declare class RuntimeHost {
34
40
  reconcileOnce(): Promise<void>;
35
41
  runningAgentIds(): string[];
36
42
  private reconcileAgents;
43
+ private forceRestartAgent;
37
44
  private reconcileRunningAgent;
38
45
  private startAndStore;
39
46
  private stopMissingAgents;
47
+ private clearMissingRestartCommands;
40
48
  private logAgentStatus;
41
49
  private syncConfigWatchers;
42
50
  private scheduleConfigReconcile;
43
51
  private closeConfigWatchers;
52
+ private syncRestartCommandWatcher;
53
+ private closeRestartCommandWatcher;
44
54
  }
45
55
  export declare function loadRuntimeAgents(opts?: RuntimeHostOptions): Promise<AgentConfig[]>;
46
56
  //# sourceMappingURL=host.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../../server/runtime/host.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAqB,KAAK,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAG/E,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAO5D,MAAM,WAAW,uBAAuB;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAClE,mBAAmB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,KAAK,CAAC,CAAC;IACxC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACpF,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAC9D;AAKD,wBAAsB,gBAAgB,CAAC,IAAI,GAAE,kBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAMnF;AAED,qBAAa,WAAW;IAepB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAdvB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAyC;IACtE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAuD;IAClF,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAsB;IAC1D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiC;IACxD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyE;IACpG,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA6B;IAC3D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA+C;IAC7E,OAAO,CAAC,SAAS,CAAC,CAAiB;IACnC,OAAO,CAAC,SAAS,CAAC,CAAgB;IAClC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgC;IAC/D,OAAO,CAAC,mBAAmB,CAAC,CAAiB;gBAG1B,IAAI,GAAE,kBAAuB,EAC9C,IAAI,GAAE,uBAA4B;IAY9B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAYtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAkBrB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAWpC,eAAe,IAAI,MAAM,EAAE;YAIb,eAAe;YAgCf,qBAAqB;YAmCrB,aAAa;YAMb,iBAAiB;IAgB/B,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,kBAAkB;IAiC1B,OAAO,CAAC,uBAAuB;IAU/B,OAAO,CAAC,mBAAmB;CAI5B;AAED,wBAAsB,iBAAiB,CAAC,IAAI,GAAE,kBAAuB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAG7F"}
1
+ {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../../server/runtime/host.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EACL,wBAAwB,EAEzB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAqB,KAAK,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAG/E,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAO5D,MAAM,WAAW,uBAAuB;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAClE,mBAAmB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,KAAK,CAAC,CAAC;IACxC,eAAe,CAAC,EAAE,wBAAwB,CAAC;IAC3C,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACpF,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAC9D;AAMD,wBAAsB,gBAAgB,CAAC,IAAI,GAAE,kBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAMnF;AAED,qBAAa,WAAW;IAkBpB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAjBvB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAyC;IACtE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAuD;IAClF,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAsB;IAC1D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiC;IACxD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA2B;IAC3D,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAS;IAC/C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyE;IACpG,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA6B;IAC3D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA+C;IAC7E,OAAO,CAAC,SAAS,CAAC,CAAiB;IACnC,OAAO,CAAC,SAAS,CAAC,CAAgB;IAClC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgC;IAC/D,OAAO,CAAC,qBAAqB,CAAC,CAAY;IAC1C,OAAO,CAAC,mBAAmB,CAAC,CAAiB;gBAG1B,IAAI,GAAE,kBAAuB,EAC9C,IAAI,GAAE,uBAA4B;IAc9B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IActB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBrB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAWpC,eAAe,IAAI,MAAM,EAAE;YAIb,eAAe;YAyCf,iBAAiB;YAwBjB,qBAAqB;YAmCrB,aAAa;YAMb,iBAAiB;YAgBjB,2BAA2B;IAWzC,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,kBAAkB;IAiC1B,OAAO,CAAC,uBAAuB;IAU/B,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,yBAAyB;IAmBjC,OAAO,CAAC,0BAA0B;CAInC;AAED,wBAAsB,iBAAiB,CAAC,IAAI,GAAE,kBAAuB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAG7F"}
@@ -7,9 +7,11 @@ import { resolveAnimaHome } from '../anima-home.js';
7
7
  import { errorMessage } from '../ids.js';
8
8
  import { createAgentRuntime } from '../providers/factory.js';
9
9
  import { createSlackWebClient } from '../slack/client.js';
10
+ import { AgentRestartCommandStore, } from './agent-restart-command.store.js';
10
11
  import { startRunningAgent } from './agent-runner.js';
11
12
  const DEFAULT_RECONCILE_INTERVAL_MS = 30_000;
12
13
  const CONFIG_WATCH_DEBOUNCE_MS = 150;
14
+ const AGENT_RESTART_FORCE_KILL_AFTER_MS = 5_000;
13
15
  export async function startRuntimeHost(opts = {}) {
14
16
  const host = new RuntimeHost(opts);
15
17
  await host.start();
@@ -24,12 +26,15 @@ export class RuntimeHost {
24
26
  loadAgents;
25
27
  ensureDefaultSkills;
26
28
  logger;
29
+ restartCommands;
30
+ forceRestartTimeoutMs;
27
31
  startAgent;
28
32
  statusByAgent = new Map();
29
33
  validateAgent;
30
34
  pollTimer;
31
35
  reconcile;
32
36
  configWatchers = new Map();
37
+ restartCommandWatcher;
33
38
  configWatchDebounce;
34
39
  constructor(opts = {}, deps = {}) {
35
40
  this.opts = opts;
@@ -39,10 +44,14 @@ export class RuntimeHost {
39
44
  await ensureDefaultSkills();
40
45
  });
41
46
  this.logger = deps.logger ?? console;
47
+ this.restartCommands = deps.restartCommands ?? new AgentRestartCommandStore({ animaHome: this.animaHome });
48
+ this.forceRestartTimeoutMs = deps.forceRestartTimeoutMs ?? AGENT_RESTART_FORCE_KILL_AFTER_MS;
42
49
  this.startAgent = deps.startAgent ?? startAgentFromConfig;
43
50
  this.validateAgent = deps.validateAgent ?? validateAgentConfig;
44
51
  }
45
52
  async start() {
53
+ await this.restartCommands.ensureDirectory();
54
+ this.syncRestartCommandWatcher();
46
55
  await this.ensureDefaultSkills().catch((error) => {
47
56
  this.logger.error(`Default skill setup failed: ${errorMessage(error)}`);
48
57
  });
@@ -63,6 +72,7 @@ export class RuntimeHost {
63
72
  this.configWatchDebounce = undefined;
64
73
  }
65
74
  this.closeConfigWatchers();
75
+ this.closeRestartCommandWatcher();
66
76
  await this.reconcile?.catch((error) => {
67
77
  this.logger.error(`Runtime host reconcile failed while stopping: ${errorMessage(error)}`);
68
78
  });
@@ -89,6 +99,7 @@ export class RuntimeHost {
89
99
  async reconcileAgents() {
90
100
  const agents = await this.loadAgents(this.opts);
91
101
  this.syncConfigWatchers(agents.map((agent) => agent.id));
102
+ const pendingRestartAgentIds = new Set(await this.restartCommands.pendingAgentIds());
92
103
  const seenAgentIds = new Set();
93
104
  for (const agent of agents) {
94
105
  seenAgentIds.add(agent.id);
@@ -96,6 +107,13 @@ export class RuntimeHost {
96
107
  try {
97
108
  await this.validateAgent(agent);
98
109
  const skipStatus = agentSkipStatus(agent);
110
+ const restartCommand = pendingRestartAgentIds.has(agent.id)
111
+ ? await this.restartCommands.take(agent.id)
112
+ : undefined;
113
+ if (restartCommand) {
114
+ await this.forceRestartAgent(agent, running, skipStatus, restartCommand);
115
+ continue;
116
+ }
99
117
  if (running) {
100
118
  await this.reconcileRunningAgent(agent, running, skipStatus);
101
119
  continue;
@@ -116,9 +134,29 @@ export class RuntimeHost {
116
134
  });
117
135
  }
118
136
  }
137
+ await this.clearMissingRestartCommands(seenAgentIds, pendingRestartAgentIds);
119
138
  if (!this.opts.agent)
120
139
  await this.stopMissingAgents(seenAgentIds);
121
140
  }
141
+ async forceRestartAgent(agent, running, skipStatus, command) {
142
+ if (skipStatus) {
143
+ this.logAgentStatus(agent.id, `restart-skip:${skipStatus}`, () => {
144
+ this.logger.log(`Agent ${agent.id}: restart ${command.requestId} skipped; ${skipStatus}.`);
145
+ });
146
+ if (running)
147
+ await this.reconcileRunningAgent(agent, running, skipStatus);
148
+ return;
149
+ }
150
+ this.logger.log(`Agent ${agent.id}: restart requested by operator (${command.requestId}).`);
151
+ if (running) {
152
+ await running.handle.stop({
153
+ abortReason: command.reason,
154
+ forceAfterMs: this.forceRestartTimeoutMs,
155
+ });
156
+ this.agentHandles.delete(agent.id);
157
+ }
158
+ await this.startAndStore(agent);
159
+ }
122
160
  async reconcileRunningAgent(agent, running, skipStatus) {
123
161
  if (skipStatus) {
124
162
  if (isHandleActive(running.handle)) {
@@ -169,6 +207,14 @@ export class RuntimeHost {
169
207
  this.logger.log(`Agent ${agentId}: removed from config; stopped.`);
170
208
  }
171
209
  }
210
+ async clearMissingRestartCommands(seenAgentIds, pendingRestartAgentIds) {
211
+ for (const agentId of pendingRestartAgentIds) {
212
+ if (seenAgentIds.has(agentId))
213
+ continue;
214
+ await this.restartCommands.clear(agentId);
215
+ this.logger.log(`Agent ${agentId}: restart request discarded; agent not found.`);
216
+ }
217
+ }
172
218
  logAgentStatus(agentId, status, write) {
173
219
  if (this.statusByAgent.get(agentId) === status)
174
220
  return;
@@ -227,6 +273,32 @@ export class RuntimeHost {
227
273
  watcher.close();
228
274
  this.configWatchers.clear();
229
275
  }
276
+ syncRestartCommandWatcher() {
277
+ if (this.restartCommandWatcher)
278
+ return;
279
+ const runDir = this.restartCommands.directory();
280
+ try {
281
+ const watcher = watch(runDir, { persistent: false }, (_event, filename) => {
282
+ if (filename && filename.toString() !== this.restartCommands.filename())
283
+ return;
284
+ this.scheduleConfigReconcile();
285
+ });
286
+ watcher.on('error', (error) => {
287
+ this.logger.error(`Runtime host restart-command watcher failed for ${runDir}: ${errorMessage(error)}`);
288
+ watcher.close();
289
+ if (this.restartCommandWatcher === watcher)
290
+ this.restartCommandWatcher = undefined;
291
+ });
292
+ this.restartCommandWatcher = watcher;
293
+ }
294
+ catch (error) {
295
+ this.logger.error(`Runtime host restart-command watcher failed for ${runDir}: ${errorMessage(error)}`);
296
+ }
297
+ }
298
+ closeRestartCommandWatcher() {
299
+ this.restartCommandWatcher?.close();
300
+ this.restartCommandWatcher = undefined;
301
+ }
230
302
  }
231
303
  export async function loadRuntimeAgents(opts = {}) {
232
304
  if (opts.agent)