@adhdev/daemon-standalone 0.9.82-rc.330 → 0.9.82-rc.332

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
@@ -29803,7 +29803,10 @@ var require_dist3 = __commonJS({
29803
29803
  requireApprovalForDestructiveGit: true,
29804
29804
  dirtyWorkspaceBehavior: "warn",
29805
29805
  maxParallelTasks: 2,
29806
- spawnedSessionVisibility: "visible",
29806
+ // Coordinator-spawned worker sessions default to hidden so the dashboard is not
29807
+ // flooded with mesh noise tabs/notifications. Users can still surface or unmute
29808
+ // any specific session manually; that override is preserved per-device.
29809
+ spawnedSessionVisibility: "hidden",
29807
29810
  delegatedWorkerAutoApprove: true,
29808
29811
  sessionCleanupOnNodeRemove: "preserve",
29809
29812
  autoFastForward: { enabled: true },
@@ -30033,10 +30036,10 @@ var require_dist3 = __commonJS({
30033
30036
  }
30034
30037
  function getDaemonBuildInfo() {
30035
30038
  if (cached2) return cached2;
30036
- const commit = readInjected(true ? "ae30dde113f601dc80d6396a625c1dafb3dbaddd" : void 0) ?? "unknown";
30037
- const commitShort = readInjected(true ? "ae30dde1" : void 0) ?? (commit !== "unknown" ? commit.slice(0, 7) : "unknown");
30038
- const version2 = readInjected(true ? "0.9.82-rc.330" : void 0) ?? readInjected(typeof process !== "undefined" ? process.env?.ADHDEV_PKG_VERSION : void 0) ?? "unknown";
30039
- const builtAt = readInjected(true ? "2026-06-19T17:21:17.821Z" : void 0);
30039
+ const commit = readInjected(true ? "2466d8b001000d509eb9058a0c51ec6f383741ed" : void 0) ?? "unknown";
30040
+ const commitShort = readInjected(true ? "2466d8b0" : void 0) ?? (commit !== "unknown" ? commit.slice(0, 7) : "unknown");
30041
+ const version2 = readInjected(true ? "0.9.82-rc.332" : void 0) ?? readInjected(typeof process !== "undefined" ? process.env?.ADHDEV_PKG_VERSION : void 0) ?? "unknown";
30042
+ const builtAt = readInjected(true ? "2026-06-20T01:56:22.624Z" : void 0);
30040
30043
  cached2 = builtAt ? { commit, commitShort, version: version2, builtAt } : { commit, commitShort, version: version2 };
30041
30044
  return cached2;
30042
30045
  }
@@ -31672,7 +31675,7 @@ ${error48.message || ""}`;
31672
31675
  policy.sessionCleanupOnNodeRemove = "preserve";
31673
31676
  }
31674
31677
  if (!SPAWNED_SESSION_VISIBILITY_MODES.has(String(policy.spawnedSessionVisibility))) {
31675
- policy.spawnedSessionVisibility = "visible";
31678
+ policy.spawnedSessionVisibility = DEFAULT_MESH_POLICY.spawnedSessionVisibility;
31676
31679
  }
31677
31680
  const normalizedStrategy = normalizeMeshSchedulingStrategy(policy.schedulingStrategy);
31678
31681
  if (normalizedStrategy === "first_eligible") {
@@ -40442,6 +40445,21 @@ Next step: ${nextStep}`;
40442
40445
  targetSessionId: readNonEmptyString2(payload.targetSessionId) || readNonEmptyString2(payload.sessionId) || readNonEmptyString2(payload.instanceId),
40443
40446
  providerType: readNonEmptyString2(payload.providerType),
40444
40447
  providerSessionId: readNonEmptyString2(payload.providerSessionId),
40448
+ // Carry the session identity fields the worker provider event emits so the
40449
+ // coordinator's mirror (updateMeshOwnedSession) gets a real workspace/title/
40450
+ // settings. Without these the remote-relay hop reconstructs metadataEvent with
40451
+ // an empty workspace, and the dashboard flaps to the generic
40452
+ // "Terminal (Mesh Node)" title (and degrades the provider label) between live
40453
+ // events and the periodic get_status_metadata snapshot. The local in-process
40454
+ // forward path (onMeshCoordinatorEventForwarded) already preserves these; this
40455
+ // mirrors them for the remote-only relay path.
40456
+ workspace: readNonEmptyString2(payload.workspace) || readNonEmptyString2(payload.workspaceName),
40457
+ workspaceName: readNonEmptyString2(payload.workspaceName) || readNonEmptyString2(payload.workspace),
40458
+ sessionTitle: readNonEmptyString2(payload.sessionTitle),
40459
+ sessionStatus: readNonEmptyString2(payload.sessionStatus),
40460
+ sessionChatStatus: readNonEmptyString2(payload.sessionChatStatus),
40461
+ providerName: readNonEmptyString2(payload.providerName),
40462
+ ...payload.sessionSettings && typeof payload.sessionSettings === "object" && !Array.isArray(payload.sessionSettings) ? { sessionSettings: payload.sessionSettings } : {},
40445
40463
  finalSummary: readNonEmptyString2(payload.finalSummary) || readNonEmptyString2(payload.summary),
40446
40464
  jobId: readNonEmptyString2(payload.jobId),
40447
40465
  interactionId: readNonEmptyString2(payload.interactionId),
@@ -41344,7 +41362,8 @@ Next step: ${nextStep}`;
41344
41362
  const meshId = readNonEmptyString2(settings.meshCoordinatorFor);
41345
41363
  if (!meshId) continue;
41346
41364
  const status = readNonEmptyString2(state.status).toLowerCase();
41347
- out.push({ meshId, instance: inst, idle: status === "idle" });
41365
+ const modalParked = status === "waiting_choice" || status === "waiting_approval";
41366
+ out.push({ meshId, instance: inst, idle: status === "idle", modalParked });
41348
41367
  }
41349
41368
  return out;
41350
41369
  }
@@ -41433,9 +41452,16 @@ Next step: ${nextStep}`;
41433
41452
  }
41434
41453
  for (const [meshId, meshCoordinators] of byMesh) {
41435
41454
  const idleCoordinators = meshCoordinators.filter((c) => c.idle);
41436
- const generatingCoordinators = meshCoordinators.filter((c) => !c.idle);
41455
+ const generatingCoordinators = meshCoordinators.filter((c) => !c.idle && !c.modalParked);
41456
+ const modalParkedCoordinators = meshCoordinators.filter((c) => !c.idle && c.modalParked);
41437
41457
  const targetCoordinators = idleCoordinators.length > 0 ? idleCoordinators : generatingCoordinators;
41438
41458
  const forceOnly = idleCoordinators.length === 0;
41459
+ if (targetCoordinators.length === 0) {
41460
+ if (modalParkedCoordinators.length > 0) {
41461
+ LOG2.info("MeshReconcile", `Reconcile skip \u2192 modal-parked: holding pending event(s) for mesh ${meshId} (${modalParkedCoordinators.length} coordinator(s) awaiting a modal answer; events left queued)`);
41462
+ }
41463
+ continue;
41464
+ }
41439
41465
  if (store) {
41440
41466
  try {
41441
41467
  if (store.pendingEventCount(meshId) === 0) continue;
@@ -45750,6 +45776,10 @@ ${lastSnapshot}`;
45750
45776
  if (!this.ptyProcess) throw new Error(`${this.cliName} is not running`);
45751
45777
  const content = String(text || "");
45752
45778
  if (!content.trim()) return;
45779
+ if (this.engine.currentStatus === "waiting_approval" || this.engine.hasActionableApproval()) {
45780
+ LOG2.info("CLI", `[${this.cliType}] force-send held \u2014 session parked on approval modal (status=${this.engine.currentStatus})`);
45781
+ return;
45782
+ }
45753
45783
  LOG2.info("CLI", `[${this.cliType}] force-sending prompt while status=${this.engine.currentStatus}`);
45754
45784
  await this.writeToPty(content + this.sendKey);
45755
45785
  this.onStatusChange?.();
@@ -64481,6 +64511,35 @@ ${formatManifestValidationIssues2(validation.issues)}`,
64481
64511
  this.settings = rest;
64482
64512
  this.adapter.updateRuntimeSettings?.(this.settings);
64483
64513
  }
64514
+ /**
64515
+ * The resolved modal-park status of this session, or null when it is not
64516
+ * parked on a modal awaiting a human answer. Mirrors the overlay logic in
64517
+ * getState(): an active AskUserQuestion interactive prompt resolves to
64518
+ * waiting_choice; otherwise the adapter's waiting_approval (tool consent)
64519
+ * counts — UNLESS auto-approve will dismiss it, in which case the session is
64520
+ * effectively generating and is NOT modal-parked. This is the single signal
64521
+ * the mesh force-inject guard consults, and the same status string the
64522
+ * reconcile loop reads off get_status_metadata. Lowercase literals only —
64523
+ * the SessionStatus enum is forked across modules and waiting_choice is
64524
+ * absent from some of them.
64525
+ */
64526
+ resolveModalParkStatus() {
64527
+ if (this.activeInteractivePrompt) return "waiting_choice";
64528
+ let adapterStatus;
64529
+ try {
64530
+ adapterStatus = this.adapter.getStatus({ allowParse: false });
64531
+ } catch {
64532
+ return null;
64533
+ }
64534
+ if (adapterStatus.status === "waiting_approval" && !this.shouldAutoApprove()) {
64535
+ return "waiting_approval";
64536
+ }
64537
+ return null;
64538
+ }
64539
+ /** True when this session is parked on a modal awaiting a human answer. */
64540
+ isModalParked() {
64541
+ return this.resolveModalParkStatus() !== null;
64542
+ }
64484
64543
  onEvent(event, data) {
64485
64544
  if (event === "send_message") {
64486
64545
  const input = normalizeInputEnvelope(data);
@@ -64488,6 +64547,10 @@ ${formatManifestValidationIssues2(validation.issues)}`,
64488
64547
  const promptText = buildCliStructuredInputPrompt(input);
64489
64548
  if (promptText) {
64490
64549
  const force = data?.force === true;
64550
+ if (force && this.isModalParked()) {
64551
+ LOG2.info("CLI", `[${this.type}] force send_message held \u2014 coordinator parked on modal (${this.resolveModalParkStatus()})`);
64552
+ return;
64553
+ }
64491
64554
  void this.adapter.sendMessage(promptText, force ? { force: true } : {}).catch((e) => {
64492
64555
  LOG2.warn("CLI", `[${this.type}] send_message failed: ${e?.message || e}`);
64493
64556
  });
@@ -80779,7 +80842,10 @@ ${ptyResult.output.slice(-2e3)}`);
80779
80842
  title: session.title,
80780
80843
  cdpConnected: session.cdpConnected,
80781
80844
  summaryMetadata: session.summaryMetadata,
80782
- settings: session.settings
80845
+ settings: session.settings,
80846
+ // Forward surfaceHidden so the server can gate push notifications for
80847
+ // coordinator-hidden sessions (the WS path is the only one the server sees).
80848
+ surfaceHidden: session.surfaceHidden
80783
80849
  })),
80784
80850
  p2p: payload.p2p,
80785
80851
  timestamp: now