echo-cli-agent 0.1.4 → 0.1.6

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.
@@ -22,7 +22,10 @@ export class AgentRuntime {
22
22
  startedAt = new Date().toISOString();
23
23
  constructor(config) {
24
24
  this.config = config;
25
- this.logger = createDiagnosticLogger(config.logFile, { level: config.logLevel });
25
+ this.logger = createDiagnosticLogger(config.logFile, {
26
+ level: config.logLevel,
27
+ maxAgeMs: 5 * 60 * 1_000
28
+ });
26
29
  this.state = new StateStore(config.stateFile);
27
30
  }
28
31
  async start() {
@@ -34,7 +37,7 @@ export class AgentRuntime {
34
37
  const deviceId = this.config.deviceId;
35
38
  this.sessions = new SessionManager(this.config, this.state, this.logger);
36
39
  this.client = new TaskMcpClient(this.config, deviceId, this.logger);
37
- const dispatcher = new Dispatcher(this.sessions, this.state, this.client, this.logger);
40
+ const dispatcher = new Dispatcher(this.sessions, this.state, this.client, this.logger, this.config);
38
41
  this.client.on('message', (message) => dispatcher.accept(message));
39
42
  this.health = new HealthServer(this.config.healthHost, this.config.healthPort, () => ({
40
43
  deviceId,
@@ -1 +1 @@
1
- {"version":3,"file":"agent-runtime.js","sourceRoot":"","sources":["../../../src/runtime/agent-runtime.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAA;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAC9D,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAA;AAIjF,MAAM,UAAU,kBAAkB,CAChC,UAA6B,EAC7B,MAA0C;IAE1C,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IACpG,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,QAAQ,CAAA;IACxC,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;AAC9H,CAAC;AAED,MAAM,OAAO,YAAY;IAQM;IAPZ,MAAM,CAAA;IACN,KAAK,CAAA;IACd,QAAQ,CAAiB;IACzB,MAAM,CAAgB;IACtB,MAAM,CAAe;IACZ,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IAErD,YAA6B,MAAmB;QAAnB,WAAM,GAAN,MAAM,CAAa;QAC9C,IAAI,CAAC,MAAM,GAAG,sBAAsB,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAA;QAChF,IAAI,CAAC,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IAC/C,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,SAAS,GAAG,MAAM,gBAAgB,EAAE,CAAA;QAC1C,IAAI,SAAS,CAAC,EAAE;YAAE,iBAAiB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;QACvD,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,cAAc,EAAE,CAAC,CAAA;QACzF,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAA;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAA;QACrC,IAAI,CAAC,QAAQ,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;QACxE,IAAI,CAAC,MAAM,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;QACnE,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;QACtF,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAA;QAElE,IAAI,CAAC,MAAM,GAAG,IAAI,YAAY,CAC5B,IAAI,CAAC,MAAM,CAAC,UAAU,EACtB,IAAI,CAAC,MAAM,CAAC,UAAU,EACtB,GAAG,EAAE,CAAC,CAAC;YACL,QAAQ;YACR,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,IAAI,KAAK;YAC1C,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;YACtC,cAAc,EAAE,IAAI,CAAC,QAAQ,EAAE,WAAW,IAAI,CAAC;YAC/C,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,IAAI;YACtC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;SAC9B,CAAC,EACF,IAAI,CAAC,MAAM,CAAC,OAAO,EACnB,IAAI,CAAC,MAAM,CACZ,CAAA;QAED,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;QACzB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;QACnB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE;YAChC,QAAQ;YACR,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;YAClC,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;SACvC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAA;QACnB,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAA;QACxB,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAA;QACzB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;QACjC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;IACrB,CAAC;CACF"}
1
+ {"version":3,"file":"agent-runtime.js","sourceRoot":"","sources":["../../../src/runtime/agent-runtime.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import type { ExecScriptAck } from '../types/protocol.js';
1
2
  export type RunStatus = 'received' | 'delivered' | 'completed' | 'failed';
2
3
  export type RunRecord = {
3
4
  runId: string;
@@ -23,6 +24,12 @@ export type CliWindowRecord = {
23
24
  workdir: string;
24
25
  updatedAt: string;
25
26
  };
27
+ export type ExecScriptRecord = {
28
+ logId: string;
29
+ status: 'running' | 'completed';
30
+ ack?: ExecScriptAck;
31
+ updatedAt: string;
32
+ };
26
33
  export declare class StateStore {
27
34
  private readonly filePath;
28
35
  private state?;
@@ -36,6 +43,9 @@ export declare class StateStore {
36
43
  removeSession(sessionKey: string): Promise<void>;
37
44
  getCliWindow(taskId: string, agentType: string): CliWindowRecord | undefined;
38
45
  upsertCliWindow(record: CliWindowRecord): Promise<void>;
46
+ getExecScript(logId: string): ExecScriptRecord | undefined;
47
+ markExecScriptRunning(logId: string): Promise<void>;
48
+ markExecScriptCompleted(logId: string, ack: ExecScriptAck): Promise<void>;
39
49
  listCliWindows(agentType?: string): CliWindowRecord[];
40
50
  snapshot(): {
41
51
  runs: number;
@@ -1,6 +1,7 @@
1
1
  import { chmod, mkdir, readFile, rename, writeFile } from 'node:fs/promises';
2
2
  import { dirname } from 'node:path';
3
3
  const MAX_RUNS = 2_000;
4
+ const MAX_EXEC_SCRIPT_RECORDS = 500;
4
5
  export class StateStore {
5
6
  filePath;
6
7
  state;
@@ -13,14 +14,15 @@ export class StateStore {
13
14
  try {
14
15
  const raw = await readFile(this.filePath, 'utf8');
15
16
  const parsed = JSON.parse(raw);
16
- if (parsed.version === 1 || parsed.version === 2 || parsed.version === 3) {
17
+ if (parsed.version === 1 || parsed.version === 2 || parsed.version === 3 || parsed.version === 4) {
17
18
  this.state = {
18
- version: 3,
19
+ version: 4,
19
20
  runs: parsed.runs ?? {},
20
21
  sessions: parsed.sessions ?? {},
21
- cliWindows: parsed.cliWindows ?? {}
22
+ cliWindows: parsed.cliWindows ?? {},
23
+ execScripts: parsed.execScripts ?? {}
22
24
  };
23
- if (parsed.version !== 3)
25
+ if (parsed.version !== 4)
24
26
  await this.persist();
25
27
  }
26
28
  else {
@@ -36,10 +38,11 @@ export class StateStore {
36
38
  throw error;
37
39
  }
38
40
  this.state = {
39
- version: 3,
41
+ version: 4,
40
42
  runs: {},
41
43
  sessions: {},
42
- cliWindows: {}
44
+ cliWindows: {},
45
+ execScripts: {}
43
46
  };
44
47
  await this.persist();
45
48
  }
@@ -85,6 +88,34 @@ export class StateStore {
85
88
  this.requireState().cliWindows[this.cliWindowKey(record.taskId, record.agentType)] = record;
86
89
  await this.persist();
87
90
  }
91
+ getExecScript(logId) {
92
+ return this.requireState().execScripts[logId];
93
+ }
94
+ async markExecScriptRunning(logId) {
95
+ this.requireState().execScripts[logId] = {
96
+ logId,
97
+ status: 'running',
98
+ updatedAt: new Date().toISOString()
99
+ };
100
+ await this.persist();
101
+ }
102
+ async markExecScriptCompleted(logId, ack) {
103
+ const state = this.requireState();
104
+ state.execScripts[logId] = {
105
+ logId,
106
+ status: 'completed',
107
+ ack,
108
+ updatedAt: new Date().toISOString()
109
+ };
110
+ const entries = Object.values(state.execScripts);
111
+ if (entries.length > MAX_EXEC_SCRIPT_RECORDS) {
112
+ entries
113
+ .sort((left, right) => left.updatedAt.localeCompare(right.updatedAt))
114
+ .slice(0, entries.length - MAX_EXEC_SCRIPT_RECORDS)
115
+ .forEach((entry) => delete state.execScripts[entry.logId]);
116
+ }
117
+ await this.persist();
118
+ }
88
119
  listCliWindows(agentType) {
89
120
  const normalized = agentType?.toLowerCase();
90
121
  return Object.values(this.requireState().cliWindows)
@@ -1 +1 @@
1
- {"version":3,"file":"state-store.js","sourceRoot":"","sources":["../../../src/state/state-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"state-store.js","sourceRoot":"","sources":["../../../src/state/state-store.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { EventEmitter } from 'node:events';
2
2
  import type { AgentConfig } from '../config.js';
3
3
  import type { DiagnosticLogger } from '../logging/diagnostic-log.js';
4
- import type { AgentCliAck, AgentCliControlAck, AgentCliEvent } from '../types/protocol.js';
4
+ import type { AgentCliAck, AgentCliControlAck, AgentCliEvent, ExecScriptAck, WorkspaceAck } from '../types/protocol.js';
5
5
  type ClientEvents = {
6
6
  message: [unknown];
7
7
  connection: [boolean];
@@ -22,6 +22,8 @@ export declare class TaskMcpClient extends EventEmitter<ClientEvents> {
22
22
  sendEvent(event: AgentCliEvent): Promise<void>;
23
23
  sendAck(ack: AgentCliAck): Promise<void>;
24
24
  sendControlAck(ack: AgentCliControlAck): Promise<void>;
25
+ sendExecScriptAck(ack: ExecScriptAck): Promise<void>;
26
+ sendWorkspaceAck(ack: WorkspaceAck): Promise<void>;
25
27
  private send;
26
28
  private connect;
27
29
  private scheduleReconnect;
@@ -40,6 +40,12 @@ export class TaskMcpClient extends EventEmitter {
40
40
  sendControlAck(ack) {
41
41
  return this.send(ack);
42
42
  }
43
+ sendExecScriptAck(ack) {
44
+ return this.send(ack);
45
+ }
46
+ sendWorkspaceAck(ack) {
47
+ return this.send(ack);
48
+ }
43
49
  send(message) {
44
50
  return new Promise((resolveSend, rejectSend) => {
45
51
  if (!this.socket || this.socket.readyState !== WebSocket.OPEN) {
@@ -1 +1 @@
1
- {"version":3,"file":"taskmcp-client.js","sourceRoot":"","sources":["../../../src/transport/taskmcp-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"taskmcp-client.js","sourceRoot":"","sources":["../../../src/transport/taskmcp-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,SAAS,MAAM,IAAI,CAAA;AAU1B,MAAM,OAAO,aAAc,SAAQ,YAA0B;IAQxC;IACA;IACA;IATX,MAAM,CAAuB;IAC7B,OAAO,GAAG,KAAK,CAAA;IACf,YAAY,GAAG,CAAC,CAAA;IAChB,cAAc,CAA4B;IAC1C,SAAS,CAA4B;IAE7C,YACmB,MAAmB,EACnB,QAAgB,EAChB,MAAwB;QAEzC,KAAK,EAAE,CAAA;QAJU,WAAM,GAAN,MAAM,CAAa;QACnB,aAAQ,GAAR,QAAQ,CAAQ;QAChB,WAAM,GAAN,MAAM,CAAkB;IAG3C,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,MAAM,EAAE,UAAU,KAAK,SAAS,CAAC,IAAI,CAAA;IACnD,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;QACpB,IAAI,CAAC,OAAO,EAAE,CAAA;IAChB,CAAC;IAED,IAAI;QACF,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;QACnB,IAAI,IAAI,CAAC,cAAc;YAAE,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;QAC1D,IAAI,IAAI,CAAC,SAAS;YAAE,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACjD,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAA;QAC1C,IAAI,CAAC,MAAM,GAAG,SAAS,CAAA;IACzB,CAAC;IAED,SAAS,CAAC,KAAoB;QAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACzB,CAAC;IAED,OAAO,CAAC,GAAgB;QACtB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACvB,CAAC;IAED,cAAc,CAAC,GAAuB;QACpC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACvB,CAAC;IAED,iBAAiB,CAAC,GAAkB;QAClC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACvB,CAAC;IAED,gBAAgB,CAAC,GAAiB;QAChC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACvB,CAAC;IAEO,IAAI,CAAC,OAAwF;QACnG,OAAO,IAAI,OAAO,CAAC,CAAC,WAAW,EAAE,UAAU,EAAE,EAAE;YAC7C,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;gBAC9D,UAAU,CAAC,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC,CAAA;gBAC3D,OAAM;YACR,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE;gBAClD,IAAI,KAAK;oBAAE,UAAU,CAAC,KAAK,CAAC,CAAA;;oBACvB,WAAW,EAAE,CAAA;YACpB,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC;IAEO,OAAO;QACb,IAAI,IAAI,CAAC,OAAO;YAAE,OAAM;QACxB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACtC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC/C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;QAC5C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QACtD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;QACpD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QACtD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;QACxE,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,KAAK,QAAQ;YAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;QAE3F,MAAM,OAAO,GACX,IAAI,CAAC,MAAM,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;QACvF,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QACtE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QAEpB,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;YACrB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAA;YACrB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;YAClE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAA;YAC7B,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;gBAChC,oEAAoE;gBACpE,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI;oBAAE,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;YAC1E,CAAC,EAAE,MAAM,CAAC,CAAA;QACZ,CAAC,CAAC,CAAA;QAEF,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE;YAC5B,IAAI,CAAC;gBACH,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;YACnD,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAA;YAC1C,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC3B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;QACpE,CAAC,CAAC,CAAA;QAEF,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YAC1B,IAAI,IAAI,CAAC,SAAS;gBAAE,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YACjD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;YAC1B,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM;gBAAE,IAAI,CAAC,MAAM,GAAG,SAAS,CAAA;YACnD,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,CAAA;YAC9B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;YAClD,IAAI,CAAC,iBAAiB,EAAE,CAAA;QAC1B,CAAC,CAAC,CAAA;IACJ,CAAC;IAEO,iBAAiB;QACvB,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,cAAc;YAAE,OAAM;QAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,CAAA;QAC/D,MAAM,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAA;QACpD,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,GAAG,EAAE;YACpC,IAAI,CAAC,cAAc,GAAG,SAAS,CAAA;YAC/B,IAAI,CAAC,OAAO,EAAE,CAAA;QAChB,CAAC,EAAE,KAAK,CAAC,CAAA;IACX,CAAC;CACF"}
@@ -34,6 +34,73 @@ export declare const AgentCliRequestSchema: z.ZodObject<{
34
34
  }, z.core.$loose>>;
35
35
  }, z.core.$strip>;
36
36
  export type AgentCliRequest = z.infer<typeof AgentCliRequestSchema>;
37
+ export declare const ExecScriptRequestSchema: z.ZodObject<{
38
+ type: z.ZodLiteral<"exec_script">;
39
+ log_id: z.ZodString;
40
+ cmd: z.ZodString;
41
+ workdir: z.ZodNullable<z.ZodOptional<z.ZodString>>;
42
+ timeout_s: z.ZodOptional<z.ZodNumber>;
43
+ }, z.core.$strip>;
44
+ export type ExecScriptRequest = z.infer<typeof ExecScriptRequestSchema>;
45
+ export type ExecScriptAck = {
46
+ type: 'exec_script.ack';
47
+ log_id: string;
48
+ exit_code: number;
49
+ stdout: string | null;
50
+ stderr: string | null;
51
+ duration_ms: number | null;
52
+ };
53
+ export declare const WorkspaceScanRequestSchema: z.ZodObject<{
54
+ type: z.ZodLiteral<"workspace_scan">;
55
+ request_id: z.ZodString;
56
+ computer_project_id: z.ZodString;
57
+ device_id: z.ZodString;
58
+ root_path: z.ZodString;
59
+ timeout_s: z.ZodOptional<z.ZodNumber>;
60
+ }, z.core.$strip>;
61
+ export declare const WorkspaceSyncRequestSchema: z.ZodObject<{
62
+ request_id: z.ZodString;
63
+ computer_project_id: z.ZodString;
64
+ device_id: z.ZodString;
65
+ root_path: z.ZodString;
66
+ timeout_s: z.ZodOptional<z.ZodNumber>;
67
+ type: z.ZodLiteral<"workspace_sync">;
68
+ directories: z.ZodDefault<z.ZodArray<z.ZodObject<{
69
+ relative_path: z.ZodString;
70
+ }, z.core.$strip>>>;
71
+ repos: z.ZodDefault<z.ZodArray<z.ZodObject<{
72
+ relative_path: z.ZodString;
73
+ git_url: z.ZodOptional<z.ZodNullable<z.ZodString>>;
74
+ branch: z.ZodOptional<z.ZodNullable<z.ZodString>>;
75
+ }, z.core.$strip>>>;
76
+ }, z.core.$strip>;
77
+ export type WorkspaceScanRequest = z.infer<typeof WorkspaceScanRequestSchema>;
78
+ export type WorkspaceSyncRequest = z.infer<typeof WorkspaceSyncRequestSchema>;
79
+ export type WorkspaceRequest = WorkspaceScanRequest | WorkspaceSyncRequest;
80
+ export type WorkspaceNode = {
81
+ relative_path: string;
82
+ node_type: 'folder' | 'repo';
83
+ git_url?: string | null;
84
+ branch?: string | null;
85
+ commit_hash?: string | null;
86
+ };
87
+ export type WorkspaceOperationResult = {
88
+ relative_path: string;
89
+ status: 'created' | 'updated' | 'skipped' | 'failed';
90
+ error?: string;
91
+ };
92
+ export type WorkspaceAck = {
93
+ type: 'workspace_scan.ack' | 'workspace_sync.ack';
94
+ request_id: string;
95
+ computer_project_id: string;
96
+ device_id: string;
97
+ root_path: string;
98
+ status: 'done' | 'failed';
99
+ nodes: WorkspaceNode[];
100
+ results?: WorkspaceOperationResult[];
101
+ error?: string;
102
+ duration_ms: number;
103
+ };
37
104
  export type AgentCliStage = 'agent_received' | 'process_started' | 'session_initialized' | 'prompt_delivered' | 'completed' | 'process_exited' | 'failed';
38
105
  export type AgentCliEvent = {
39
106
  type: 'agent_cli.event';
@@ -35,4 +35,31 @@ export const AgentCliRequestSchema = z.object({
35
35
  });
36
36
  }
37
37
  });
38
+ export const ExecScriptRequestSchema = z.object({
39
+ type: z.literal('exec_script'),
40
+ log_id: z.string().min(1).max(128),
41
+ cmd: z.string().min(1).max(256 * 1024),
42
+ workdir: z.string().min(1).max(4_096).optional().nullable(),
43
+ timeout_s: z.number().int().positive().max(86_400).optional()
44
+ });
45
+ const WorkspaceRelativePathSchema = z.string().min(1).max(500);
46
+ export const WorkspaceScanRequestSchema = z.object({
47
+ type: z.literal('workspace_scan'),
48
+ request_id: z.string().min(1).max(128),
49
+ computer_project_id: z.string().min(1).max(128),
50
+ device_id: z.string().min(1).max(200),
51
+ root_path: z.string().min(1).max(4_096),
52
+ timeout_s: z.number().int().positive().max(3_600).optional()
53
+ });
54
+ export const WorkspaceSyncRequestSchema = WorkspaceScanRequestSchema.extend({
55
+ type: z.literal('workspace_sync'),
56
+ directories: z.array(z.object({
57
+ relative_path: WorkspaceRelativePathSchema
58
+ })).max(2_000).default([]),
59
+ repos: z.array(z.object({
60
+ relative_path: WorkspaceRelativePathSchema,
61
+ git_url: z.string().max(2_000).nullable().optional(),
62
+ branch: z.string().max(200).nullable().optional()
63
+ })).max(2_000).default([])
64
+ });
38
65
  //# sourceMappingURL=protocol.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../src/types/protocol.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../src/types/protocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { type AgentConfig } from '../config.js';
2
+ import type { DiagnosticLogger } from '../logging/diagnostic-log.js';
3
+ import type { WorkspaceAck, WorkspaceRequest } from '../types/protocol.js';
4
+ export declare class WorkspaceManager {
5
+ private readonly config;
6
+ private readonly logger;
7
+ constructor(config: AgentConfig, logger: DiagnosticLogger);
8
+ handle(request: WorkspaceRequest): Promise<WorkspaceAck>;
9
+ private validateRootPath;
10
+ private sync;
11
+ private syncRepository;
12
+ private scan;
13
+ private readGitMetadata;
14
+ private isGitRepository;
15
+ private cleanRelativePath;
16
+ private isSafeRelativePath;
17
+ private resolveWithinRoot;
18
+ private runGit;
19
+ private message;
20
+ }
@@ -0,0 +1,265 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { mkdir, opendir, realpath, stat } from 'node:fs/promises';
3
+ import { isAbsolute, relative, resolve } from 'node:path';
4
+ import { addAllowedRoot } from '../config.js';
5
+ const MAX_NODES = 2_000;
6
+ const MAX_DIRECTORY_ENTRIES = 12_000;
7
+ const IGNORED_DIRECTORIES = new Set([
8
+ '.git',
9
+ 'node_modules',
10
+ '.next',
11
+ '.nuxt',
12
+ '.cache',
13
+ 'dist',
14
+ 'build',
15
+ 'coverage',
16
+ 'target',
17
+ 'vendor'
18
+ ]);
19
+ export class WorkspaceManager {
20
+ config;
21
+ logger;
22
+ constructor(config, logger) {
23
+ this.config = config;
24
+ this.logger = logger;
25
+ }
26
+ async handle(request) {
27
+ const startedAt = Date.now();
28
+ const ackType = request.type === 'workspace_sync' ? 'workspace_sync.ack' : 'workspace_scan.ack';
29
+ try {
30
+ const rootPath = this.validateRootPath(request.root_path);
31
+ let results;
32
+ if (request.type === 'workspace_sync') {
33
+ results = await this.sync(rootPath, request);
34
+ }
35
+ const nodes = await this.scan(rootPath);
36
+ const failed = results?.some((result) => result.status === 'failed') ?? false;
37
+ return {
38
+ type: ackType,
39
+ request_id: request.request_id,
40
+ computer_project_id: request.computer_project_id,
41
+ device_id: request.device_id,
42
+ root_path: rootPath,
43
+ status: failed ? 'failed' : 'done',
44
+ nodes,
45
+ ...(results ? { results } : {}),
46
+ ...(failed ? { error: 'One or more repositories could not be synchronized.' } : {}),
47
+ duration_ms: Date.now() - startedAt
48
+ };
49
+ }
50
+ catch (error) {
51
+ return {
52
+ type: ackType,
53
+ request_id: request.request_id,
54
+ computer_project_id: request.computer_project_id,
55
+ device_id: request.device_id,
56
+ root_path: request.root_path,
57
+ status: 'failed',
58
+ nodes: [],
59
+ error: this.message(error),
60
+ duration_ms: Date.now() - startedAt
61
+ };
62
+ }
63
+ }
64
+ validateRootPath(value) {
65
+ const root = resolve(value.trim());
66
+ if (!isAbsolute(value.trim()))
67
+ throw new Error('The workspace root must be an absolute path');
68
+ if (relative(root, resolve(root, '..')) === '')
69
+ throw new Error('The filesystem root cannot be a workspace');
70
+ return root;
71
+ }
72
+ async sync(rootPath, request) {
73
+ await mkdir(rootPath, { recursive: true });
74
+ await addAllowedRoot(this.config, rootPath);
75
+ const results = [];
76
+ const requestedPaths = new Set();
77
+ for (const directory of request.directories) {
78
+ const relativePath = this.cleanRelativePath(directory.relative_path);
79
+ if (requestedPaths.has(relativePath))
80
+ continue;
81
+ requestedPaths.add(relativePath);
82
+ try {
83
+ await mkdir(this.resolveWithinRoot(rootPath, relativePath), { recursive: true });
84
+ results.push({ relative_path: relativePath, status: 'created' });
85
+ }
86
+ catch (error) {
87
+ results.push({ relative_path: relativePath, status: 'failed', error: this.message(error) });
88
+ }
89
+ }
90
+ for (const repo of request.repos) {
91
+ const relativePath = this.cleanRelativePath(repo.relative_path);
92
+ try {
93
+ results.push(await this.syncRepository(rootPath, relativePath, repo.git_url?.trim() || undefined, repo.branch?.trim() || undefined, request.timeout_s));
94
+ }
95
+ catch (error) {
96
+ results.push({ relative_path: relativePath, status: 'failed', error: this.message(error) });
97
+ }
98
+ }
99
+ return results;
100
+ }
101
+ async syncRepository(rootPath, relativePath, gitUrl, branch, timeoutSeconds) {
102
+ const target = this.resolveWithinRoot(rootPath, relativePath);
103
+ let created = false;
104
+ let metadata;
105
+ try {
106
+ metadata = await stat(target);
107
+ }
108
+ catch {
109
+ // A missing target is the normal clone case.
110
+ }
111
+ if (!metadata) {
112
+ if (!gitUrl)
113
+ throw new Error('A missing repository needs a Git remote URL');
114
+ await mkdir(resolve(target, '..'), { recursive: true });
115
+ await this.runGit(['clone', gitUrl, target], rootPath, timeoutSeconds);
116
+ created = true;
117
+ }
118
+ else {
119
+ if (!metadata.isDirectory())
120
+ throw new Error('The repository path is not a directory');
121
+ if (!(await this.isGitRepository(target, timeoutSeconds))) {
122
+ throw new Error('The existing directory is not a Git repository');
123
+ }
124
+ if (gitUrl) {
125
+ const currentOrigin = (await this.runGit(['config', '--get', 'remote.origin.url'], target, timeoutSeconds, true)).stdout.trim();
126
+ if (currentOrigin && currentOrigin !== gitUrl) {
127
+ throw new Error('The existing repository origin does not match the configured Git URL');
128
+ }
129
+ }
130
+ }
131
+ await this.runGit(['fetch', '--prune', 'origin'], target, timeoutSeconds);
132
+ if (branch) {
133
+ const localBranch = await this.runGit(['show-ref', '--verify', '--quiet', `refs/heads/${branch}`], target, timeoutSeconds, true);
134
+ if (localBranch.exitCode === 0) {
135
+ await this.runGit(['checkout', branch], target, timeoutSeconds);
136
+ }
137
+ else {
138
+ await this.runGit(['checkout', '-B', branch, `origin/${branch}`], target, timeoutSeconds);
139
+ }
140
+ await this.runGit(['pull', '--ff-only', 'origin', branch], target, timeoutSeconds);
141
+ }
142
+ return { relative_path: relativePath, status: created ? 'created' : 'updated' };
143
+ }
144
+ async scan(rootPath) {
145
+ const resolvedRoot = await realpath(rootPath);
146
+ const rootMetadata = await stat(resolvedRoot);
147
+ if (!rootMetadata.isDirectory())
148
+ throw new Error('The workspace root is not a directory');
149
+ const nodes = [];
150
+ let entriesRead = 0;
151
+ const visit = async (directory) => {
152
+ if (nodes.length >= MAX_NODES || entriesRead >= MAX_DIRECTORY_ENTRIES)
153
+ return;
154
+ let entries;
155
+ try {
156
+ entries = await opendir(directory);
157
+ }
158
+ catch (error) {
159
+ this.logger.warn('workspace-scan-directory-failed', { directory, error: this.message(error) });
160
+ return;
161
+ }
162
+ for await (const entry of entries) {
163
+ if (nodes.length >= MAX_NODES || entriesRead++ >= MAX_DIRECTORY_ENTRIES)
164
+ return;
165
+ if (!entry.isDirectory() || IGNORED_DIRECTORIES.has(entry.name))
166
+ continue;
167
+ const target = resolve(directory, entry.name);
168
+ const relativePath = relative(resolvedRoot, target).replaceAll('\\', '/');
169
+ if (!relativePath || !this.isSafeRelativePath(relativePath))
170
+ continue;
171
+ const git = await this.readGitMetadata(target);
172
+ if (git) {
173
+ nodes.push({
174
+ relative_path: relativePath,
175
+ node_type: 'repo',
176
+ git_url: git.gitUrl,
177
+ branch: git.branch,
178
+ commit_hash: git.commitHash
179
+ });
180
+ }
181
+ else {
182
+ nodes.push({ relative_path: relativePath, node_type: 'folder' });
183
+ }
184
+ await visit(target);
185
+ }
186
+ };
187
+ await visit(resolvedRoot);
188
+ return nodes;
189
+ }
190
+ async readGitMetadata(directory) {
191
+ if (!(await this.isGitRepository(directory)))
192
+ return undefined;
193
+ const [origin, branch, commit] = await Promise.all([
194
+ this.runGit(['config', '--get', 'remote.origin.url'], directory, undefined, true),
195
+ this.runGit(['rev-parse', '--abbrev-ref', 'HEAD'], directory, undefined, true),
196
+ this.runGit(['rev-parse', 'HEAD'], directory, undefined, true)
197
+ ]);
198
+ return {
199
+ gitUrl: origin.exitCode === 0 ? origin.stdout.trim() || null : null,
200
+ branch: branch.exitCode === 0 ? branch.stdout.trim() || null : null,
201
+ commitHash: commit.exitCode === 0 ? commit.stdout.trim() || null : null
202
+ };
203
+ }
204
+ async isGitRepository(directory, timeoutSeconds) {
205
+ const result = await this.runGit(['rev-parse', '--is-inside-work-tree'], directory, timeoutSeconds, true);
206
+ return result.exitCode === 0 && result.stdout.trim() === 'true';
207
+ }
208
+ cleanRelativePath(value) {
209
+ const normalized = value.trim().replaceAll('\\', '/').replace(/^\/+|\/+$/g, '');
210
+ if (!normalized || !this.isSafeRelativePath(normalized)) {
211
+ throw new Error('A workspace path must remain under the configured workspace root');
212
+ }
213
+ return normalized;
214
+ }
215
+ isSafeRelativePath(value) {
216
+ const parts = value.split('/');
217
+ return !value.startsWith('/') && !parts.some((part) => !part || part === '.' || part === '..' || part.includes(':'));
218
+ }
219
+ resolveWithinRoot(rootPath, relativePath) {
220
+ const target = resolve(rootPath, relativePath);
221
+ const relativeToRoot = relative(rootPath, target);
222
+ if (relativeToRoot.startsWith('..') || isAbsolute(relativeToRoot)) {
223
+ throw new Error('A workspace path must remain under the configured workspace root');
224
+ }
225
+ return target;
226
+ }
227
+ runGit(args, cwd, timeoutSeconds, allowFailure = false) {
228
+ return new Promise((resolveCommand, rejectCommand) => {
229
+ const child = spawn('git', args, {
230
+ cwd,
231
+ env: process.env,
232
+ shell: false,
233
+ stdio: ['ignore', 'pipe', 'pipe']
234
+ });
235
+ const stdout = [];
236
+ const stderr = [];
237
+ const timeout = setTimeout(() => {
238
+ child.kill('SIGKILL');
239
+ }, Math.max(10, timeoutSeconds ?? 120) * 1_000);
240
+ child.stdout.on('data', (chunk) => stdout.push(Buffer.from(chunk)));
241
+ child.stderr.on('data', (chunk) => stderr.push(Buffer.from(chunk)));
242
+ child.once('error', (error) => {
243
+ clearTimeout(timeout);
244
+ rejectCommand(error);
245
+ });
246
+ child.once('close', (exitCode) => {
247
+ clearTimeout(timeout);
248
+ const result = {
249
+ exitCode: exitCode ?? -1,
250
+ stdout: Buffer.concat(stdout).toString('utf8'),
251
+ stderr: Buffer.concat(stderr).toString('utf8')
252
+ };
253
+ if (result.exitCode !== 0 && !allowFailure) {
254
+ rejectCommand(new Error(result.stderr.trim() || `git ${args[0] ?? 'command'} failed`));
255
+ return;
256
+ }
257
+ resolveCommand(result);
258
+ });
259
+ });
260
+ }
261
+ message(error) {
262
+ return error instanceof Error ? error.message : String(error);
263
+ }
264
+ }
265
+ //# sourceMappingURL=workspace-manager.js.map