@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.
- package/dist/server/providers/child-process.d.ts +7 -0
- package/dist/server/providers/child-process.d.ts.map +1 -1
- package/dist/server/providers/child-process.js +19 -0
- package/dist/server/providers/claude.d.ts +2 -2
- package/dist/server/providers/claude.d.ts.map +1 -1
- package/dist/server/providers/claude.js +8 -6
- package/dist/server/providers/codex.d.ts +2 -2
- package/dist/server/providers/codex.d.ts.map +1 -1
- package/dist/server/providers/codex.js +8 -6
- package/dist/server/providers/contract.d.ts +5 -1
- package/dist/server/providers/contract.d.ts.map +1 -1
- package/dist/server/providers/kimi.d.ts +2 -2
- package/dist/server/providers/kimi.d.ts.map +1 -1
- package/dist/server/providers/kimi.js +8 -6
- package/dist/server/runtime/agent-restart-command.store.d.ts +27 -0
- package/dist/server/runtime/agent-restart-command.store.d.ts.map +1 -0
- package/dist/server/runtime/agent-restart-command.store.js +84 -0
- package/dist/server/runtime/agent-runner.d.ts +2 -3
- package/dist/server/runtime/agent-runner.d.ts.map +1 -1
- package/dist/server/runtime/agent-runner.js +1 -1
- package/dist/server/runtime/host.d.ts +10 -0
- package/dist/server/runtime/host.d.ts.map +1 -1
- package/dist/server/runtime/host.js +72 -0
- package/dist/server/runtime/runtime-worker.d.ts +7 -4
- package/dist/server/runtime/runtime-worker.d.ts.map +1 -1
- package/dist/server/runtime/runtime-worker.js +7 -3
- package/dist/server/runtime/runtime.service.d.ts +3 -0
- package/dist/server/runtime/runtime.service.d.ts.map +1 -1
- package/dist/server/runtime/runtime.service.js +10 -0
- package/dist/server/runtime/types.d.ts +1 -1
- package/dist/server/runtime/types.d.ts.map +1 -1
- package/dist/server/tests/runtime-worker.test.js +51 -0
- package/dist/server/tests/runtime.test.js +102 -3
- package/dist/server/tests/web-api.test.js +57 -0
- package/dist/server/web/agent-routes.d.ts.map +1 -1
- package/dist/server/web/agent-routes.js +4 -0
- package/dist/shared/activity.d.ts +1 -1
- package/dist/shared/activity.d.ts.map +1 -1
- package/dist/web/assets/{activity-DHjip8tY.js → activity-CxRY8Svf.js} +2 -2
- package/dist/web/assets/{clipboard-D2NSC52v.js → clipboard-BQwkQdnx.js} +1 -1
- package/dist/web/assets/{external-link-Bhr1WdRS.js → external-link-B1-TzIvP.js} +1 -1
- package/dist/web/assets/{file-text-CYMA_SMA.js → file-text-DLLVzqjf.js} +1 -1
- package/dist/web/assets/{index-CVpew409.js → index-DnbAPTX8.js} +6 -6
- package/dist/web/assets/{index-mh0uJTkY.css → index-J_OIXqpN.css} +1 -1
- package/dist/web/assets/{kb-DDVpYkT9.js → kb-Dcc1XQBf.js} +1 -1
- package/dist/web/assets/profile-DrTGJ7WI.js +1 -0
- package/dist/web/assets/{reminders-Bbwb9QNT.js → reminders-BYsvC5NC.js} +1 -1
- package/dist/web/index.html +2 -2
- package/package.json +1 -1
- 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,
|
|
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
|
|
192
|
-
|
|
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,
|
|
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
|
|
108
|
-
|
|
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":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,6BAA6B,EAC7B,2BAA2B,EAC3B,0BAA0B,EAC3B,MAAM,8BAA8B,CAAC;AAEtC,YAAY,EACV,mBAAmB,EACnB,6BAA6B,EAC7B,2BAA2B,EAC3B,0BAA0B,GAC3B,CAAC;AAEF,eAAO,MAAM,kCAAkC,SAAS,CAAC;AAEzD,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,qBAAqB,GAAG,SAAS,EAC1C,IAAI,EAAE,MAAM,GACX,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzB;AAED,MAAM,WAAW,mBAAmB;IAClC,sBAAsB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5F,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,YAAY,CAAC,MAAM,EAAE,QAAQ,GAAG,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,aAAa,CACX,IAAI,EAAE,iBAAiB,GAAG,mBAAmB,GAAG,gBAAgB,EAChE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpE;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,mBAAmB,CAAC;IAC7B,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,qBAAqB,CAAC;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,yBAAyB;IACxC,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,
|
|
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,
|
|
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
|
|
121
|
-
|
|
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;
|
|
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"}
|
|
@@ -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;
|
|
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)
|