@adhdev/daemon-standalone 0.9.82-rc.331 → 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
@@ -30036,10 +30036,10 @@ var require_dist3 = __commonJS({
30036
30036
  }
30037
30037
  function getDaemonBuildInfo() {
30038
30038
  if (cached2) return cached2;
30039
- const commit = readInjected(true ? "a6ef3a58ea926c6fa42f5ec53fae14e0bd5cac1b" : void 0) ?? "unknown";
30040
- const commitShort = readInjected(true ? "a6ef3a58" : void 0) ?? (commit !== "unknown" ? commit.slice(0, 7) : "unknown");
30041
- const version2 = readInjected(true ? "0.9.82-rc.331" : void 0) ?? readInjected(typeof process !== "undefined" ? process.env?.ADHDEV_PKG_VERSION : void 0) ?? "unknown";
30042
- const builtAt = readInjected(true ? "2026-06-20T00:34:33.289Z" : 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);
30043
30043
  cached2 = builtAt ? { commit, commitShort, version: version2, builtAt } : { commit, commitShort, version: version2 };
30044
30044
  return cached2;
30045
30045
  }
@@ -40445,6 +40445,21 @@ Next step: ${nextStep}`;
40445
40445
  targetSessionId: readNonEmptyString2(payload.targetSessionId) || readNonEmptyString2(payload.sessionId) || readNonEmptyString2(payload.instanceId),
40446
40446
  providerType: readNonEmptyString2(payload.providerType),
40447
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 } : {},
40448
40463
  finalSummary: readNonEmptyString2(payload.finalSummary) || readNonEmptyString2(payload.summary),
40449
40464
  jobId: readNonEmptyString2(payload.jobId),
40450
40465
  interactionId: readNonEmptyString2(payload.interactionId),
@@ -41347,7 +41362,8 @@ Next step: ${nextStep}`;
41347
41362
  const meshId = readNonEmptyString2(settings.meshCoordinatorFor);
41348
41363
  if (!meshId) continue;
41349
41364
  const status = readNonEmptyString2(state.status).toLowerCase();
41350
- 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 });
41351
41367
  }
41352
41368
  return out;
41353
41369
  }
@@ -41436,9 +41452,16 @@ Next step: ${nextStep}`;
41436
41452
  }
41437
41453
  for (const [meshId, meshCoordinators] of byMesh) {
41438
41454
  const idleCoordinators = meshCoordinators.filter((c) => c.idle);
41439
- 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);
41440
41457
  const targetCoordinators = idleCoordinators.length > 0 ? idleCoordinators : generatingCoordinators;
41441
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
+ }
41442
41465
  if (store) {
41443
41466
  try {
41444
41467
  if (store.pendingEventCount(meshId) === 0) continue;
@@ -45753,6 +45776,10 @@ ${lastSnapshot}`;
45753
45776
  if (!this.ptyProcess) throw new Error(`${this.cliName} is not running`);
45754
45777
  const content = String(text || "");
45755
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
+ }
45756
45783
  LOG2.info("CLI", `[${this.cliType}] force-sending prompt while status=${this.engine.currentStatus}`);
45757
45784
  await this.writeToPty(content + this.sendKey);
45758
45785
  this.onStatusChange?.();
@@ -64484,6 +64511,35 @@ ${formatManifestValidationIssues2(validation.issues)}`,
64484
64511
  this.settings = rest;
64485
64512
  this.adapter.updateRuntimeSettings?.(this.settings);
64486
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
+ }
64487
64543
  onEvent(event, data) {
64488
64544
  if (event === "send_message") {
64489
64545
  const input = normalizeInputEnvelope(data);
@@ -64491,6 +64547,10 @@ ${formatManifestValidationIssues2(validation.issues)}`,
64491
64547
  const promptText = buildCliStructuredInputPrompt(input);
64492
64548
  if (promptText) {
64493
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
+ }
64494
64554
  void this.adapter.sendMessage(promptText, force ? { force: true } : {}).catch((e) => {
64495
64555
  LOG2.warn("CLI", `[${this.type}] send_message failed: ${e?.message || e}`);
64496
64556
  });