@adhdev/daemon-core 0.7.28 → 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.mjs CHANGED
@@ -773,21 +773,39 @@ var init_xterm_backend = __esm({
773
773
 
774
774
  // src/cli-adapters/terminal-screen.ts
775
775
  function createTerminalBackend(options, preference) {
776
+ const ghosttyAvailable = isGhosttyVtBackendAvailable();
776
777
  if (preference === "ghostty-vt") {
777
- return new GhosttyVtTerminalBackend(options);
778
- }
779
- if (preference === "auto" && isGhosttyVtBackendAvailable()) {
780
- return new GhosttyVtTerminalBackend(options);
781
- }
782
- return new XtermTerminalBackend(options);
778
+ const backend2 = new GhosttyVtTerminalBackend(options);
779
+ logTerminalBackendSelection(preference, ghosttyAvailable, backend2.kind);
780
+ return backend2;
781
+ }
782
+ if (preference === "auto" && ghosttyAvailable) {
783
+ const backend2 = new GhosttyVtTerminalBackend(options);
784
+ logTerminalBackendSelection(preference, ghosttyAvailable, backend2.kind);
785
+ return backend2;
786
+ }
787
+ const backend = new XtermTerminalBackend(options);
788
+ logTerminalBackendSelection(preference, ghosttyAvailable, backend.kind);
789
+ return backend;
790
+ }
791
+ function logTerminalBackendSelection(preference, ghosttyAvailable, backendKind) {
792
+ const key = `${preference}:${ghosttyAvailable}:${backendKind}`;
793
+ if (loggedTerminalBackends.has(key)) return;
794
+ loggedTerminalBackends.add(key);
795
+ LOG.info(
796
+ "Terminal",
797
+ `[terminal-screen] backend=${backendKind} preference=${preference} ghosttyAvailable=${ghosttyAvailable}`
798
+ );
783
799
  }
784
- var DEFAULT_SCROLLBACK, TerminalScreen;
800
+ var DEFAULT_SCROLLBACK, loggedTerminalBackends, TerminalScreen;
785
801
  var init_terminal_screen = __esm({
786
802
  "src/cli-adapters/terminal-screen.ts"() {
787
803
  "use strict";
804
+ init_logger();
788
805
  init_ghostty_vt_backend();
789
806
  init_xterm_backend();
790
807
  DEFAULT_SCROLLBACK = 2e3;
808
+ loggedTerminalBackends = /* @__PURE__ */ new Set();
791
809
  TerminalScreen = class {
792
810
  backendKind;
793
811
  rows;
@@ -4412,7 +4430,6 @@ async function setupIdeInstance(ctx, opts) {
4412
4430
  sessionId: ideInstance.getInstanceId(),
4413
4431
  parentSessionId: null,
4414
4432
  providerType: ideType,
4415
- providerCategory: "ide",
4416
4433
  transport: "cdp-page",
4417
4434
  cdpManagerKey: managerKey,
4418
4435
  instanceKey: `ide:${managerKey}`
@@ -4427,7 +4444,6 @@ async function setupIdeInstance(ctx, opts) {
4427
4444
  sessionId: ext.getInstanceId(),
4428
4445
  parentSessionId: ideInstance.getInstanceId(),
4429
4446
  providerType: ext.type,
4430
- providerCategory: "extension",
4431
4447
  transport: "cdp-webview",
4432
4448
  cdpManagerKey: managerKey,
4433
4449
  instanceKey: `ide:${managerKey}`
@@ -5003,9 +5019,31 @@ function getCurrentManagerKey(h) {
5003
5019
  function getTargetedCliAdapter(h, args, providerType) {
5004
5020
  return h.getCliAdapter(args?.targetSessionId || providerType || h.currentSession?.providerType || h.currentManagerKey);
5005
5021
  }
5022
+ function getTargetTransport(h, provider) {
5023
+ if (h.currentSession?.transport) return h.currentSession.transport;
5024
+ switch (provider?.category) {
5025
+ case "cli":
5026
+ return "pty";
5027
+ case "acp":
5028
+ return "acp";
5029
+ case "extension":
5030
+ return "cdp-webview";
5031
+ case "ide":
5032
+ return "cdp-page";
5033
+ default:
5034
+ return null;
5035
+ }
5036
+ }
5037
+ function isCliLikeTransport(transport) {
5038
+ return transport === "pty" || transport === "acp";
5039
+ }
5040
+ function isExtensionTransport(transport) {
5041
+ return transport === "cdp-webview";
5042
+ }
5006
5043
  function buildRecentSendKey(h, args, provider, text) {
5044
+ const transport = getTargetTransport(h, provider) || "unknown";
5007
5045
  const target = args?.targetSessionId || args?.agentType || h.currentSession?.providerType || h.currentProviderType || h.currentManagerKey || "unknown";
5008
- return `${provider?.category || "unknown"}:${target}:${text.trim()}`;
5046
+ return `${transport}:${target}:${text.trim()}`;
5009
5047
  }
5010
5048
  function isRecentDuplicateSend(key) {
5011
5049
  const now = Date.now();
@@ -5031,25 +5069,25 @@ async function handleChatHistory(h, args) {
5031
5069
  }
5032
5070
  async function handleReadChat(h, args) {
5033
5071
  const provider = h.getProvider(args?.agentType);
5072
+ const transport = getTargetTransport(h, provider);
5034
5073
  const _log = (msg) => LOG.debug("Command", `[read_chat] ${msg}`);
5035
- if (provider?.category === "cli" || provider?.category === "acp") {
5036
- const adapter = getTargetedCliAdapter(h, args, provider.type);
5074
+ if (isCliLikeTransport(transport)) {
5075
+ const adapter = getTargetedCliAdapter(h, args, provider?.type);
5037
5076
  if (adapter) {
5038
- _log(`${provider.category} adapter: ${adapter.cliType}`);
5077
+ _log(`${transport} adapter: ${adapter.cliType}`);
5039
5078
  const status = adapter.getStatus?.();
5040
5079
  if (status) {
5041
5080
  return {
5042
5081
  success: true,
5043
5082
  messages: status.messages || [],
5044
5083
  status: status.status,
5045
- activeModal: status.activeModal,
5046
- terminalHistory: status.terminalHistory || ""
5084
+ activeModal: status.activeModal
5047
5085
  };
5048
5086
  }
5049
5087
  }
5050
- return { success: false, error: `${provider.category} adapter not found` };
5088
+ return { success: false, error: `${transport} adapter not found` };
5051
5089
  }
5052
- if (provider?.category === "extension") {
5090
+ if (isExtensionTransport(transport)) {
5053
5091
  try {
5054
5092
  const evalResult = await h.evaluateProviderScript("readChat", void 0, 5e4);
5055
5093
  if (evalResult?.result) {
@@ -5063,7 +5101,7 @@ async function handleReadChat(h, args) {
5063
5101
  if (parsed && typeof parsed === "object") {
5064
5102
  _log(`Extension OK: ${parsed.messages?.length || 0} msgs`);
5065
5103
  h.historyWriter.appendNewMessages(
5066
- provider.type || "unknown_extension",
5104
+ provider?.type || "unknown_extension",
5067
5105
  parsed.messages || [],
5068
5106
  parsed.title,
5069
5107
  args?.targetSessionId
@@ -5079,7 +5117,7 @@ async function handleReadChat(h, args) {
5079
5117
  const parentSessionId = h.currentSession?.parentSessionId;
5080
5118
  if (cdp2 && parentSessionId) {
5081
5119
  const stream = await h.agentStream.collectActiveSession(cdp2, parentSessionId);
5082
- if (stream?.agentType !== provider.type) {
5120
+ if (stream?.agentType !== provider?.type) {
5083
5121
  return { success: true, messages: [], status: "idle" };
5084
5122
  }
5085
5123
  if (stream) {
@@ -5159,6 +5197,7 @@ async function handleSendChat(h, args) {
5159
5197
  if (!text) return { success: false, error: "text required" };
5160
5198
  const _log = (msg) => LOG.debug("Command", `[send_chat] ${msg}`);
5161
5199
  const provider = h.getProvider(args?.agentType);
5200
+ const transport = getTargetTransport(h, provider);
5162
5201
  const dedupeKey = buildRecentSendKey(h, args, provider, text);
5163
5202
  const _logSendSuccess = (method, targetAgent) => {
5164
5203
  h.historyWriter.appendNewMessages(
@@ -5174,20 +5213,20 @@ async function handleSendChat(h, args) {
5174
5213
  _log(`Suppressed duplicate send for ${dedupeKey}`);
5175
5214
  return { success: true, sent: false, deduplicated: true };
5176
5215
  }
5177
- if (provider?.category === "cli" || provider?.category === "acp") {
5178
- const adapter = getTargetedCliAdapter(h, args, provider.type);
5216
+ if (isCliLikeTransport(transport)) {
5217
+ const adapter = getTargetedCliAdapter(h, args, provider?.type);
5179
5218
  if (adapter) {
5180
- _log(`${provider.category} adapter: ${adapter.cliType}`);
5219
+ _log(`${transport} adapter: ${adapter.cliType}`);
5181
5220
  try {
5182
5221
  await adapter.sendMessage(text);
5183
- return _logSendSuccess(`${provider.category}-adapter`, adapter.cliType);
5222
+ return _logSendSuccess(`${transport}-adapter`, adapter.cliType);
5184
5223
  } catch (e) {
5185
- return { success: false, error: `${provider.category} send failed: ${e.message}` };
5224
+ return { success: false, error: `${transport} send failed: ${e.message}` };
5186
5225
  }
5187
5226
  }
5188
5227
  }
5189
- if (provider?.category === "extension") {
5190
- _log(`Extension: ${provider.type}`);
5228
+ if (isExtensionTransport(transport)) {
5229
+ _log(`Extension: ${provider?.type || "unknown_extension"}`);
5191
5230
  try {
5192
5231
  const evalResult = await h.evaluateProviderScript("sendMessage", { MESSAGE: text }, 3e4);
5193
5232
  if (evalResult?.result) {
@@ -5217,7 +5256,7 @@ async function handleSendChat(h, args) {
5217
5256
  return _logSendSuccess("agent-stream");
5218
5257
  }
5219
5258
  }
5220
- return { success: false, error: `Extension '${provider.type}' send failed` };
5259
+ return { success: false, error: `Extension '${provider?.type || "unknown_extension"}' send failed` };
5221
5260
  }
5222
5261
  const targetCdp = h.getCdp();
5223
5262
  if (!targetCdp?.isConnected) {
@@ -5343,7 +5382,8 @@ async function handleSendChat(h, args) {
5343
5382
  }
5344
5383
  async function handleListChats(h, args) {
5345
5384
  const provider = h.getProvider(args?.agentType);
5346
- if (provider?.category === "extension" && h.agentStream && h.getCdp() && h.currentSession?.sessionId) {
5385
+ const transport = getTargetTransport(h, provider);
5386
+ if (isExtensionTransport(transport) && h.agentStream && h.getCdp() && h.currentSession?.sessionId) {
5347
5387
  try {
5348
5388
  const chats = await h.agentStream.listSessionChats(h.getCdp(), h.currentSession.sessionId);
5349
5389
  LOG.info("Command", `[list_chats] Extension: ${chats.length} chats`);
@@ -5395,8 +5435,9 @@ async function handleListChats(h, args) {
5395
5435
  }
5396
5436
  async function handleNewChat(h, args) {
5397
5437
  const provider = h.getProvider(args?.agentType);
5398
- if (provider?.category === "cli") {
5399
- const adapter = getTargetedCliAdapter(h, args, provider.type);
5438
+ const transport = getTargetTransport(h, provider);
5439
+ if (transport === "pty") {
5440
+ const adapter = getTargetedCliAdapter(h, args, provider?.type);
5400
5441
  if (!adapter) return { success: false, error: "CLI adapter not running" };
5401
5442
  if (typeof adapter.clearHistory === "function") {
5402
5443
  adapter.clearHistory();
@@ -5404,7 +5445,7 @@ async function handleNewChat(h, args) {
5404
5445
  }
5405
5446
  return { success: false, error: "new_chat not supported by this CLI provider" };
5406
5447
  }
5407
- if (provider?.category === "extension" && h.agentStream && h.getCdp() && h.currentSession?.sessionId) {
5448
+ if (isExtensionTransport(transport) && h.agentStream && h.getCdp() && h.currentSession?.sessionId) {
5408
5449
  const ok = await h.agentStream.newSession(h.getCdp(), h.currentSession.sessionId);
5409
5450
  return { success: ok };
5410
5451
  }
@@ -5429,11 +5470,12 @@ async function handleNewChat(h, args) {
5429
5470
  }
5430
5471
  async function handleSwitchChat(h, args) {
5431
5472
  const provider = h.getProvider(args?.agentType);
5473
+ const transport = getTargetTransport(h, provider);
5432
5474
  const managerKey = getCurrentManagerKey(h);
5433
5475
  const sessionId = args?.sessionId || args?.id || args?.chatId;
5434
5476
  if (!sessionId) return { success: false, error: "sessionId required" };
5435
5477
  LOG.info("Command", `[switch_chat] sessionId=${sessionId}, manager=${managerKey}`);
5436
- if (provider?.category === "extension" && h.agentStream && h.getCdp() && h.currentSession?.sessionId) {
5478
+ if (isExtensionTransport(transport) && h.agentStream && h.getCdp() && h.currentSession?.sessionId) {
5437
5479
  const ok = await h.agentStream.switchConversation(h.getCdp(), h.currentSession.sessionId, sessionId);
5438
5480
  return { success: ok, result: ok ? "switched" : "failed" };
5439
5481
  }
@@ -5523,9 +5565,10 @@ async function handleSwitchChat(h, args) {
5523
5565
  }
5524
5566
  async function handleSetMode(h, args) {
5525
5567
  const provider = h.getProvider(args?.agentType);
5568
+ const transport = getTargetTransport(h, provider);
5526
5569
  const mode = args?.mode || "agent";
5527
- if (provider?.category === "acp") {
5528
- const adapter = getTargetedCliAdapter(h, args, provider.type);
5570
+ if (transport === "acp") {
5571
+ const adapter = getTargetedCliAdapter(h, args, provider?.type);
5529
5572
  if (adapter) {
5530
5573
  const acpInstance = adapter._acpInstance;
5531
5574
  if (acpInstance && typeof acpInstance.onEvent === "function") {
@@ -5578,10 +5621,11 @@ async function handleSetMode(h, args) {
5578
5621
  }
5579
5622
  async function handleChangeModel(h, args) {
5580
5623
  const provider = h.getProvider(args?.agentType);
5624
+ const transport = getTargetTransport(h, provider);
5581
5625
  const model = args?.model;
5582
- LOG.info("Command", `[change_model] model=${model} provider=${provider?.type} category=${provider?.category} manager=${getCurrentManagerKey(h)} providerType=${getCurrentProviderType(h)}`);
5583
- if (provider?.category === "acp") {
5584
- const adapter = getTargetedCliAdapter(h, args, provider.type);
5626
+ LOG.info("Command", `[change_model] model=${model} provider=${provider?.type} transport=${transport} manager=${getCurrentManagerKey(h)} providerType=${getCurrentProviderType(h)}`);
5627
+ if (transport === "acp") {
5628
+ const adapter = getTargetedCliAdapter(h, args, provider?.type);
5585
5629
  LOG.info("Command", `[change_model] ACP adapter found: ${!!adapter}, type=${adapter?.cliType}, hasAcpInstance=${!!adapter?._acpInstance}`);
5586
5630
  if (adapter) {
5587
5631
  const acpInstance = adapter._acpInstance;
@@ -5639,15 +5683,16 @@ async function handleSetThoughtLevel(h, args) {
5639
5683
  const value = args?.value;
5640
5684
  if (!configId || !value) return { success: false, error: "configId and value required" };
5641
5685
  const provider = h.getProvider(args?.agentType);
5642
- if (!provider || provider.category !== "acp") {
5686
+ const transport = getTargetTransport(h, provider);
5687
+ if (transport !== "acp") {
5643
5688
  return { success: false, error: "set_thought_level only for ACP providers" };
5644
5689
  }
5645
- const adapter = getTargetedCliAdapter(h, args, provider.type);
5690
+ const adapter = getTargetedCliAdapter(h, args, provider?.type);
5646
5691
  const acpInstance = adapter?._acpInstance;
5647
5692
  if (!acpInstance) return { success: false, error: "ACP instance not found" };
5648
5693
  try {
5649
5694
  await acpInstance.setConfigOption(configId, value);
5650
- LOG.info("Command", `[set_thought_level] ${configId}=${value} for ${provider.type}`);
5695
+ LOG.info("Command", `[set_thought_level] ${configId}=${value} for ${provider?.type || "unknown_acp"}`);
5651
5696
  return { success: true, configId, value };
5652
5697
  } catch (e) {
5653
5698
  return { success: false, error: e?.message };
@@ -5655,11 +5700,12 @@ async function handleSetThoughtLevel(h, args) {
5655
5700
  }
5656
5701
  async function handleResolveAction(h, args) {
5657
5702
  const provider = h.getProvider(args?.agentType);
5703
+ const transport = getTargetTransport(h, provider);
5658
5704
  const action = args?.action || "approve";
5659
5705
  const button = args?.button || args?.buttonText || (action === "approve" ? "Accept" : action === "reject" ? "Reject" : "Accept");
5660
5706
  LOG.info("Command", `[resolveAction] action=${action} button="${button}" provider=${provider?.type}`);
5661
- if (provider?.category === "cli") {
5662
- const adapter = getTargetedCliAdapter(h, args, provider.type);
5707
+ if (transport === "pty") {
5708
+ const adapter = getTargetedCliAdapter(h, args, provider?.type);
5663
5709
  if (!adapter) return { success: false, error: "CLI adapter not running" };
5664
5710
  if (args?.data && typeof adapter.resolveAction === "function") {
5665
5711
  try {
@@ -5700,7 +5746,7 @@ async function handleResolveAction(h, args) {
5700
5746
  LOG.info("Command", `[resolveAction] CLI PTY \u2192 buttonIndex=${buttonIndex} "${buttons[buttonIndex] ?? "?"}"`);
5701
5747
  return { success: true, buttonIndex, button: buttons[buttonIndex] ?? button };
5702
5748
  }
5703
- if (provider?.category === "extension" && h.agentStream && h.getCdp() && h.currentSession?.sessionId) {
5749
+ if (isExtensionTransport(transport) && h.agentStream && h.getCdp() && h.currentSession?.sessionId) {
5704
5750
  const ok = await h.agentStream.resolveSessionAction(h.getCdp(), h.currentSession.sessionId, action);
5705
5751
  return { success: ok };
5706
5752
  }
@@ -10116,7 +10162,6 @@ var DaemonCliManager = class {
10116
10162
  sessionId: cliInstance.instanceId,
10117
10163
  parentSessionId: null,
10118
10164
  providerType: normalizedType,
10119
- providerCategory: "cli",
10120
10165
  transport: "pty",
10121
10166
  adapterKey: key,
10122
10167
  instanceKey: key
@@ -10166,7 +10211,6 @@ ${installInfo}`
10166
10211
  sessionId,
10167
10212
  parentSessionId: null,
10168
10213
  providerType: normalizedType,
10169
- providerCategory: "acp",
10170
10214
  transport: "acp",
10171
10215
  adapterKey: key,
10172
10216
  instanceKey: key
@@ -10678,12 +10722,12 @@ var DaemonAgentStreamManager = class {
10678
10722
  this.logFn(`[AgentStream] Active session (${parentSessionId}): ${sessionId || "none"}`);
10679
10723
  }
10680
10724
  resolveSessionIdForTarget(parentSessionId, agentType) {
10681
- const child = (this.sessionRegistry?.listChildren(parentSessionId) || []).find((entry) => entry.providerCategory === "extension" && entry.providerType === agentType);
10725
+ const child = (this.sessionRegistry?.listChildren(parentSessionId) || []).find((entry) => entry.transport === "cdp-webview" && entry.providerType === agentType);
10682
10726
  return child?.sessionId || null;
10683
10727
  }
10684
10728
  async connectManagedSession(cdp, parentSessionId, runtimeSessionId) {
10685
10729
  const target = this.getSessionTarget(runtimeSessionId);
10686
- if (!target || target.providerCategory !== "extension") return null;
10730
+ if (!target || target.transport !== "cdp-webview") return null;
10687
10731
  const adapter = this.adaptersByType.get(target.providerType);
10688
10732
  if (!adapter) return null;
10689
10733
  const targets = await cdp.discoverAgentWebviews();
@@ -10968,7 +11012,6 @@ var AgentStreamPoller = class {
10968
11012
  sessionId: extInstance.getInstanceId(),
10969
11013
  parentSessionId,
10970
11014
  providerType: extType,
10971
- providerCategory: "extension",
10972
11015
  transport: "cdp-webview",
10973
11016
  cdpManagerKey: ideType,
10974
11017
  instanceKey: `ide:${ideType}`
@@ -11184,7 +11227,6 @@ var ProviderInstanceManager = class {
11184
11227
  providerType,
11185
11228
  instanceId: state.instanceId,
11186
11229
  targetSessionId: state.instanceId,
11187
- providerCategory: state.category,
11188
11230
  workspaceName: state.workspace || void 0,
11189
11231
  ...extra
11190
11232
  });