open-agents-ai 0.187.360 → 0.187.361

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 (2) hide show
  1. package/dist/index.js +324 -49
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -40874,11 +40874,11 @@ var require_eventemitter3 = __commonJS({
40874
40874
  if (--emitter._eventsCount === 0) emitter._events = new Events();
40875
40875
  else delete emitter._events[evt];
40876
40876
  }
40877
- function EventEmitter11() {
40877
+ function EventEmitter12() {
40878
40878
  this._events = new Events();
40879
40879
  this._eventsCount = 0;
40880
40880
  }
40881
- EventEmitter11.prototype.eventNames = function eventNames() {
40881
+ EventEmitter12.prototype.eventNames = function eventNames() {
40882
40882
  var names = [], events, name10;
40883
40883
  if (this._eventsCount === 0) return names;
40884
40884
  for (name10 in events = this._events) {
@@ -40889,7 +40889,7 @@ var require_eventemitter3 = __commonJS({
40889
40889
  }
40890
40890
  return names;
40891
40891
  };
40892
- EventEmitter11.prototype.listeners = function listeners(event) {
40892
+ EventEmitter12.prototype.listeners = function listeners(event) {
40893
40893
  var evt = prefix ? prefix + event : event, handlers = this._events[evt];
40894
40894
  if (!handlers) return [];
40895
40895
  if (handlers.fn) return [handlers.fn];
@@ -40898,13 +40898,13 @@ var require_eventemitter3 = __commonJS({
40898
40898
  }
40899
40899
  return ee;
40900
40900
  };
40901
- EventEmitter11.prototype.listenerCount = function listenerCount(event) {
40901
+ EventEmitter12.prototype.listenerCount = function listenerCount(event) {
40902
40902
  var evt = prefix ? prefix + event : event, listeners = this._events[evt];
40903
40903
  if (!listeners) return 0;
40904
40904
  if (listeners.fn) return 1;
40905
40905
  return listeners.length;
40906
40906
  };
40907
- EventEmitter11.prototype.emit = function emit2(event, a1, a2, a3, a4, a5) {
40907
+ EventEmitter12.prototype.emit = function emit2(event, a1, a2, a3, a4, a5) {
40908
40908
  var evt = prefix ? prefix + event : event;
40909
40909
  if (!this._events[evt]) return false;
40910
40910
  var listeners = this._events[evt], len = arguments.length, args, i2;
@@ -40955,13 +40955,13 @@ var require_eventemitter3 = __commonJS({
40955
40955
  }
40956
40956
  return true;
40957
40957
  };
40958
- EventEmitter11.prototype.on = function on2(event, fn, context2) {
40958
+ EventEmitter12.prototype.on = function on2(event, fn, context2) {
40959
40959
  return addListener2(this, event, fn, context2, false);
40960
40960
  };
40961
- EventEmitter11.prototype.once = function once(event, fn, context2) {
40961
+ EventEmitter12.prototype.once = function once(event, fn, context2) {
40962
40962
  return addListener2(this, event, fn, context2, true);
40963
40963
  };
40964
- EventEmitter11.prototype.removeListener = function removeListener2(event, fn, context2, once) {
40964
+ EventEmitter12.prototype.removeListener = function removeListener2(event, fn, context2, once) {
40965
40965
  var evt = prefix ? prefix + event : event;
40966
40966
  if (!this._events[evt]) return this;
40967
40967
  if (!fn) {
@@ -40984,7 +40984,7 @@ var require_eventemitter3 = __commonJS({
40984
40984
  }
40985
40985
  return this;
40986
40986
  };
40987
- EventEmitter11.prototype.removeAllListeners = function removeAllListeners(event) {
40987
+ EventEmitter12.prototype.removeAllListeners = function removeAllListeners(event) {
40988
40988
  var evt;
40989
40989
  if (event) {
40990
40990
  evt = prefix ? prefix + event : event;
@@ -40995,12 +40995,12 @@ var require_eventemitter3 = __commonJS({
40995
40995
  }
40996
40996
  return this;
40997
40997
  };
40998
- EventEmitter11.prototype.off = EventEmitter11.prototype.removeListener;
40999
- EventEmitter11.prototype.addListener = EventEmitter11.prototype.on;
41000
- EventEmitter11.prefixed = prefix;
41001
- EventEmitter11.EventEmitter = EventEmitter11;
40998
+ EventEmitter12.prototype.off = EventEmitter12.prototype.removeListener;
40999
+ EventEmitter12.prototype.addListener = EventEmitter12.prototype.on;
41000
+ EventEmitter12.prefixed = prefix;
41001
+ EventEmitter12.EventEmitter = EventEmitter12;
41002
41002
  if ("undefined" !== typeof module) {
41003
- module.exports = EventEmitter11;
41003
+ module.exports = EventEmitter12;
41004
41004
  }
41005
41005
  }
41006
41006
  });
@@ -113772,10 +113772,10 @@ var require_wrap_handler = __commonJS({
113772
113772
  var require_dispatcher = __commonJS({
113773
113773
  "../node_modules/undici/lib/dispatcher/dispatcher.js"(exports, module) {
113774
113774
  "use strict";
113775
- var EventEmitter11 = __require("node:events");
113775
+ var EventEmitter12 = __require("node:events");
113776
113776
  var WrapHandler = require_wrap_handler();
113777
113777
  var wrapInterceptor = (dispatch) => (opts, handler) => dispatch(opts, WrapHandler.wrap(handler));
113778
- var Dispatcher2 = class extends EventEmitter11 {
113778
+ var Dispatcher2 = class extends EventEmitter12 {
113779
113779
  dispatch() {
113780
113780
  throw new Error("not implemented");
113781
113781
  }
@@ -121058,7 +121058,7 @@ var require_socks5_utils = __commonJS({
121058
121058
  var require_socks5_client = __commonJS({
121059
121059
  "../node_modules/undici/lib/core/socks5-client.js"(exports, module) {
121060
121060
  "use strict";
121061
- var { EventEmitter: EventEmitter11 } = __require("node:events");
121061
+ var { EventEmitter: EventEmitter12 } = __require("node:events");
121062
121062
  var { Buffer: Buffer7 } = __require("node:buffer");
121063
121063
  var { InvalidArgumentError, Socks5ProxyError } = require_errors2();
121064
121064
  var { debuglog } = __require("node:util");
@@ -121101,7 +121101,7 @@ var require_socks5_client = __commonJS({
121101
121101
  ERROR: "error",
121102
121102
  CLOSED: "closed"
121103
121103
  };
121104
- var Socks5Client = class extends EventEmitter11 {
121104
+ var Socks5Client = class extends EventEmitter12 {
121105
121105
  constructor(socket, options2 = {}) {
121106
121106
  super();
121107
121107
  if (!socket) {
@@ -127486,9 +127486,9 @@ var require_memory_cache_store = __commonJS({
127486
127486
  "../node_modules/undici/lib/cache/memory-cache-store.js"(exports, module) {
127487
127487
  "use strict";
127488
127488
  var { Writable } = __require("node:stream");
127489
- var { EventEmitter: EventEmitter11 } = __require("node:events");
127489
+ var { EventEmitter: EventEmitter12 } = __require("node:events");
127490
127490
  var { assertCacheKey, assertCacheValue } = require_cache();
127491
- var MemoryCacheStore = class extends EventEmitter11 {
127491
+ var MemoryCacheStore = class extends EventEmitter12 {
127492
127492
  #maxCount = 1024;
127493
127493
  #maxSize = 104857600;
127494
127494
  // 100MB
@@ -231525,7 +231525,7 @@ var require_extension2 = __commonJS({
231525
231525
  var require_websocket2 = __commonJS({
231526
231526
  "../node_modules/ws/lib/websocket.js"(exports, module) {
231527
231527
  "use strict";
231528
- var EventEmitter11 = __require("events");
231528
+ var EventEmitter12 = __require("events");
231529
231529
  var https4 = __require("https");
231530
231530
  var http6 = __require("http");
231531
231531
  var net5 = __require("net");
@@ -231557,7 +231557,7 @@ var require_websocket2 = __commonJS({
231557
231557
  var protocolVersions = [8, 13];
231558
231558
  var readyStates = ["CONNECTING", "OPEN", "CLOSING", "CLOSED"];
231559
231559
  var subprotocolRegex = /^[!#$%&'*+\-.0-9A-Z^_`|a-z~]+$/;
231560
- var WebSocket6 = class _WebSocket extends EventEmitter11 {
231560
+ var WebSocket6 = class _WebSocket extends EventEmitter12 {
231561
231561
  /**
231562
231562
  * Create a new `WebSocket`.
231563
231563
  *
@@ -232554,7 +232554,7 @@ var require_subprotocol = __commonJS({
232554
232554
  var require_websocket_server = __commonJS({
232555
232555
  "../node_modules/ws/lib/websocket-server.js"(exports, module) {
232556
232556
  "use strict";
232557
- var EventEmitter11 = __require("events");
232557
+ var EventEmitter12 = __require("events");
232558
232558
  var http6 = __require("http");
232559
232559
  var { Duplex: Duplex3 } = __require("stream");
232560
232560
  var { createHash: createHash13 } = __require("crypto");
@@ -232567,7 +232567,7 @@ var require_websocket_server = __commonJS({
232567
232567
  var RUNNING = 0;
232568
232568
  var CLOSING = 1;
232569
232569
  var CLOSED = 2;
232570
- var WebSocketServer4 = class extends EventEmitter11 {
232570
+ var WebSocketServer4 = class extends EventEmitter12 {
232571
232571
  /**
232572
232572
  * Create a `WebSocketServer` instance.
232573
232573
  *
@@ -499760,6 +499760,56 @@ var init_dist4 = __esm({
499760
499760
  }
499761
499761
  });
499762
499762
 
499763
+ // packages/execution/dist/tools/code-graph-events.js
499764
+ import { EventEmitter as EventEmitter3 } from "node:events";
499765
+ function emitIndexed(payload) {
499766
+ codeGraphEvents.publish({ type: "indexed", timestamp: Date.now(), ...payload });
499767
+ }
499768
+ function emitLinked(payload) {
499769
+ codeGraphEvents.publish({ type: "linked", timestamp: Date.now(), ...payload });
499770
+ }
499771
+ function emitQueried(payload) {
499772
+ codeGraphEvents.publish({ type: "queried", timestamp: Date.now(), ...payload });
499773
+ }
499774
+ function emitPruned(payload) {
499775
+ codeGraphEvents.publish({ type: "pruned", timestamp: Date.now(), ...payload });
499776
+ }
499777
+ var MAX_RECENT, CodeGraphEventBus, codeGraphEvents;
499778
+ var init_code_graph_events = __esm({
499779
+ "packages/execution/dist/tools/code-graph-events.js"() {
499780
+ "use strict";
499781
+ MAX_RECENT = 256;
499782
+ CodeGraphEventBus = class extends EventEmitter3 {
499783
+ ring = [];
499784
+ constructor() {
499785
+ super();
499786
+ this.setMaxListeners(64);
499787
+ }
499788
+ publish(event) {
499789
+ this.ring.push(event);
499790
+ if (this.ring.length > MAX_RECENT) {
499791
+ this.ring.splice(0, this.ring.length - MAX_RECENT);
499792
+ }
499793
+ this.emit("event", event);
499794
+ this.emit(event.type, event);
499795
+ }
499796
+ /** Snapshot of the most recent N events (default all buffered). */
499797
+ recent(limit) {
499798
+ if (!limit || limit >= this.ring.length)
499799
+ return [...this.ring];
499800
+ return this.ring.slice(this.ring.length - limit);
499801
+ }
499802
+ /** Test / shutdown helper — drains the buffer. */
499803
+ reset() {
499804
+ this.ring = [];
499805
+ this.removeAllListeners();
499806
+ this.setMaxListeners(64);
499807
+ }
499808
+ };
499809
+ codeGraphEvents = new CodeGraphEventBus();
499810
+ }
499811
+ });
499812
+
499763
499813
  // packages/execution/dist/tools/code-graph-client.js
499764
499814
  import { existsSync as existsSync29, statSync as statSync10, readdirSync as readdirSync8 } from "node:fs";
499765
499815
  import { join as join47, relative as relative5, sep } from "node:path";
@@ -499799,7 +499849,19 @@ function getCodeGraphDB(workingDir, opts = {}) {
499799
499849
  const stats = db.getStats();
499800
499850
  if (opts.force || stats.fileCount === 0) {
499801
499851
  const files = collectSources(workingDir);
499802
- db.fullIndex(files);
499852
+ for (const rel of files) {
499853
+ const changed = db.indexFile(rel);
499854
+ if (changed) {
499855
+ const syms = db.getFileSymbols(rel);
499856
+ const imports = db.getImports(rel);
499857
+ emitIndexed({
499858
+ filePath: rel,
499859
+ hash: db.getFileHash(rel) ?? "",
499860
+ symbolCount: syms.length,
499861
+ importCount: imports.length
499862
+ });
499863
+ }
499864
+ }
499803
499865
  }
499804
499866
  cache4.set(workingDir, db);
499805
499867
  return db;
@@ -499846,6 +499908,7 @@ var init_code_graph_client = __esm({
499846
499908
  "packages/execution/dist/tools/code-graph-client.js"() {
499847
499909
  "use strict";
499848
499910
  init_dist4();
499911
+ init_code_graph_events();
499849
499912
  INDEX_EXT_REGEX = /\.(ts|tsx|js|jsx|mjs|cjs|py)$/;
499850
499913
  SKIP_DIRS = /* @__PURE__ */ new Set([
499851
499914
  "node_modules",
@@ -499874,6 +499937,7 @@ var init_symbol_search = __esm({
499874
499937
  "packages/execution/dist/tools/symbol-search.js"() {
499875
499938
  "use strict";
499876
499939
  init_code_graph_client();
499940
+ init_code_graph_events();
499877
499941
  KIND_VALUES = /* @__PURE__ */ new Set([
499878
499942
  "function",
499879
499943
  "class",
@@ -499930,6 +499994,13 @@ var init_symbol_search = __esm({
499930
499994
  const db = getCodeGraphDB(this.workingDir);
499931
499995
  const rows = name10 ? db.getSymbolsByExactName(name10) : db.searchSymbols(pattern);
499932
499996
  const filtered = (kind ? rows.filter((r2) => r2.kind === kind) : rows).slice(0, limit);
499997
+ const durationMs = Math.round(performance.now() - start2);
499998
+ emitQueried({
499999
+ tool: "symbol_search",
500000
+ argsPreview: name10 ? `name=${name10}` : `pattern=${pattern}${kind ? ` kind=${kind}` : ""}`,
500001
+ resultCount: filtered.length,
500002
+ durationMs
500003
+ });
499933
500004
  if (filtered.length === 0) {
499934
500005
  return {
499935
500006
  success: true,
@@ -499966,6 +500037,7 @@ var init_impact_analysis = __esm({
499966
500037
  "packages/execution/dist/tools/impact-analysis.js"() {
499967
500038
  "use strict";
499968
500039
  init_code_graph_client();
500040
+ init_code_graph_events();
499969
500041
  ImpactAnalysisTool = class {
499970
500042
  name = "impact_analysis";
499971
500043
  description = "Estimate the blast radius of changing a file or symbol: which other files/symbols transitively depend on it (would need updating) and which it depends on. Useful before refactoring or deleting code. For symbols, also reports class/interface inheritors. Backed by the persistent code-graph; depth is bounded (default 2, max 5).";
@@ -500072,10 +500144,17 @@ var init_impact_analysis = __esm({
500072
500144
  lines.push(` ... +${inheritors.length - 20} more`);
500073
500145
  }
500074
500146
  }
500147
+ const durationMs = Math.round(performance.now() - start2);
500148
+ emitQueried({
500149
+ tool: "impact_analysis",
500150
+ argsPreview: file ? `file=${file}` : `symbol=${symbol3} depth=${depth}`,
500151
+ resultCount: lines.length,
500152
+ durationMs
500153
+ });
500075
500154
  return {
500076
500155
  success: true,
500077
500156
  output: lines.join("\n"),
500078
- durationMs: Math.round(performance.now() - start2)
500157
+ durationMs
500079
500158
  };
500080
500159
  } catch (err) {
500081
500160
  return {
@@ -500096,6 +500175,7 @@ var init_code_neighbors = __esm({
500096
500175
  "packages/execution/dist/tools/code-neighbors.js"() {
500097
500176
  "use strict";
500098
500177
  init_code_graph_client();
500178
+ init_code_graph_events();
500099
500179
  KIND_VALUES2 = ["imports", "inherits", "calls"];
500100
500180
  CodeNeighborsTool = class {
500101
500181
  name = "code_neighbors";
@@ -500164,10 +500244,17 @@ var init_code_neighbors = __esm({
500164
500244
  if (nodes.length > 40)
500165
500245
  lines.push(` ... +${nodes.length - 40} more`);
500166
500246
  }
500247
+ const durationMs = Math.round(performance.now() - t0);
500248
+ emitQueried({
500249
+ tool: "code_neighbors",
500250
+ argsPreview: `start=${start2} depth=${depth} kinds=[${(kinds.length ? kinds : KIND_VALUES2).join(",")}]`,
500251
+ resultCount: result.nodes.length,
500252
+ durationMs
500253
+ });
500167
500254
  return {
500168
500255
  success: true,
500169
500256
  output: lines.join("\n"),
500170
- durationMs: Math.round(performance.now() - t0)
500257
+ durationMs
500171
500258
  };
500172
500259
  } catch (err) {
500173
500260
  return {
@@ -509061,6 +509148,7 @@ __export(dist_exports, {
509061
509148
  clearWorkingNotes: () => clearWorkingNotes,
509062
509149
  closeAllCodeGraphDBs: () => closeAllCodeGraphDBs,
509063
509150
  codeGraphDBExists: () => codeGraphDBExists,
509151
+ codeGraphEvents: () => codeGraphEvents,
509064
509152
  collectSnapshot: () => collectSnapshot,
509065
509153
  createAgentWorktree: () => createWorktree,
509066
509154
  createFortemiBridgeTools: () => createFortemiBridgeTools,
@@ -509071,6 +509159,10 @@ __export(dist_exports, {
509071
509159
  detectSearchProvider: () => detectSearchProvider,
509072
509160
  discoverPlugins: () => discoverPlugins,
509073
509161
  discoverSkills: () => discoverSkills,
509162
+ emitIndexed: () => emitIndexed,
509163
+ emitLinked: () => emitLinked,
509164
+ emitPruned: () => emitPruned,
509165
+ emitQueried: () => emitQueried,
509074
509166
  ensureAllDesktopDeps: () => ensureAllDesktopDeps,
509075
509167
  ensureCommand: () => ensureCommand,
509076
509168
  ensureDepsForGroup: () => ensureDepsForGroup,
@@ -509222,6 +509314,7 @@ var init_dist5 = __esm({
509222
509314
  init_impact_analysis();
509223
509315
  init_code_neighbors();
509224
509316
  init_code_graph_client();
509317
+ init_code_graph_events();
509225
509318
  init_process_health();
509226
509319
  init_camera_capture();
509227
509320
  init_audio_capture();
@@ -514720,6 +514813,14 @@ function linkCodeSymbolsToKg(params) {
514720
514813
  } catch {
514721
514814
  }
514722
514815
  }
514816
+ if (symbolNodesCreated > 0 || containsEdgesCreated > 0) {
514817
+ emitLinked({
514818
+ toolName: params.toolName,
514819
+ filePath: params.filePath,
514820
+ symbolNodesCreated,
514821
+ containsEdgesCreated
514822
+ });
514823
+ }
514723
514824
  return { linked: true, fileNodeId, symbolNodesCreated, containsEdgesCreated };
514724
514825
  } catch (err) {
514725
514826
  return {
@@ -514733,6 +514834,7 @@ function linkCodeSymbolsToKg(params) {
514733
514834
  var init_codeGraphLink = __esm({
514734
514835
  "packages/orchestrator/dist/codeGraphLink.js"() {
514735
514836
  "use strict";
514837
+ init_dist5();
514736
514838
  }
514737
514839
  });
514738
514840
 
@@ -523940,7 +524042,7 @@ import { existsSync as existsSync56, mkdirSync as mkdirSync32, writeFileSync as
523940
524042
  import { join as join72, dirname as dirname20 } from "node:path";
523941
524043
  import { homedir as homedir24 } from "node:os";
523942
524044
  import { fileURLToPath as fileURLToPath10 } from "node:url";
523943
- import { EventEmitter as EventEmitter3 } from "node:events";
524045
+ import { EventEmitter as EventEmitter4 } from "node:events";
523944
524046
  import { createInterface as createInterface2 } from "node:readline";
523945
524047
  function isAudioPath(path6) {
523946
524048
  const ext = path6.toLowerCase().split(".").pop();
@@ -524142,7 +524244,7 @@ var init_listen = __esm({
524142
524244
  ".m4v",
524143
524245
  ".ts"
524144
524246
  ]);
524145
- WhisperFallbackTranscriber = class extends EventEmitter3 {
524247
+ WhisperFallbackTranscriber = class extends EventEmitter4 {
524146
524248
  constructor(model, scriptPath2) {
524147
524249
  super();
524148
524250
  this.model = model;
@@ -524251,7 +524353,7 @@ var init_listen = __esm({
524251
524353
  this._ready = false;
524252
524354
  }
524253
524355
  };
524254
- ListenEngine = class extends EventEmitter3 {
524356
+ ListenEngine = class extends EventEmitter4 {
524255
524357
  config;
524256
524358
  micProcess = null;
524257
524359
  liveTranscriber = null;
@@ -526909,7 +527011,7 @@ var require_extension3 = __commonJS({
526909
527011
  var require_websocket3 = __commonJS({
526910
527012
  "node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/websocket.js"(exports, module) {
526911
527013
  "use strict";
526912
- var EventEmitter11 = __require("events");
527014
+ var EventEmitter12 = __require("events");
526913
527015
  var https4 = __require("https");
526914
527016
  var http6 = __require("http");
526915
527017
  var net5 = __require("net");
@@ -526941,7 +527043,7 @@ var require_websocket3 = __commonJS({
526941
527043
  var protocolVersions = [8, 13];
526942
527044
  var readyStates = ["CONNECTING", "OPEN", "CLOSING", "CLOSED"];
526943
527045
  var subprotocolRegex = /^[!#$%&'*+\-.0-9A-Z^_`|a-z~]+$/;
526944
- var WebSocket6 = class _WebSocket extends EventEmitter11 {
527046
+ var WebSocket6 = class _WebSocket extends EventEmitter12 {
526945
527047
  /**
526946
527048
  * Create a new `WebSocket`.
526947
527049
  *
@@ -527938,7 +528040,7 @@ var require_subprotocol2 = __commonJS({
527938
528040
  var require_websocket_server2 = __commonJS({
527939
528041
  "node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/websocket-server.js"(exports, module) {
527940
528042
  "use strict";
527941
- var EventEmitter11 = __require("events");
528043
+ var EventEmitter12 = __require("events");
527942
528044
  var http6 = __require("http");
527943
528045
  var { Duplex: Duplex3 } = __require("stream");
527944
528046
  var { createHash: createHash13 } = __require("crypto");
@@ -527951,7 +528053,7 @@ var require_websocket_server2 = __commonJS({
527951
528053
  var RUNNING = 0;
527952
528054
  var CLOSING = 1;
527953
528055
  var CLOSED = 2;
527954
- var WebSocketServer4 = class extends EventEmitter11 {
528056
+ var WebSocketServer4 = class extends EventEmitter12 {
527955
528057
  /**
527956
528058
  * Create a `WebSocketServer` instance.
527957
528059
  *
@@ -543930,6 +544032,25 @@ async function destroyOrphanProcesses(ctx3, global2) {
543930
544032
  }
543931
544033
  return killed;
543932
544034
  }
544035
+ function formatCodegraphEventLine(ev) {
544036
+ const pathTail = (p2, max = 60) => {
544037
+ const s2 = String(p2 ?? "");
544038
+ if (s2.length <= max) return s2;
544039
+ return "…" + s2.slice(s2.length - max + 1);
544040
+ };
544041
+ switch (ev.type) {
544042
+ case "indexed":
544043
+ return `indexed ${pathTail(ev["filePath"])} (${ev["symbolCount"]} sym, ${ev["importCount"]} imp)`;
544044
+ case "linked":
544045
+ return `linked ${pathTail(ev["filePath"])} via ${ev["toolName"]} (+${ev["symbolNodesCreated"]} sym, +${ev["containsEdgesCreated"]} edges)`;
544046
+ case "queried":
544047
+ return `queried ${ev["tool"]} ${pathTail(ev["argsPreview"], 80)} → ${ev["resultCount"]} (${ev["durationMs"]}ms)`;
544048
+ case "pruned":
544049
+ return `pruned ${pathTail(ev["filePath"])} reason=${ev["reason"]}`;
544050
+ default:
544051
+ return `${ev.type} ${JSON.stringify(ev).slice(0, 120)}`;
544052
+ }
544053
+ }
543933
544054
  async function handleSlashCommand(input, ctx3) {
543934
544055
  const trimmed = input.trim();
543935
544056
  if (!trimmed.startsWith("/")) return "not_a_command";
@@ -547366,6 +547487,109 @@ sleep 1
547366
547487
  renderInfo2(" Add --local to scope settings to this project only");
547367
547488
  return "handled";
547368
547489
  }
547490
+ case "codegraph":
547491
+ case "cg": {
547492
+ const tokens = (arg || "").trim().length ? (arg || "").trim().split(/\s+/) : [];
547493
+ const sub = (tokens[0] || "show").toLowerCase();
547494
+ const base3 = `http://127.0.0.1:${process.env["OA_PORT"] || "11435"}`;
547495
+ const authHeaders = () => {
547496
+ const token = process.env["OA_API_KEY"] || "";
547497
+ return token ? { Authorization: `Bearer ${token}` } : {};
547498
+ };
547499
+ if (sub === "show" || sub === "status") {
547500
+ try {
547501
+ const resp = await fetch(`${base3}/v1/codegraph/snapshot`, { headers: authHeaders() });
547502
+ if (!resp.ok) {
547503
+ renderWarning2(`Code-graph snapshot HTTP ${resp.status}. Is the daemon running?`);
547504
+ return "handled";
547505
+ }
547506
+ const snap = await resp.json();
547507
+ renderInfo2(
547508
+ `Code Graph: ${snap.stats.fileCount} files, ${snap.stats.symbolCount} symbols, ${snap.stats.edgeCount} edges` + (snap.stats.lastFullIndex ? ` • last index ${snap.stats.lastFullIndex}` : "")
547509
+ );
547510
+ if (snap.stats.fileCount === 0) {
547511
+ renderInfo2("Index is empty. Trigger a build via symbol_search / impact_analysis / code_neighbors, or run any agent task that touches code.");
547512
+ return "handled";
547513
+ }
547514
+ renderInfo2("");
547515
+ renderInfo2("Top files (by imported-by count):");
547516
+ for (const f2 of snap.topFiles.slice(0, 10)) {
547517
+ renderInfo2(` ${String(f2.importCount).padStart(3)} importers ${String(f2.symbolCount).padStart(3)} symbols ${f2.path}`);
547518
+ }
547519
+ renderInfo2("");
547520
+ renderInfo2(`Recent events (${snap.recent.length} buffered):`);
547521
+ if (snap.recent.length === 0) {
547522
+ renderInfo2(" (none yet — use /codegraph watch to see events live)");
547523
+ } else {
547524
+ const tail = snap.recent.slice(-8);
547525
+ for (const ev of tail) {
547526
+ const ago = Math.max(0, Math.round((Date.now() - ev.timestamp) / 1e3));
547527
+ const detail = formatCodegraphEventLine(ev);
547528
+ renderInfo2(` [${String(ago).padStart(3)}s ago] ${detail}`);
547529
+ }
547530
+ }
547531
+ } catch (err) {
547532
+ renderError2(`/codegraph failed: ${err instanceof Error ? err.message : String(err)}`);
547533
+ }
547534
+ return "handled";
547535
+ }
547536
+ if (sub === "watch") {
547537
+ const seconds = Math.max(1, Math.min(600, Number(tokens[1]) || 30));
547538
+ renderInfo2(`Watching /v1/codegraph/events for ${seconds}s (Ctrl+C to stop early)...`);
547539
+ const ac = new AbortController();
547540
+ const deadline = Date.now() + seconds * 1e3;
547541
+ setTimeout(() => ac.abort(), seconds * 1e3);
547542
+ try {
547543
+ const resp = await fetch(`${base3}/v1/codegraph/events`, {
547544
+ headers: authHeaders(),
547545
+ signal: ac.signal
547546
+ });
547547
+ if (!resp.ok || !resp.body) {
547548
+ renderWarning2(`Code-graph events HTTP ${resp.status}. Is the daemon running?`);
547549
+ return "handled";
547550
+ }
547551
+ const reader = resp.body.getReader();
547552
+ const decoder = new TextDecoder();
547553
+ let buf = "";
547554
+ let frames = 0;
547555
+ try {
547556
+ while (Date.now() < deadline) {
547557
+ const { value: value2, done } = await reader.read();
547558
+ if (done) break;
547559
+ buf += decoder.decode(value2, { stream: true });
547560
+ let idx;
547561
+ while ((idx = buf.indexOf("\n\n")) >= 0) {
547562
+ const frame = buf.slice(0, idx);
547563
+ buf = buf.slice(idx + 2);
547564
+ const dataLine = frame.split("\n").find((l2) => l2.startsWith("data: "));
547565
+ if (!dataLine) continue;
547566
+ try {
547567
+ const ev = JSON.parse(dataLine.slice(6));
547568
+ renderInfo2(` ${formatCodegraphEventLine(ev)}`);
547569
+ frames++;
547570
+ } catch {
547571
+ }
547572
+ }
547573
+ }
547574
+ } finally {
547575
+ try {
547576
+ reader.cancel();
547577
+ } catch {
547578
+ }
547579
+ }
547580
+ renderInfo2(`Watch ended. ${frames} event(s) observed.`);
547581
+ } catch (err) {
547582
+ if (err?.name !== "AbortError") {
547583
+ renderError2(`/codegraph watch failed: ${err instanceof Error ? err.message : String(err)}`);
547584
+ }
547585
+ }
547586
+ return "handled";
547587
+ }
547588
+ renderInfo2("Usage: /codegraph [show|watch [seconds]]");
547589
+ renderInfo2(" show One-shot snapshot of index state + recent events (default).");
547590
+ renderInfo2(" watch [N] Subscribe to SSE events for N seconds (default 30, max 600).");
547591
+ return "handled";
547592
+ }
547369
547593
  default: {
547370
547594
  const skills = discoverSkills(ctx3.repoRoot);
547371
547595
  const skill = skills.find(
@@ -552095,6 +552319,9 @@ var init_render2 = __esm({
552095
552319
  ["/scheduler menu", "Interactive scheduler menu (toggle/kill)"],
552096
552320
  ["/scheduler list", "List all scheduled tasks and timers"],
552097
552321
  ["/scheduler kill", "Kill schedulers + active runs (with escalation if needed)"],
552322
+ ["/codegraph", "Code-graph snapshot: stats, top files, recent activity"],
552323
+ ["/codegraph watch [N]", "Subscribe to live code-graph events for N seconds (default 30)"],
552324
+ ["/cg", "Alias for /codegraph"],
552098
552325
  ["/host <host[:port]>", "Set bind host:port (OA_HOST) and restart daemon"],
552099
552326
  ["/network config", "Interactive network access menu"],
552100
552327
  ["/p2p start", "Join the P2P agent mesh network"],
@@ -552122,7 +552349,7 @@ var init_render2 = __esm({
552122
552349
  // packages/cli/src/tui/voice-session.ts
552123
552350
  import { createServer as createServer3 } from "node:http";
552124
552351
  import { spawn as spawn22, execSync as execSync50 } from "node:child_process";
552125
- import { EventEmitter as EventEmitter4 } from "node:events";
552352
+ import { EventEmitter as EventEmitter5 } from "node:events";
552126
552353
  function generateFrontendHTML() {
552127
552354
  return `<!DOCTYPE html>
552128
552355
  <html lang="en">
@@ -552856,7 +553083,7 @@ var init_voice_session = __esm({
552856
553083
  "use strict";
552857
553084
  init_wrapper2();
552858
553085
  init_render2();
552859
- VoiceSession = class extends EventEmitter4 {
553086
+ VoiceSession = class extends EventEmitter5 {
552860
553087
  state;
552861
553088
  server = null;
552862
553089
  wss = null;
@@ -553240,7 +553467,7 @@ var init_voice_session = __esm({
553240
553467
  // packages/cli/src/tui/expose.ts
553241
553468
  import { createServer as createServer4, request as httpRequest } from "node:http";
553242
553469
  import { spawn as spawn23, exec as exec4 } from "node:child_process";
553243
- import { EventEmitter as EventEmitter5 } from "node:events";
553470
+ import { EventEmitter as EventEmitter6 } from "node:events";
553244
553471
  import { randomBytes as randomBytes17 } from "node:crypto";
553245
553472
  import { URL as URL2 } from "node:url";
553246
553473
  import { loadavg as loadavg3, cpus as cpus4, totalmem as totalmem5, freemem as freemem4 } from "node:os";
@@ -553429,7 +553656,7 @@ var init_expose = __esm({
553429
553656
  custom: "http://127.0.0.1:11434"
553430
553657
  };
553431
553658
  STATE_FILE_NAME = "expose-state.json";
553432
- ExposeGateway = class _ExposeGateway extends EventEmitter5 {
553659
+ ExposeGateway = class _ExposeGateway extends EventEmitter6 {
553433
553660
  constructor(options2) {
553434
553661
  super();
553435
553662
  this.options = options2;
@@ -554284,7 +554511,7 @@ ${this.formatConnectionInfo()}`);
554284
554511
  }
554285
554512
  };
554286
554513
  P2P_STATE_FILE_NAME = "expose-p2p-state.json";
554287
- ExposeP2PGateway = class _ExposeP2PGateway extends EventEmitter5 {
554514
+ ExposeP2PGateway = class _ExposeP2PGateway extends EventEmitter6 {
554288
554515
  _nexusTool;
554289
554516
  // NexusTool instance
554290
554517
  _kind;
@@ -555055,7 +555282,7 @@ var init_secret_vault = __esm({
555055
555282
  });
555056
555283
 
555057
555284
  // packages/cli/src/tui/p2p/peer-mesh.ts
555058
- import { EventEmitter as EventEmitter6 } from "node:events";
555285
+ import { EventEmitter as EventEmitter7 } from "node:events";
555059
555286
  import { createServer as createServer5 } from "node:http";
555060
555287
  import { randomBytes as randomBytes19, createHash as createHash9, generateKeyPairSync } from "node:crypto";
555061
555288
  var PING_INTERVAL_MS, PEER_TIMEOUT_MS, GOSSIP_INTERVAL_MS, MAX_PEERS, PeerMesh;
@@ -555067,7 +555294,7 @@ var init_peer_mesh = __esm({
555067
555294
  PEER_TIMEOUT_MS = 9e4;
555068
555295
  GOSSIP_INTERVAL_MS = 6e4;
555069
555296
  MAX_PEERS = 50;
555070
- PeerMesh = class extends EventEmitter6 {
555297
+ PeerMesh = class extends EventEmitter7 {
555071
555298
  constructor(options2) {
555072
555299
  super();
555073
555300
  this.options = options2;
@@ -555513,7 +555740,7 @@ var init_peer_mesh = __esm({
555513
555740
  });
555514
555741
 
555515
555742
  // packages/cli/src/tui/p2p/inference-router.ts
555516
- import { EventEmitter as EventEmitter7 } from "node:events";
555743
+ import { EventEmitter as EventEmitter8 } from "node:events";
555517
555744
  var TRUST_WEIGHTS, InferenceRouter;
555518
555745
  var init_inference_router = __esm({
555519
555746
  "packages/cli/src/tui/p2p/inference-router.ts"() {
@@ -555525,7 +555752,7 @@ var init_inference_router = __esm({
555525
555752
  verified: 5,
555526
555753
  public: 2
555527
555754
  };
555528
- InferenceRouter = class extends EventEmitter7 {
555755
+ InferenceRouter = class extends EventEmitter8 {
555529
555756
  mesh;
555530
555757
  vault;
555531
555758
  defaultTimeoutMs;
@@ -555723,7 +555950,7 @@ var init_p2p = __esm({
555723
555950
  });
555724
555951
 
555725
555952
  // packages/cli/src/tui/call-agent.ts
555726
- import { EventEmitter as EventEmitter8 } from "node:events";
555953
+ import { EventEmitter as EventEmitter9 } from "node:events";
555727
555954
  import crypto13 from "node:crypto";
555728
555955
  function adaptTool(tool) {
555729
555956
  return {
@@ -555781,7 +556008,7 @@ var init_call_agent = __esm({
555781
556008
  }
555782
556009
  };
555783
556010
  _globalFeed = null;
555784
- CallSubAgent = class extends EventEmitter8 {
556011
+ CallSubAgent = class extends EventEmitter9 {
555785
556012
  tier;
555786
556013
  clientId;
555787
556014
  runner = null;
@@ -563371,12 +563598,12 @@ var direct_input_exports = {};
563371
563598
  __export(direct_input_exports, {
563372
563599
  DirectInput: () => DirectInput
563373
563600
  });
563374
- import { EventEmitter as EventEmitter9 } from "node:events";
563601
+ import { EventEmitter as EventEmitter10 } from "node:events";
563375
563602
  var DirectInput;
563376
563603
  var init_direct_input = __esm({
563377
563604
  "packages/cli/src/tui/direct-input.ts"() {
563378
563605
  "use strict";
563379
- DirectInput = class extends EventEmitter9 {
563606
+ DirectInput = class extends EventEmitter10 {
563380
563607
  /** Current input line text */
563381
563608
  line = "";
563382
563609
  /** Cursor position within .line (0-based) */
@@ -574561,6 +574788,54 @@ async function handleRequest(req2, res, ollamaUrl, verbose) {
574561
574788
  });
574562
574789
  return;
574563
574790
  }
574791
+ if (pathname === "/v1/codegraph/snapshot" && method === "GET") {
574792
+ const workingDir = process.cwd();
574793
+ const db = getCodeGraphDBIfReady(workingDir);
574794
+ const stats = db ? db.getStats() : { fileCount: 0, symbolCount: 0, edgeCount: 0, lastFullIndex: null };
574795
+ const topFiles = db ? db.getTopFiles(15) : [];
574796
+ const recent = codeGraphEvents.recent(50);
574797
+ jsonResponse(res, 200, { stats, topFiles, recent });
574798
+ return;
574799
+ }
574800
+ if (pathname === "/v1/codegraph/events" && method === "GET") {
574801
+ res.writeHead(200, {
574802
+ "Content-Type": "text/event-stream",
574803
+ "Cache-Control": "no-cache",
574804
+ "Connection": "keep-alive",
574805
+ "X-Accel-Buffering": "no"
574806
+ });
574807
+ res.write(": connected\n\n");
574808
+ const onEvent = (ev) => {
574809
+ try {
574810
+ res.write(`event: ${ev.type}
574811
+ `);
574812
+ res.write(`data: ${JSON.stringify(ev)}
574813
+
574814
+ `);
574815
+ } catch {
574816
+ }
574817
+ };
574818
+ codeGraphEvents.on("event", onEvent);
574819
+ const keepAlive = setInterval(() => {
574820
+ try {
574821
+ res.write(`: keepalive ${Date.now()}
574822
+
574823
+ `);
574824
+ } catch {
574825
+ }
574826
+ }, 15e3);
574827
+ const cleanup = () => {
574828
+ clearInterval(keepAlive);
574829
+ codeGraphEvents.off("event", onEvent);
574830
+ try {
574831
+ res.end();
574832
+ } catch {
574833
+ }
574834
+ };
574835
+ req2.on("close", cleanup);
574836
+ req2.on("error", cleanup);
574837
+ return;
574838
+ }
574564
574839
  if (pathname === "/v1/scheduled" && method === "GET") {
574565
574840
  jsonResponse(res, 200, { tasks: listScheduledTasks() });
574566
574841
  return;
@@ -576915,7 +577190,7 @@ var voicechat_exports = {};
576915
577190
  __export(voicechat_exports, {
576916
577191
  VoiceChatSession: () => VoiceChatSession
576917
577192
  });
576918
- import { EventEmitter as EventEmitter10 } from "node:events";
577193
+ import { EventEmitter as EventEmitter11 } from "node:events";
576919
577194
  function clamp01(x) {
576920
577195
  return x < 0 ? 0 : x > 1 ? 1 : x;
576921
577196
  }
@@ -577025,7 +577300,7 @@ Rules:
577025
577300
  - Prefer tools for factual queries; otherwise, answer directly with a short reply.`;
577026
577301
  MIN_SIGNAL_SCORE = 0.4;
577027
577302
  NOISE_ONLY_RE = /^(?:[.·…\s,;:!?\-–—_()\[\]{}"'`]+|(?:uh|um|erm|hmm|mm+|uhh+|umm+)[\s.!?]*)+$/i;
577028
- VoiceChatSession = class extends EventEmitter10 {
577303
+ VoiceChatSession = class extends EventEmitter11 {
577029
577304
  voice;
577030
577305
  listen;
577031
577306
  backendUrl;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "open-agents-ai",
3
- "version": "0.187.360",
3
+ "version": "0.187.361",
4
4
  "description": "AI coding agent powered by open-source models (Ollama/vLLM) — interactive TUI with agentic tool-calling loop",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",