@adhdev/daemon-standalone 0.7.29 → 0.7.30

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
@@ -19021,22 +19021,41 @@ var init_xterm_backend = __esm2({
19021
19021
  }
19022
19022
  });
19023
19023
  function createTerminalBackend(options, preference) {
19024
+ const ghosttyAvailable = isGhosttyVtBackendAvailable();
19024
19025
  if (preference === "ghostty-vt") {
19025
- return new GhosttyVtTerminalBackend(options);
19026
- }
19027
- if (preference === "auto" && isGhosttyVtBackendAvailable()) {
19028
- return new GhosttyVtTerminalBackend(options);
19029
- }
19030
- return new XtermTerminalBackend(options);
19026
+ const backend2 = new GhosttyVtTerminalBackend(options);
19027
+ logTerminalBackendSelection(preference, ghosttyAvailable, backend2.kind);
19028
+ return backend2;
19029
+ }
19030
+ if (preference === "auto" && ghosttyAvailable) {
19031
+ const backend2 = new GhosttyVtTerminalBackend(options);
19032
+ logTerminalBackendSelection(preference, ghosttyAvailable, backend2.kind);
19033
+ return backend2;
19034
+ }
19035
+ const backend = new XtermTerminalBackend(options);
19036
+ logTerminalBackendSelection(preference, ghosttyAvailable, backend.kind);
19037
+ return backend;
19038
+ }
19039
+ function logTerminalBackendSelection(preference, ghosttyAvailable, backendKind) {
19040
+ const key = `${preference}:${ghosttyAvailable}:${backendKind}`;
19041
+ if (loggedTerminalBackends.has(key)) return;
19042
+ loggedTerminalBackends.add(key);
19043
+ LOG.info(
19044
+ "Terminal",
19045
+ `[terminal-screen] backend=${backendKind} preference=${preference} ghosttyAvailable=${ghosttyAvailable}`
19046
+ );
19031
19047
  }
19032
19048
  var DEFAULT_SCROLLBACK;
19049
+ var loggedTerminalBackends;
19033
19050
  var TerminalScreen;
19034
19051
  var init_terminal_screen = __esm2({
19035
19052
  "src/cli-adapters/terminal-screen.ts"() {
19036
19053
  "use strict";
19054
+ init_logger();
19037
19055
  init_ghostty_vt_backend();
19038
19056
  init_xterm_backend();
19039
19057
  DEFAULT_SCROLLBACK = 2e3;
19058
+ loggedTerminalBackends = /* @__PURE__ */ new Set();
19040
19059
  TerminalScreen = class {
19041
19060
  backendKind;
19042
19061
  rows;
@@ -22616,7 +22635,6 @@ async function setupIdeInstance(ctx, opts) {
22616
22635
  sessionId: ideInstance.getInstanceId(),
22617
22636
  parentSessionId: null,
22618
22637
  providerType: ideType,
22619
- providerCategory: "ide",
22620
22638
  transport: "cdp-page",
22621
22639
  cdpManagerKey: managerKey,
22622
22640
  instanceKey: `ide:${managerKey}`
@@ -22631,7 +22649,6 @@ async function setupIdeInstance(ctx, opts) {
22631
22649
  sessionId: ext.getInstanceId(),
22632
22650
  parentSessionId: ideInstance.getInstanceId(),
22633
22651
  providerType: ext.type,
22634
- providerCategory: "extension",
22635
22652
  transport: "cdp-webview",
22636
22653
  cdpManagerKey: managerKey,
22637
22654
  instanceKey: `ide:${managerKey}`
@@ -23029,9 +23046,31 @@ function getCurrentManagerKey(h) {
23029
23046
  function getTargetedCliAdapter(h, args, providerType) {
23030
23047
  return h.getCliAdapter(args?.targetSessionId || providerType || h.currentSession?.providerType || h.currentManagerKey);
23031
23048
  }
23049
+ function getTargetTransport(h, provider) {
23050
+ if (h.currentSession?.transport) return h.currentSession.transport;
23051
+ switch (provider?.category) {
23052
+ case "cli":
23053
+ return "pty";
23054
+ case "acp":
23055
+ return "acp";
23056
+ case "extension":
23057
+ return "cdp-webview";
23058
+ case "ide":
23059
+ return "cdp-page";
23060
+ default:
23061
+ return null;
23062
+ }
23063
+ }
23064
+ function isCliLikeTransport(transport) {
23065
+ return transport === "pty" || transport === "acp";
23066
+ }
23067
+ function isExtensionTransport(transport) {
23068
+ return transport === "cdp-webview";
23069
+ }
23032
23070
  function buildRecentSendKey(h, args, provider, text) {
23071
+ const transport = getTargetTransport(h, provider) || "unknown";
23033
23072
  const target = args?.targetSessionId || args?.agentType || h.currentSession?.providerType || h.currentProviderType || h.currentManagerKey || "unknown";
23034
- return `${provider?.category || "unknown"}:${target}:${text.trim()}`;
23073
+ return `${transport}:${target}:${text.trim()}`;
23035
23074
  }
23036
23075
  function isRecentDuplicateSend(key) {
23037
23076
  const now = Date.now();
@@ -23057,25 +23096,25 @@ async function handleChatHistory(h, args) {
23057
23096
  }
23058
23097
  async function handleReadChat(h, args) {
23059
23098
  const provider = h.getProvider(args?.agentType);
23099
+ const transport = getTargetTransport(h, provider);
23060
23100
  const _log = (msg) => LOG.debug("Command", `[read_chat] ${msg}`);
23061
- if (provider?.category === "cli" || provider?.category === "acp") {
23062
- const adapter = getTargetedCliAdapter(h, args, provider.type);
23101
+ if (isCliLikeTransport(transport)) {
23102
+ const adapter = getTargetedCliAdapter(h, args, provider?.type);
23063
23103
  if (adapter) {
23064
- _log(`${provider.category} adapter: ${adapter.cliType}`);
23104
+ _log(`${transport} adapter: ${adapter.cliType}`);
23065
23105
  const status = adapter.getStatus?.();
23066
23106
  if (status) {
23067
23107
  return {
23068
23108
  success: true,
23069
23109
  messages: status.messages || [],
23070
23110
  status: status.status,
23071
- activeModal: status.activeModal,
23072
- terminalHistory: status.terminalHistory || ""
23111
+ activeModal: status.activeModal
23073
23112
  };
23074
23113
  }
23075
23114
  }
23076
- return { success: false, error: `${provider.category} adapter not found` };
23115
+ return { success: false, error: `${transport} adapter not found` };
23077
23116
  }
23078
- if (provider?.category === "extension") {
23117
+ if (isExtensionTransport(transport)) {
23079
23118
  try {
23080
23119
  const evalResult = await h.evaluateProviderScript("readChat", void 0, 5e4);
23081
23120
  if (evalResult?.result) {
@@ -23089,7 +23128,7 @@ async function handleReadChat(h, args) {
23089
23128
  if (parsed && typeof parsed === "object") {
23090
23129
  _log(`Extension OK: ${parsed.messages?.length || 0} msgs`);
23091
23130
  h.historyWriter.appendNewMessages(
23092
- provider.type || "unknown_extension",
23131
+ provider?.type || "unknown_extension",
23093
23132
  parsed.messages || [],
23094
23133
  parsed.title,
23095
23134
  args?.targetSessionId
@@ -23105,7 +23144,7 @@ async function handleReadChat(h, args) {
23105
23144
  const parentSessionId = h.currentSession?.parentSessionId;
23106
23145
  if (cdp2 && parentSessionId) {
23107
23146
  const stream = await h.agentStream.collectActiveSession(cdp2, parentSessionId);
23108
- if (stream?.agentType !== provider.type) {
23147
+ if (stream?.agentType !== provider?.type) {
23109
23148
  return { success: true, messages: [], status: "idle" };
23110
23149
  }
23111
23150
  if (stream) {
@@ -23185,6 +23224,7 @@ async function handleSendChat(h, args) {
23185
23224
  if (!text) return { success: false, error: "text required" };
23186
23225
  const _log = (msg) => LOG.debug("Command", `[send_chat] ${msg}`);
23187
23226
  const provider = h.getProvider(args?.agentType);
23227
+ const transport = getTargetTransport(h, provider);
23188
23228
  const dedupeKey = buildRecentSendKey(h, args, provider, text);
23189
23229
  const _logSendSuccess = (method, targetAgent) => {
23190
23230
  h.historyWriter.appendNewMessages(
@@ -23200,20 +23240,20 @@ async function handleSendChat(h, args) {
23200
23240
  _log(`Suppressed duplicate send for ${dedupeKey}`);
23201
23241
  return { success: true, sent: false, deduplicated: true };
23202
23242
  }
23203
- if (provider?.category === "cli" || provider?.category === "acp") {
23204
- const adapter = getTargetedCliAdapter(h, args, provider.type);
23243
+ if (isCliLikeTransport(transport)) {
23244
+ const adapter = getTargetedCliAdapter(h, args, provider?.type);
23205
23245
  if (adapter) {
23206
- _log(`${provider.category} adapter: ${adapter.cliType}`);
23246
+ _log(`${transport} adapter: ${adapter.cliType}`);
23207
23247
  try {
23208
23248
  await adapter.sendMessage(text);
23209
- return _logSendSuccess(`${provider.category}-adapter`, adapter.cliType);
23249
+ return _logSendSuccess(`${transport}-adapter`, adapter.cliType);
23210
23250
  } catch (e) {
23211
- return { success: false, error: `${provider.category} send failed: ${e.message}` };
23251
+ return { success: false, error: `${transport} send failed: ${e.message}` };
23212
23252
  }
23213
23253
  }
23214
23254
  }
23215
- if (provider?.category === "extension") {
23216
- _log(`Extension: ${provider.type}`);
23255
+ if (isExtensionTransport(transport)) {
23256
+ _log(`Extension: ${provider?.type || "unknown_extension"}`);
23217
23257
  try {
23218
23258
  const evalResult = await h.evaluateProviderScript("sendMessage", { MESSAGE: text }, 3e4);
23219
23259
  if (evalResult?.result) {
@@ -23243,7 +23283,7 @@ async function handleSendChat(h, args) {
23243
23283
  return _logSendSuccess("agent-stream");
23244
23284
  }
23245
23285
  }
23246
- return { success: false, error: `Extension '${provider.type}' send failed` };
23286
+ return { success: false, error: `Extension '${provider?.type || "unknown_extension"}' send failed` };
23247
23287
  }
23248
23288
  const targetCdp = h.getCdp();
23249
23289
  if (!targetCdp?.isConnected) {
@@ -23369,7 +23409,8 @@ async function handleSendChat(h, args) {
23369
23409
  }
23370
23410
  async function handleListChats(h, args) {
23371
23411
  const provider = h.getProvider(args?.agentType);
23372
- if (provider?.category === "extension" && h.agentStream && h.getCdp() && h.currentSession?.sessionId) {
23412
+ const transport = getTargetTransport(h, provider);
23413
+ if (isExtensionTransport(transport) && h.agentStream && h.getCdp() && h.currentSession?.sessionId) {
23373
23414
  try {
23374
23415
  const chats = await h.agentStream.listSessionChats(h.getCdp(), h.currentSession.sessionId);
23375
23416
  LOG.info("Command", `[list_chats] Extension: ${chats.length} chats`);
@@ -23421,8 +23462,9 @@ async function handleListChats(h, args) {
23421
23462
  }
23422
23463
  async function handleNewChat(h, args) {
23423
23464
  const provider = h.getProvider(args?.agentType);
23424
- if (provider?.category === "cli") {
23425
- const adapter = getTargetedCliAdapter(h, args, provider.type);
23465
+ const transport = getTargetTransport(h, provider);
23466
+ if (transport === "pty") {
23467
+ const adapter = getTargetedCliAdapter(h, args, provider?.type);
23426
23468
  if (!adapter) return { success: false, error: "CLI adapter not running" };
23427
23469
  if (typeof adapter.clearHistory === "function") {
23428
23470
  adapter.clearHistory();
@@ -23430,7 +23472,7 @@ async function handleNewChat(h, args) {
23430
23472
  }
23431
23473
  return { success: false, error: "new_chat not supported by this CLI provider" };
23432
23474
  }
23433
- if (provider?.category === "extension" && h.agentStream && h.getCdp() && h.currentSession?.sessionId) {
23475
+ if (isExtensionTransport(transport) && h.agentStream && h.getCdp() && h.currentSession?.sessionId) {
23434
23476
  const ok = await h.agentStream.newSession(h.getCdp(), h.currentSession.sessionId);
23435
23477
  return { success: ok };
23436
23478
  }
@@ -23455,11 +23497,12 @@ async function handleNewChat(h, args) {
23455
23497
  }
23456
23498
  async function handleSwitchChat(h, args) {
23457
23499
  const provider = h.getProvider(args?.agentType);
23500
+ const transport = getTargetTransport(h, provider);
23458
23501
  const managerKey = getCurrentManagerKey(h);
23459
23502
  const sessionId = args?.sessionId || args?.id || args?.chatId;
23460
23503
  if (!sessionId) return { success: false, error: "sessionId required" };
23461
23504
  LOG.info("Command", `[switch_chat] sessionId=${sessionId}, manager=${managerKey}`);
23462
- if (provider?.category === "extension" && h.agentStream && h.getCdp() && h.currentSession?.sessionId) {
23505
+ if (isExtensionTransport(transport) && h.agentStream && h.getCdp() && h.currentSession?.sessionId) {
23463
23506
  const ok = await h.agentStream.switchConversation(h.getCdp(), h.currentSession.sessionId, sessionId);
23464
23507
  return { success: ok, result: ok ? "switched" : "failed" };
23465
23508
  }
@@ -23549,9 +23592,10 @@ async function handleSwitchChat(h, args) {
23549
23592
  }
23550
23593
  async function handleSetMode(h, args) {
23551
23594
  const provider = h.getProvider(args?.agentType);
23595
+ const transport = getTargetTransport(h, provider);
23552
23596
  const mode = args?.mode || "agent";
23553
- if (provider?.category === "acp") {
23554
- const adapter = getTargetedCliAdapter(h, args, provider.type);
23597
+ if (transport === "acp") {
23598
+ const adapter = getTargetedCliAdapter(h, args, provider?.type);
23555
23599
  if (adapter) {
23556
23600
  const acpInstance = adapter._acpInstance;
23557
23601
  if (acpInstance && typeof acpInstance.onEvent === "function") {
@@ -23604,10 +23648,11 @@ async function handleSetMode(h, args) {
23604
23648
  }
23605
23649
  async function handleChangeModel(h, args) {
23606
23650
  const provider = h.getProvider(args?.agentType);
23651
+ const transport = getTargetTransport(h, provider);
23607
23652
  const model = args?.model;
23608
- LOG.info("Command", `[change_model] model=${model} provider=${provider?.type} category=${provider?.category} manager=${getCurrentManagerKey(h)} providerType=${getCurrentProviderType(h)}`);
23609
- if (provider?.category === "acp") {
23610
- const adapter = getTargetedCliAdapter(h, args, provider.type);
23653
+ LOG.info("Command", `[change_model] model=${model} provider=${provider?.type} transport=${transport} manager=${getCurrentManagerKey(h)} providerType=${getCurrentProviderType(h)}`);
23654
+ if (transport === "acp") {
23655
+ const adapter = getTargetedCliAdapter(h, args, provider?.type);
23611
23656
  LOG.info("Command", `[change_model] ACP adapter found: ${!!adapter}, type=${adapter?.cliType}, hasAcpInstance=${!!adapter?._acpInstance}`);
23612
23657
  if (adapter) {
23613
23658
  const acpInstance = adapter._acpInstance;
@@ -23665,15 +23710,16 @@ async function handleSetThoughtLevel(h, args) {
23665
23710
  const value = args?.value;
23666
23711
  if (!configId || !value) return { success: false, error: "configId and value required" };
23667
23712
  const provider = h.getProvider(args?.agentType);
23668
- if (!provider || provider.category !== "acp") {
23713
+ const transport = getTargetTransport(h, provider);
23714
+ if (transport !== "acp") {
23669
23715
  return { success: false, error: "set_thought_level only for ACP providers" };
23670
23716
  }
23671
- const adapter = getTargetedCliAdapter(h, args, provider.type);
23717
+ const adapter = getTargetedCliAdapter(h, args, provider?.type);
23672
23718
  const acpInstance = adapter?._acpInstance;
23673
23719
  if (!acpInstance) return { success: false, error: "ACP instance not found" };
23674
23720
  try {
23675
23721
  await acpInstance.setConfigOption(configId, value);
23676
- LOG.info("Command", `[set_thought_level] ${configId}=${value} for ${provider.type}`);
23722
+ LOG.info("Command", `[set_thought_level] ${configId}=${value} for ${provider?.type || "unknown_acp"}`);
23677
23723
  return { success: true, configId, value };
23678
23724
  } catch (e) {
23679
23725
  return { success: false, error: e?.message };
@@ -23681,11 +23727,12 @@ async function handleSetThoughtLevel(h, args) {
23681
23727
  }
23682
23728
  async function handleResolveAction(h, args) {
23683
23729
  const provider = h.getProvider(args?.agentType);
23730
+ const transport = getTargetTransport(h, provider);
23684
23731
  const action = args?.action || "approve";
23685
23732
  const button = args?.button || args?.buttonText || (action === "approve" ? "Accept" : action === "reject" ? "Reject" : "Accept");
23686
23733
  LOG.info("Command", `[resolveAction] action=${action} button="${button}" provider=${provider?.type}`);
23687
- if (provider?.category === "cli") {
23688
- const adapter = getTargetedCliAdapter(h, args, provider.type);
23734
+ if (transport === "pty") {
23735
+ const adapter = getTargetedCliAdapter(h, args, provider?.type);
23689
23736
  if (!adapter) return { success: false, error: "CLI adapter not running" };
23690
23737
  if (args?.data && typeof adapter.resolveAction === "function") {
23691
23738
  try {
@@ -23726,7 +23773,7 @@ async function handleResolveAction(h, args) {
23726
23773
  LOG.info("Command", `[resolveAction] CLI PTY \u2192 buttonIndex=${buttonIndex} "${buttons[buttonIndex] ?? "?"}"`);
23727
23774
  return { success: true, buttonIndex, button: buttons[buttonIndex] ?? button };
23728
23775
  }
23729
- if (provider?.category === "extension" && h.agentStream && h.getCdp() && h.currentSession?.sessionId) {
23776
+ if (isExtensionTransport(transport) && h.agentStream && h.getCdp() && h.currentSession?.sessionId) {
23730
23777
  const ok = await h.agentStream.resolveSessionAction(h.getCdp(), h.currentSession.sessionId, action);
23731
23778
  return { success: ok };
23732
23779
  }
@@ -27867,7 +27914,6 @@ var DaemonCliManager = class {
27867
27914
  sessionId: cliInstance.instanceId,
27868
27915
  parentSessionId: null,
27869
27916
  providerType: normalizedType,
27870
- providerCategory: "cli",
27871
27917
  transport: "pty",
27872
27918
  adapterKey: key,
27873
27919
  instanceKey: key
@@ -27917,7 +27963,6 @@ ${installInfo}`
27917
27963
  sessionId,
27918
27964
  parentSessionId: null,
27919
27965
  providerType: normalizedType,
27920
- providerCategory: "acp",
27921
27966
  transport: "acp",
27922
27967
  adapterKey: key,
27923
27968
  instanceKey: key
@@ -28421,12 +28466,12 @@ var DaemonAgentStreamManager = class {
28421
28466
  this.logFn(`[AgentStream] Active session (${parentSessionId}): ${sessionId || "none"}`);
28422
28467
  }
28423
28468
  resolveSessionIdForTarget(parentSessionId, agentType) {
28424
- const child = (this.sessionRegistry?.listChildren(parentSessionId) || []).find((entry) => entry.providerCategory === "extension" && entry.providerType === agentType);
28469
+ const child = (this.sessionRegistry?.listChildren(parentSessionId) || []).find((entry) => entry.transport === "cdp-webview" && entry.providerType === agentType);
28425
28470
  return child?.sessionId || null;
28426
28471
  }
28427
28472
  async connectManagedSession(cdp, parentSessionId, runtimeSessionId) {
28428
28473
  const target = this.getSessionTarget(runtimeSessionId);
28429
- if (!target || target.providerCategory !== "extension") return null;
28474
+ if (!target || target.transport !== "cdp-webview") return null;
28430
28475
  const adapter = this.adaptersByType.get(target.providerType);
28431
28476
  if (!adapter) return null;
28432
28477
  const targets = await cdp.discoverAgentWebviews();
@@ -28709,7 +28754,6 @@ var AgentStreamPoller = class {
28709
28754
  sessionId: extInstance.getInstanceId(),
28710
28755
  parentSessionId,
28711
28756
  providerType: extType,
28712
- providerCategory: "extension",
28713
28757
  transport: "cdp-webview",
28714
28758
  cdpManagerKey: ideType,
28715
28759
  instanceKey: `ide:${ideType}`
@@ -28921,7 +28965,6 @@ var ProviderInstanceManager = class {
28921
28965
  providerType,
28922
28966
  instanceId: state.instanceId,
28923
28967
  targetSessionId: state.instanceId,
28924
- providerCategory: state.category,
28925
28968
  workspaceName: state.workspace || void 0,
28926
28969
  ...extra
28927
28970
  });