@adhdev/daemon-standalone 0.8.82 → 0.8.84

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/index.js CHANGED
@@ -28806,6 +28806,59 @@ var require_dist2 = __commonJS({
28806
28806
  VALID_ROLES = ["user", "assistant", "system", "human"];
28807
28807
  }
28808
28808
  });
28809
+ function normalizeCategories(categories) {
28810
+ if (!Array.isArray(categories)) return [];
28811
+ return categories.map((category) => String(category || "").trim()).filter(Boolean);
28812
+ }
28813
+ function resolveDebugRuntimeConfig(options = {}) {
28814
+ const dev = options.dev === true;
28815
+ return {
28816
+ logLevel: options.logLevel || (dev ? "debug" : DEFAULT_CONFIG2.logLevel),
28817
+ collectDebugTrace: typeof options.trace === "boolean" ? options.trace : dev,
28818
+ traceContent: options.traceContent === true,
28819
+ traceBufferSize: Number.isFinite(options.traceBufferSize) ? Math.max(10, Math.floor(options.traceBufferSize)) : dev ? DEV_TRACE_BUFFER_SIZE : DEFAULT_CONFIG2.traceBufferSize,
28820
+ traceCategories: normalizeCategories(options.traceCategories)
28821
+ };
28822
+ }
28823
+ function setDebugRuntimeConfig(config2) {
28824
+ currentConfig = {
28825
+ ...config2,
28826
+ traceCategories: normalizeCategories(config2.traceCategories),
28827
+ traceBufferSize: Math.max(10, Math.floor(config2.traceBufferSize || DEFAULT_CONFIG2.traceBufferSize))
28828
+ };
28829
+ }
28830
+ function getDebugRuntimeConfig() {
28831
+ return { ...currentConfig, traceCategories: [...currentConfig.traceCategories] };
28832
+ }
28833
+ function resetDebugRuntimeConfig() {
28834
+ currentConfig = { ...DEFAULT_CONFIG2 };
28835
+ }
28836
+ function shouldCollectTraceCategory(category) {
28837
+ const config2 = currentConfig;
28838
+ if (!config2.collectDebugTrace) return false;
28839
+ if (!category) return true;
28840
+ if (config2.traceCategories.length === 0) return true;
28841
+ return config2.traceCategories.includes(category);
28842
+ }
28843
+ var NORMAL_TRACE_BUFFER_SIZE;
28844
+ var DEV_TRACE_BUFFER_SIZE;
28845
+ var DEFAULT_CONFIG2;
28846
+ var currentConfig;
28847
+ var init_debug_config = __esm2({
28848
+ "src/logging/debug-config.ts"() {
28849
+ "use strict";
28850
+ NORMAL_TRACE_BUFFER_SIZE = 200;
28851
+ DEV_TRACE_BUFFER_SIZE = 1e3;
28852
+ DEFAULT_CONFIG2 = {
28853
+ logLevel: "info",
28854
+ collectDebugTrace: false,
28855
+ traceContent: false,
28856
+ traceBufferSize: NORMAL_TRACE_BUFFER_SIZE,
28857
+ traceCategories: []
28858
+ };
28859
+ currentConfig = { ...DEFAULT_CONFIG2 };
28860
+ }
28861
+ });
28809
28862
  function isModuleNotFoundError(error48, ref) {
28810
28863
  if (!(error48 instanceof Error)) return false;
28811
28864
  const message = error48.message || "";
@@ -29003,10 +29056,12 @@ var require_dist2 = __commonJS({
29003
29056
  if (loggedTerminalBackends.has(key)) return;
29004
29057
  loggedTerminalBackends.add(key);
29005
29058
  if (backendKind === "xterm" && preference !== "xterm" && !ghosttyAvailable) {
29006
- LOG2.warn(
29007
- "Terminal",
29008
- `[terminal-screen] ghostty-vt unavailable; using xterm fallback (preference=${preference})`
29009
- );
29059
+ const message = `[terminal-screen] ghostty-vt unavailable; using xterm fallback (preference=${preference})`;
29060
+ if (preference === "auto") {
29061
+ LOG2.info("Terminal", message);
29062
+ } else {
29063
+ LOG2.warn("Terminal", message);
29064
+ }
29010
29065
  return;
29011
29066
  }
29012
29067
  LOG2.info(
@@ -29654,6 +29709,7 @@ var require_dist2 = __commonJS({
29654
29709
  "use strict";
29655
29710
  os10 = __toESM2(require("os"));
29656
29711
  init_logger();
29712
+ init_debug_config();
29657
29713
  init_terminal_screen();
29658
29714
  init_pty_transport();
29659
29715
  init_provider_cli_shared();
@@ -29687,7 +29743,15 @@ var require_dist2 = __commonJS({
29687
29743
  `[${this.cliType}] Provider resolution: providerDir=${this.providerResolutionMeta.providerDir || "-"} scriptDir=${this.providerResolutionMeta.scriptDir || "-"} scriptsPath=${this.providerResolutionMeta.scriptsPath || "-"} source=${this.providerResolutionMeta.scriptsSource || "-"} version=${this.providerResolutionMeta.resolvedVersion || "-"}`
29688
29744
  );
29689
29745
  } else {
29690
- LOG2.warn("CLI", `[${this.cliType}] \u26A0 No CLI scripts loaded! Provider needs scripts/{version}/scripts.js`);
29746
+ const resolutionSummary = `providerDir=${this.providerResolutionMeta.providerDir || "-"} scriptDir=${this.providerResolutionMeta.scriptDir || "-"} scriptsPath=${this.providerResolutionMeta.scriptsPath || "-"} source=${this.providerResolutionMeta.scriptsSource || "-"} version=${this.providerResolutionMeta.resolvedVersion || "-"}`;
29747
+ const hasResolvedProviderScripts = Boolean(
29748
+ this.providerResolutionMeta.providerDir || this.providerResolutionMeta.scriptDir || this.providerResolutionMeta.scriptsPath || this.providerResolutionMeta.scriptsSource || this.providerResolutionMeta.resolvedVersion
29749
+ );
29750
+ if (hasResolvedProviderScripts) {
29751
+ LOG2.warn("CLI", `[${this.cliType}] \u26A0 No CLI scripts loaded! Provider needs scripts/{version}/scripts.js (${resolutionSummary})`);
29752
+ } else {
29753
+ LOG2.info("CLI", `[${this.cliType}] CLI scripts not yet resolved (${resolutionSummary})`);
29754
+ }
29691
29755
  }
29692
29756
  }
29693
29757
  cliType;
@@ -29766,7 +29830,8 @@ var require_dist2 = __commonJS({
29766
29830
  currentTurnScope = null;
29767
29831
  traceEntries = [];
29768
29832
  traceSeq = 0;
29769
- traceSessionId = `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;
29833
+ traceSessionId = "";
29834
+ parsedStatusCache = null;
29770
29835
  static MAX_TRACE_ENTRIES = 250;
29771
29836
  providerResolutionMeta;
29772
29837
  static FINISH_RETRY_DELAY_MS = 300;
@@ -30007,7 +30072,8 @@ var require_dist2 = __commonJS({
30007
30072
  this.terminalScreen.write(rawData);
30008
30073
  const cleanData = sanitizeTerminalText(rawData);
30009
30074
  const now = Date.now();
30010
- const normalizedScreenSnapshot = normalizeScreenSnapshot(this.terminalScreen.getText());
30075
+ const screenText = this.terminalScreen.getText();
30076
+ const normalizedScreenSnapshot = normalizeScreenSnapshot(screenText);
30011
30077
  this.lastOutputAt = now;
30012
30078
  if (cleanData.trim()) this.lastNonEmptyOutputAt = now;
30013
30079
  if (normalizedScreenSnapshot !== this.lastScreenSnapshot) {
@@ -30020,13 +30086,14 @@ var require_dist2 = __commonJS({
30020
30086
  if (this.idleFinishCandidate && (rawData.length > 0 || cleanData.length > 0)) {
30021
30087
  this.clearIdleFinishCandidate("new_output");
30022
30088
  }
30023
- this.recordTrace("output", {
30024
- rawLength: rawData.length,
30025
- cleanLength: cleanData.length,
30026
- rawPreview: summarizeCliTraceText(rawData, 300),
30027
- cleanPreview: summarizeCliTraceText(cleanData, 300),
30028
- screenText: summarizeCliTraceText(this.terminalScreen.getText(), 1200)
30029
- });
30089
+ if (getDebugRuntimeConfig().collectDebugTrace) {
30090
+ this.recordTrace("output", {
30091
+ rawLength: rawData.length,
30092
+ cleanLength: cleanData.length,
30093
+ rawPreview: summarizeCliTraceText(rawData, 300),
30094
+ cleanPreview: summarizeCliTraceText(cleanData, 300)
30095
+ });
30096
+ }
30030
30097
  if (this.startupParseGate) {
30031
30098
  this.scheduleStartupSettleCheck();
30032
30099
  }
@@ -30728,12 +30795,19 @@ var require_dist2 = __commonJS({
30728
30795
  * Called by command handler / dashboard for rich content rendering.
30729
30796
  */
30730
30797
  getScriptParsedStatus() {
30798
+ const screenText = this.terminalScreen.getText();
30799
+ const cached2 = this.parsedStatusCache;
30800
+ if (cached2 && cached2.committedMessagesRef === this.committedMessages && cached2.responseBuffer === this.responseBuffer && cached2.currentTurnScope === this.currentTurnScope && cached2.recentOutputBuffer === this.recentOutputBuffer && cached2.accumulatedBuffer === this.accumulatedBuffer && cached2.accumulatedRawBuffer === this.accumulatedRawBuffer && cached2.screenText === screenText && cached2.currentStatus === this.currentStatus && cached2.activeModal === this.activeModal && cached2.cliName === this.cliName && cached2.lastOutputAt === this.lastOutputAt) {
30801
+ return cached2.result;
30802
+ }
30731
30803
  const parsed = this.parseCurrentTranscript(
30732
30804
  this.committedMessages,
30733
30805
  this.responseBuffer,
30734
- this.currentTurnScope
30806
+ this.currentTurnScope,
30807
+ screenText
30735
30808
  );
30736
30809
  const shouldPreferCommittedMessages = !this.currentTurnScope && this.currentStatus === "idle" && !this.activeModal;
30810
+ let result;
30737
30811
  if (parsed && Array.isArray(parsed.messages)) {
30738
30812
  const hydratedMessages = shouldPreferCommittedMessages ? this.committedMessages.map((message, index) => buildChatMessage({
30739
30813
  ...message,
@@ -30745,7 +30819,7 @@ var require_dist2 = __commonJS({
30745
30819
  scope: this.currentTurnScope,
30746
30820
  lastOutputAt: this.lastOutputAt
30747
30821
  });
30748
- return {
30822
+ result = {
30749
30823
  id: parsed.id || "cli_session",
30750
30824
  status: parsed.status || this.currentStatus,
30751
30825
  title: parsed.title || this.cliName,
@@ -30753,20 +30827,36 @@ var require_dist2 = __commonJS({
30753
30827
  activeModal: parsed.activeModal ?? this.activeModal,
30754
30828
  providerSessionId: typeof parsed.providerSessionId === "string" ? parsed.providerSessionId : void 0
30755
30829
  };
30830
+ } else {
30831
+ const messages = [...this.committedMessages];
30832
+ result = {
30833
+ id: "cli_session",
30834
+ status: this.currentStatus,
30835
+ title: this.cliName,
30836
+ messages: messages.map((message, index) => buildChatMessage({
30837
+ ...message,
30838
+ id: message.id || `msg_${index}`,
30839
+ index: typeof message.index === "number" ? message.index : index,
30840
+ receivedAt: typeof message.receivedAt === "number" ? message.receivedAt : message.timestamp
30841
+ })),
30842
+ activeModal: this.activeModal
30843
+ };
30756
30844
  }
30757
- const messages = [...this.committedMessages];
30758
- return {
30759
- id: "cli_session",
30760
- status: this.currentStatus,
30761
- title: this.cliName,
30762
- messages: messages.map((message, index) => buildChatMessage({
30763
- ...message,
30764
- id: message.id || `msg_${index}`,
30765
- index: typeof message.index === "number" ? message.index : index,
30766
- receivedAt: typeof message.receivedAt === "number" ? message.receivedAt : message.timestamp
30767
- })),
30768
- activeModal: this.activeModal
30845
+ this.parsedStatusCache = {
30846
+ committedMessagesRef: this.committedMessages,
30847
+ responseBuffer: this.responseBuffer,
30848
+ currentTurnScope: this.currentTurnScope,
30849
+ recentOutputBuffer: this.recentOutputBuffer,
30850
+ accumulatedBuffer: this.accumulatedBuffer,
30851
+ accumulatedRawBuffer: this.accumulatedRawBuffer,
30852
+ screenText,
30853
+ currentStatus: this.currentStatus,
30854
+ activeModal: this.activeModal,
30855
+ cliName: this.cliName,
30856
+ lastOutputAt: this.lastOutputAt,
30857
+ result
30769
30858
  };
30859
+ return result;
30770
30860
  }
30771
30861
  async invokeScript(scriptName, args) {
30772
30862
  const fn2 = this.cliScripts?.[scriptName];
@@ -30789,17 +30879,18 @@ var require_dist2 = __commonJS({
30789
30879
  args: args && typeof args === "object" ? { ...args } : {}
30790
30880
  }));
30791
30881
  }
30792
- parseCurrentTranscript(baseMessages, partialResponse, scope) {
30882
+ parseCurrentTranscript(baseMessages, partialResponse, scope, screenTextOverride) {
30793
30883
  if (!this.cliScripts?.parseOutput) {
30794
30884
  this.parseErrorMessage = null;
30795
30885
  return null;
30796
30886
  }
30797
30887
  try {
30888
+ const screenText = typeof screenTextOverride === "string" ? screenTextOverride : this.terminalScreen.getText();
30798
30889
  const input = buildCliParseInput({
30799
30890
  accumulatedBuffer: this.accumulatedBuffer,
30800
30891
  accumulatedRawBuffer: this.accumulatedRawBuffer,
30801
30892
  recentOutputBuffer: this.recentOutputBuffer,
30802
- terminalScreenText: this.terminalScreen.getText(),
30893
+ terminalScreenText: screenText,
30803
30894
  baseMessages,
30804
30895
  partialResponse,
30805
30896
  isWaitingForResponse: this.isWaitingForResponse,
@@ -32447,9 +32538,15 @@ ${data.message || ""}`.trim();
32447
32538
  continue;
32448
32539
  }
32449
32540
  const status = String(session?.status || "").toLowerCase();
32541
+ const unread = session?.unread === true;
32542
+ const inboxBucket = String(session?.inboxBucket || "").toLowerCase();
32543
+ const runtimeSurfaceKind = String(session?.runtimeSurfaceKind || "").toLowerCase();
32544
+ const runtimeLifecycle = String(session?.runtimeLifecycle || "").toLowerCase();
32545
+ const isLiveRuntime = runtimeSurfaceKind === "live_runtime" || LIVE_RUNTIME_LIFECYCLES.has(runtimeLifecycle);
32450
32546
  const lastMessageAt = parseMessageTimestamp(session?.lastMessageAt);
32451
32547
  const recentlyUpdated = lastMessageAt > 0 && now - lastMessageAt <= recentMessageGraceMs;
32452
- if (activeStatuses.has(status) || recentlyUpdated) {
32548
+ const shouldKeepRecentTailHot = recentlyUpdated && (unread || inboxBucket === "task_complete" || inboxBucket === "needs_attention" || isLiveRuntime || activeStatuses.has(status));
32549
+ if (activeStatuses.has(status) || shouldKeepRecentTailHot) {
32453
32550
  active.add(sessionId);
32454
32551
  }
32455
32552
  }
@@ -37030,50 +37127,7 @@ ${effect.notification.body || ""}`.trim();
37030
37127
  }
37031
37128
  init_read_chat_contract();
37032
37129
  init_logger();
37033
- var NORMAL_TRACE_BUFFER_SIZE = 200;
37034
- var DEV_TRACE_BUFFER_SIZE = 1e3;
37035
- var DEFAULT_CONFIG2 = {
37036
- logLevel: "info",
37037
- collectDebugTrace: false,
37038
- traceContent: false,
37039
- traceBufferSize: NORMAL_TRACE_BUFFER_SIZE,
37040
- traceCategories: []
37041
- };
37042
- var currentConfig = { ...DEFAULT_CONFIG2 };
37043
- function normalizeCategories(categories) {
37044
- if (!Array.isArray(categories)) return [];
37045
- return categories.map((category) => String(category || "").trim()).filter(Boolean);
37046
- }
37047
- function resolveDebugRuntimeConfig(options = {}) {
37048
- const dev = options.dev === true;
37049
- return {
37050
- logLevel: options.logLevel || (dev ? "debug" : DEFAULT_CONFIG2.logLevel),
37051
- collectDebugTrace: typeof options.trace === "boolean" ? options.trace : dev,
37052
- traceContent: options.traceContent === true,
37053
- traceBufferSize: Number.isFinite(options.traceBufferSize) ? Math.max(10, Math.floor(options.traceBufferSize)) : dev ? DEV_TRACE_BUFFER_SIZE : DEFAULT_CONFIG2.traceBufferSize,
37054
- traceCategories: normalizeCategories(options.traceCategories)
37055
- };
37056
- }
37057
- function setDebugRuntimeConfig(config2) {
37058
- currentConfig = {
37059
- ...config2,
37060
- traceCategories: normalizeCategories(config2.traceCategories),
37061
- traceBufferSize: Math.max(10, Math.floor(config2.traceBufferSize || DEFAULT_CONFIG2.traceBufferSize))
37062
- };
37063
- }
37064
- function getDebugRuntimeConfig() {
37065
- return { ...currentConfig, traceCategories: [...currentConfig.traceCategories] };
37066
- }
37067
- function resetDebugRuntimeConfig() {
37068
- currentConfig = { ...DEFAULT_CONFIG2 };
37069
- }
37070
- function shouldCollectTraceCategory(category) {
37071
- const config2 = currentConfig;
37072
- if (!config2.collectDebugTrace) return false;
37073
- if (!category) return true;
37074
- if (config2.traceCategories.length === 0) return true;
37075
- return config2.traceCategories.includes(category);
37076
- }
37130
+ init_debug_config();
37077
37131
  function summarizeString(value) {
37078
37132
  return `[${value.length} chars]`;
37079
37133
  }
@@ -39813,6 +39867,30 @@ ${effect.notification.body || ""}`.trim();
39813
39867
  init_provider_cli_adapter();
39814
39868
  init_logger();
39815
39869
  init_chat_message_normalization();
39870
+ function normalizePersistableCliHistoryContent(content) {
39871
+ return flattenContent(content).replace(/\s+/g, " ").trim();
39872
+ }
39873
+ function buildPersistableCliHistorySignature(message) {
39874
+ return [
39875
+ String(message.role || ""),
39876
+ String(message.kind || ""),
39877
+ String(message.senderName || ""),
39878
+ normalizePersistableCliHistoryContent(message.content)
39879
+ ].join("|");
39880
+ }
39881
+ function buildIncrementalHistoryAppendMessages(previousMessages, currentMessages) {
39882
+ if (!Array.isArray(currentMessages) || currentMessages.length === 0) return [];
39883
+ if (!Array.isArray(previousMessages) || previousMessages.length === 0) return currentMessages;
39884
+ const previousSignatures = previousMessages.map(buildPersistableCliHistorySignature);
39885
+ const currentSignatures = currentMessages.map(buildPersistableCliHistorySignature);
39886
+ let sharedPrefixLength = 0;
39887
+ while (sharedPrefixLength < previousSignatures.length && sharedPrefixLength < currentSignatures.length && previousSignatures[sharedPrefixLength] === currentSignatures[sharedPrefixLength]) {
39888
+ sharedPrefixLength += 1;
39889
+ }
39890
+ if (sharedPrefixLength === currentSignatures.length) return [];
39891
+ if (sharedPrefixLength === previousSignatures.length) return currentMessages.slice(sharedPrefixLength);
39892
+ return currentMessages;
39893
+ }
39816
39894
  var CachedDatabaseSync = null;
39817
39895
  function getDatabaseSync() {
39818
39896
  if (CachedDatabaseSync) return CachedDatabaseSync;
@@ -39890,6 +39968,7 @@ ${effect.notification.body || ""}`.trim();
39890
39968
  appliedEffectKeys = /* @__PURE__ */ new Set();
39891
39969
  historyWriter;
39892
39970
  runtimeMessages = [];
39971
+ lastPersistedHistoryMessages = [];
39893
39972
  instanceId;
39894
39973
  suppressIdleHistoryReplay = false;
39895
39974
  errorMessage = void 0;
@@ -39930,6 +40009,13 @@ ${effect.notification.body || ""}`.trim();
39930
40009
  this.providerSessionId,
39931
40010
  this.instanceId
39932
40011
  );
40012
+ this.lastPersistedHistoryMessages = restoredHistory.messages.map((message) => ({
40013
+ role: message.role,
40014
+ content: message.content,
40015
+ kind: message.kind,
40016
+ senderName: message.senderName,
40017
+ receivedAt: message.receivedAt
40018
+ }));
39933
40019
  this.suppressIdleHistoryReplay = restoredHistory.messages.length > 0;
39934
40020
  if (restoredHistory.messages.length > 0) {
39935
40021
  this.adapter.seedCommittedMessages(
@@ -39960,6 +40046,7 @@ ${effect.notification.body || ""}`.trim();
39960
40046
  }
39961
40047
  async onTick() {
39962
40048
  if (this.providerSessionId) return;
40049
+ if (this.type === "hermes-cli" && this.launchMode === "new") return;
39963
40050
  let probedSessionId = null;
39964
40051
  const probeConfig = this.provider.sessionProbe;
39965
40052
  if (probeConfig) {
@@ -40060,15 +40147,24 @@ ${effect.notification.body || ""}`.trim();
40060
40147
  messagesToSave = messagesToSave.slice(0, lastIdx);
40061
40148
  }
40062
40149
  }
40063
- if (!shouldSkipReplayPersist && messagesToSave.length > 0) {
40150
+ const normalizedMessagesToSave = messagesToSave.map((message) => ({
40151
+ role: message.role,
40152
+ content: flattenContent(message.content),
40153
+ kind: typeof message.kind === "string" ? message.kind : void 0,
40154
+ senderName: typeof message.senderName === "string" ? message.senderName : void 0,
40155
+ receivedAt: typeof message.receivedAt === "number" ? message.receivedAt : message.timestamp
40156
+ }));
40157
+ if (!shouldSkipReplayPersist && normalizedMessagesToSave.length > 0) {
40158
+ const incrementalMessages = buildIncrementalHistoryAppendMessages(this.lastPersistedHistoryMessages, normalizedMessagesToSave);
40064
40159
  this.historyWriter.appendNewMessages(
40065
40160
  this.type,
40066
- messagesToSave,
40161
+ incrementalMessages,
40067
40162
  parsedStatus?.title || dirName,
40068
40163
  this.instanceId,
40069
40164
  this.providerSessionId
40070
40165
  );
40071
40166
  }
40167
+ this.lastPersistedHistoryMessages = normalizedMessagesToSave;
40072
40168
  }
40073
40169
  this.applyProviderResponse(parsedStatus, { phase: "immediate" });
40074
40170
  const surface = resolveProviderStateSurface({
@@ -40316,6 +40412,7 @@ ${effect.notification.body || ""}`.trim();
40316
40412
  }
40317
40413
  if (data.sessionEvent === "new_session") {
40318
40414
  this.runtimeMessages = [];
40415
+ this.lastPersistedHistoryMessages = [];
40319
40416
  this.suppressIdleHistoryReplay = false;
40320
40417
  this.adapter.clearHistory();
40321
40418
  }
@@ -44614,6 +44711,8 @@ Run 'adhdev doctor' for detailed diagnostics.`
44614
44711
  session.lastSeenAt = lastSeenAt;
44615
44712
  session.unread = overlayUnread;
44616
44713
  session.inboxBucket = overlayInboxBucket;
44714
+ session.completionMarker = completionMarker;
44715
+ session.seenCompletionMarker = seenCompletionMarker;
44617
44716
  if (READ_DEBUG_ENABLED && (session.unread || session.inboxBucket !== "idle" || session.providerType.includes("codex"))) {
44618
44717
  const recentReadSnapshot = {
44619
44718
  sessionId: session.id,
@@ -45856,6 +45955,7 @@ Run 'adhdev doctor' for detailed diagnostics.`
45856
45955
  }
45857
45956
  };
45858
45957
  init_logger();
45958
+ init_debug_config();
45859
45959
  var DEFAULT_DAEMON_PORT = 19222;
45860
45960
  var DAEMON_WS_PATH = "/ipc";
45861
45961
  function normalizeSyncMode(syncMode) {