@adhdev/daemon-standalone 0.9.76-rc.31 → 0.9.76-rc.33

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adhdev/daemon-standalone",
3
- "version": "0.9.76-rc.31",
3
+ "version": "0.9.76-rc.33",
4
4
  "description": "ADHDev standalone daemon — embedded HTTP/WS server for local dashboard",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -34578,6 +34578,96 @@ function normalizeExistingPath(filePath) {
34578
34578
  return null;
34579
34579
  }
34580
34580
  }
34581
+ function readNonEmptyString(value) {
34582
+ return typeof value === "string" && value.trim() ? value.trim() : "";
34583
+ }
34584
+ function formatCompletionMetadata(event) {
34585
+ const parts = [
34586
+ readNonEmptyString(event.targetSessionId) ? `session_id=${readNonEmptyString(event.targetSessionId)}` : "",
34587
+ readNonEmptyString(event.providerType) ? `provider=${readNonEmptyString(event.providerType)}` : "",
34588
+ readNonEmptyString(event.providerSessionId) ? `provider_session_id=${readNonEmptyString(event.providerSessionId)}` : ""
34589
+ ].filter(Boolean);
34590
+ return parts.length > 0 ? ` (${parts.join("; ")})` : "";
34591
+ }
34592
+ function buildMeshSystemMessage(args) {
34593
+ const metadata = formatCompletionMetadata(args.metadataEvent);
34594
+ if (args.event === "agent:generating_completed") {
34595
+ return `[System] ${args.nodeLabel} has completed its task and is now idle${metadata}. You may use mesh_read_chat to review its progress.`;
34596
+ }
34597
+ if (args.event === "agent:waiting_approval") {
34598
+ return `[System] ${args.nodeLabel} is waiting for approval to proceed${metadata}. You may use mesh_read_chat and mesh_approve to handle it.`;
34599
+ }
34600
+ return "";
34601
+ }
34602
+ function injectMeshSystemMessage(components, args) {
34603
+ const coordinatorInstances = components.instanceManager.getByCategory("cli").filter((inst) => {
34604
+ const instState = inst.getState();
34605
+ if (instState.settings?.meshCoordinatorFor !== args.meshId) return false;
34606
+ if (args.sourceInstanceId && instState.instanceId === args.sourceInstanceId) return false;
34607
+ return true;
34608
+ });
34609
+ if (coordinatorInstances.length === 0) return { success: true, forwarded: 0 };
34610
+ const messageText = buildMeshSystemMessage({
34611
+ event: args.event,
34612
+ nodeLabel: args.nodeLabel,
34613
+ metadataEvent: args.metadataEvent
34614
+ });
34615
+ if (!messageText) return { success: false, error: "unsupported mesh event" };
34616
+ for (const coord of coordinatorInstances) {
34617
+ const coordState = coord.getState();
34618
+ LOG.info("MeshEvents", `Forwarding mesh event to coordinator ${coordState.instanceId}`);
34619
+ coord.onEvent("send_message", { input: { text: messageText, textFallback: messageText } });
34620
+ }
34621
+ return { success: true, forwarded: coordinatorInstances.length };
34622
+ }
34623
+ function handleMeshForwardEvent(components, payload) {
34624
+ const eventName = readNonEmptyString(payload.event);
34625
+ if (eventName !== "agent:generating_completed" && eventName !== "agent:waiting_approval") {
34626
+ return { success: false, error: "unsupported mesh event" };
34627
+ }
34628
+ const meshId = readNonEmptyString(payload.meshId);
34629
+ if (!meshId) return { success: false, error: "meshId required" };
34630
+ const nodeId = readNonEmptyString(payload.nodeId);
34631
+ const workspace = readNonEmptyString(payload.workspace);
34632
+ const nodeLabel = nodeId ? `Node '${nodeId}'` : workspace ? `Agent at ${workspace}` : "Remote agent";
34633
+ return injectMeshSystemMessage(components, {
34634
+ meshId,
34635
+ nodeLabel,
34636
+ event: eventName,
34637
+ metadataEvent: {
34638
+ targetSessionId: readNonEmptyString(payload.targetSessionId) || readNonEmptyString(payload.sessionId),
34639
+ providerType: readNonEmptyString(payload.providerType),
34640
+ providerSessionId: readNonEmptyString(payload.providerSessionId)
34641
+ }
34642
+ });
34643
+ }
34644
+ function setupMeshEventForwarding(components) {
34645
+ components.instanceManager.onEvent((event) => {
34646
+ if (event.event !== "agent:generating_completed" && event.event !== "agent:waiting_approval") return;
34647
+ const instanceId = readNonEmptyString(event.instanceId);
34648
+ if (!instanceId) return;
34649
+ const sourceInstance = components.instanceManager.getInstance(instanceId);
34650
+ if (!sourceInstance || sourceInstance.category !== "cli") return;
34651
+ const state = sourceInstance.getState();
34652
+ const workspace = readNonEmptyString(state.workspace);
34653
+ if (!workspace) return;
34654
+ const settings = state.settings && typeof state.settings === "object" ? state.settings : {};
34655
+ const meshIdFromRuntime = readNonEmptyString(settings.meshNodeFor);
34656
+ const mesh = meshIdFromRuntime ? getMesh(meshIdFromRuntime) : getMeshByRepo(workspace);
34657
+ const meshId = meshIdFromRuntime || readNonEmptyString(mesh?.id);
34658
+ if (!meshId) return;
34659
+ const targetNode = mesh?.nodes?.find((n) => n.workspace === workspace);
34660
+ const runtimeNodeId = readNonEmptyString(settings.meshNodeId);
34661
+ const nodeLabel = targetNode ? `Node '${targetNode.id}'` : runtimeNodeId ? `Node '${runtimeNodeId}'` : `Agent at ${workspace}`;
34662
+ injectMeshSystemMessage(components, {
34663
+ meshId,
34664
+ sourceInstanceId: instanceId,
34665
+ nodeLabel,
34666
+ event: event.event,
34667
+ metadataEvent: event
34668
+ });
34669
+ });
34670
+ }
34581
34671
  function buildRecentReadDebugSignature(snapshot) {
34582
34672
  return [
34583
34673
  snapshot.providerType,
@@ -39498,58 +39588,6 @@ function launchIDE(ide, workspacePath) {
39498
39588
  return false;
39499
39589
  }
39500
39590
  }
39501
- function readNonEmptyString(value) {
39502
- return typeof value === "string" && value.trim() ? value.trim() : "";
39503
- }
39504
- function formatCompletionMetadata(event) {
39505
- const parts = [
39506
- readNonEmptyString(event.targetSessionId) ? `session_id=${readNonEmptyString(event.targetSessionId)}` : "",
39507
- readNonEmptyString(event.providerType) ? `provider=${readNonEmptyString(event.providerType)}` : "",
39508
- readNonEmptyString(event.providerSessionId) ? `provider_session_id=${readNonEmptyString(event.providerSessionId)}` : ""
39509
- ].filter(Boolean);
39510
- return parts.length > 0 ? ` (${parts.join("; ")})` : "";
39511
- }
39512
- function setupMeshEventForwarding(components) {
39513
- components.instanceManager.onEvent((event) => {
39514
- if (event.event !== "agent:generating_completed" && event.event !== "agent:waiting_approval") return;
39515
- const instanceId = readNonEmptyString(event.instanceId);
39516
- if (!instanceId) return;
39517
- const sourceInstance = components.instanceManager.getInstance(instanceId);
39518
- if (!sourceInstance || sourceInstance.category !== "cli") return;
39519
- const state = sourceInstance.getState();
39520
- const workspace = readNonEmptyString(state.workspace);
39521
- if (!workspace) return;
39522
- const settings = state.settings && typeof state.settings === "object" ? state.settings : {};
39523
- const meshIdFromRuntime = readNonEmptyString(settings.meshNodeFor);
39524
- const mesh = meshIdFromRuntime ? getMesh(meshIdFromRuntime) : getMeshByRepo(workspace);
39525
- const meshId = meshIdFromRuntime || readNonEmptyString(mesh?.id);
39526
- if (!meshId) return;
39527
- const allInstances = components.instanceManager.getByCategory("cli");
39528
- const coordinatorInstances = allInstances.filter((inst) => {
39529
- const instState = inst.getState();
39530
- if (instState.settings?.meshCoordinatorFor !== meshId) return false;
39531
- if (instState.instanceId === instanceId) return false;
39532
- return true;
39533
- });
39534
- if (coordinatorInstances.length === 0) return;
39535
- const targetNode = mesh?.nodes?.find((n) => n.workspace === workspace);
39536
- const runtimeNodeId = readNonEmptyString(settings.meshNodeId);
39537
- const nodeLabel = targetNode ? `Node '${targetNode.id}'` : runtimeNodeId ? `Node '${runtimeNodeId}'` : `Agent at ${workspace}`;
39538
- const metadata = formatCompletionMetadata(event);
39539
- let messageText = "";
39540
- if (event.event === "agent:generating_completed") {
39541
- messageText = `[System] ${nodeLabel} has completed its task and is now idle${metadata}. You may use mesh_read_chat to review its progress.`;
39542
- } else if (event.event === "agent:waiting_approval") {
39543
- messageText = `[System] ${nodeLabel} is waiting for approval to proceed${metadata}. You may use mesh_read_chat and mesh_approve to handle it.`;
39544
- }
39545
- if (!messageText) return;
39546
- for (const coord of coordinatorInstances) {
39547
- const coordState = coord.getState();
39548
- LOG.info("MeshEvents", `Forwarding event from ${workspace} to coordinator ${coordState.instanceId}`);
39549
- coord.onEvent("send_message", { input: { text: messageText, textFallback: messageText } });
39550
- }
39551
- });
39552
- }
39553
39591
  async function initDaemonComponents(config2) {
39554
39592
  installGlobalInterceptor();
39555
39593
  const appConfig = loadConfig();
@@ -41906,9 +41944,8 @@ ${lastSnapshot}`;
41906
41944
  };
41907
41945
  this.recordTrace("submit_echo_missing", diagnostic);
41908
41946
  if (this.requirePromptEchoBeforeSubmit) {
41909
- const message = `${this.cliName} prompt echo was not observed on the PTY screen before submit`;
41910
- LOG.warn("CLI", `[${this.cliType}] ${message} elapsed=${elapsed}ms maxEchoWaitMs=${state.maxEchoWaitMs} screen=${JSON.stringify(diagnostic.screenText).slice(0, 240)}`);
41911
- completion.rejectOnce(new Error(message));
41947
+ LOG.warn("CLI", `[${this.cliType}] prompt echo was not observed before submit; sending guarded submit key anyway elapsed=${elapsed}ms maxEchoWaitMs=${state.maxEchoWaitMs} screen=${JSON.stringify(diagnostic.screenText).slice(0, 240)}`);
41948
+ this.submitSendKey(state, completion);
41912
41949
  return;
41913
41950
  }
41914
41951
  LOG.warn("CLI", `[${this.cliType}] prompt echo was not observed before submit; sending submit key anyway elapsed=${elapsed}ms maxEchoWaitMs=${state.maxEchoWaitMs}`);
@@ -50625,6 +50662,8 @@ Run 'adhdev doctor' for detailed diagnostics.`
50625
50662
  DEFAULT_ADHDEV_MCP_COMMAND = "adhdev-mcp";
50626
50663
  HERMES_CLI_TYPE = "hermes-cli";
50627
50664
  HERMES_MCP_CONFIG_PATH = "~/.hermes/config.yaml";
50665
+ init_mesh_config();
50666
+ init_logger();
50628
50667
  init_config();
50629
50668
  init_terminal_screen();
50630
50669
  init_logger();
@@ -50806,6 +50845,9 @@ Run 'adhdev doctor' for detailed diagnostics.`
50806
50845
  async executeDaemonCommand(cmd, args) {
50807
50846
  switch (cmd) {
50808
50847
  // ─── CLI / ACP commands ───
50848
+ case "mesh_forward_event": {
50849
+ return handleMeshForwardEvent({ instanceManager: this.deps.instanceManager }, args);
50850
+ }
50809
50851
  case "launch_cli":
50810
50852
  case "stop_cli":
50811
50853
  case "set_cli_view_mode":
@@ -55214,8 +55256,6 @@ data: ${JSON.stringify(msg.data)}
55214
55256
  };
55215
55257
  init_logger();
55216
55258
  init_config();
55217
- init_mesh_config();
55218
- init_logger();
55219
55259
  }
55220
55260
  });
55221
55261
 
@@ -56630,6 +56670,17 @@ function extractGitDiff(value) {
56630
56670
  function extractLaunchPayload(value) {
56631
56671
  return findNestedPayload(value, (payload) => Boolean(payload?.sessionId || payload?.id || payload?.runtimeSessionId));
56632
56672
  }
56673
+ function resolveCoordinatorNode(ctx) {
56674
+ const preferredNodeId = typeof ctx.mesh.coordinator?.preferredNodeId === "string" ? ctx.mesh.coordinator.preferredNodeId.trim() : "";
56675
+ if (preferredNodeId) {
56676
+ const preferred = ctx.mesh.nodes.find((n) => n.id === preferredNodeId && typeof n.daemonId === "string" && n.daemonId.trim());
56677
+ if (preferred) return preferred;
56678
+ }
56679
+ if (ctx.localDaemonId) {
56680
+ return ctx.mesh.nodes.find((n) => n.daemonId === ctx.localDaemonId);
56681
+ }
56682
+ return void 0;
56683
+ }
56633
56684
  function meshSessionCacheKey(nodeId, runtimeSessionId) {
56634
56685
  return `${nodeId}:${runtimeSessionId}`;
56635
56686
  }
@@ -56935,12 +56986,15 @@ async function meshLaunchSession(ctx, args) {
56935
56986
  return JSON.stringify({ success: false, error: `No usable provider detected for node '${args.node_id}' from providerPriority: ${failed.join("; ")}` });
56936
56987
  }
56937
56988
  }
56989
+ const coordinatorNode = resolveCoordinatorNode(ctx);
56938
56990
  const result = await commandForNode(ctx, node, "launch_cli", {
56939
56991
  cliType: resolvedProviderType,
56940
56992
  dir: node.workspace,
56941
56993
  settings: {
56942
56994
  meshNodeFor: ctx.mesh.id,
56943
56995
  meshNodeId: args.node_id,
56996
+ ...coordinatorNode?.daemonId ? { meshCoordinatorDaemonId: coordinatorNode.daemonId } : {},
56997
+ ...coordinatorNode?.id ? { meshCoordinatorNodeId: coordinatorNode.id } : {},
56944
56998
  launchedByCoordinator: true
56945
56999
  }
56946
57000
  });
@@ -57175,7 +57229,16 @@ async function startMcpServer(opts) {
57175
57229
  `);
57176
57230
  process.exit(1);
57177
57231
  }
57178
- const meshCtx = { mesh, transport };
57232
+ let localDaemonId;
57233
+ if (transport instanceof IpcTransport) {
57234
+ try {
57235
+ const statusResult = await transport.getStatus();
57236
+ const instanceId = typeof statusResult?.status?.instanceId === "string" ? statusResult.status.instanceId.trim() : "";
57237
+ if (instanceId) localDaemonId = instanceId;
57238
+ } catch {
57239
+ }
57240
+ }
57241
+ const meshCtx = { mesh, transport, ...localDaemonId ? { localDaemonId } : {} };
57179
57242
  const coordinatorPrompt = await buildMeshModeCoordinatorPrompt(mesh);
57180
57243
  const server2 = new import_server.Server(
57181
57244
  { name: "adhdev-mcp-server", version: "0.9.75" },