@adhdev/daemon-standalone 1.0.58-rc.1 → 1.0.58-rc.2

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
@@ -36768,10 +36768,10 @@ var require_dist3 = __commonJS({
36768
36768
  }
36769
36769
  function getDaemonBuildInfo() {
36770
36770
  if (cached2) return cached2;
36771
- const commit = readInjected(true ? "e38506ee9da3e916fb4e3c99c19b636f20e5a35c" : void 0) ?? "unknown";
36772
- const commitShort = readInjected(true ? "e38506ee" : void 0) ?? (commit !== "unknown" ? commit.slice(0, 7) : "unknown");
36773
- const version2 = readInjected(true ? "1.0.58-rc.1" : void 0) ?? readInjected(typeof process !== "undefined" ? process.env?.ADHDEV_PKG_VERSION : void 0) ?? "unknown";
36774
- const builtAt = readInjected(true ? "2026-08-22T12:35:42.535Z" : void 0);
36771
+ const commit = readInjected(true ? "8e051f2dacc04bd04da37212168709c3ade00877" : void 0) ?? "unknown";
36772
+ const commitShort = readInjected(true ? "8e051f2d" : void 0) ?? (commit !== "unknown" ? commit.slice(0, 7) : "unknown");
36773
+ const version2 = readInjected(true ? "1.0.58-rc.2" : void 0) ?? readInjected(typeof process !== "undefined" ? process.env?.ADHDEV_PKG_VERSION : void 0) ?? "unknown";
36774
+ const builtAt = readInjected(true ? "2026-08-22T14:13:56.874Z" : void 0);
36775
36775
  cached2 = builtAt ? { commit, commitShort, version: version2, builtAt } : { commit, commitShort, version: version2 };
36776
36776
  return cached2;
36777
36777
  }
@@ -44084,6 +44084,7 @@ ${error48.message || ""}`;
44084
44084
  __export2(mesh_config_exports, {
44085
44085
  addNode: () => addNode,
44086
44086
  applyMeshHostJoinRequest: () => applyMeshHostJoinRequest,
44087
+ collectIgnoredMagiSlotFields: () => collectIgnoredMagiSlotFields,
44087
44088
  configureMeshHostPairing: () => configureMeshHostPairing,
44088
44089
  createMesh: () => createMesh,
44089
44090
  createMeshHostPairingToken: () => createMeshHostPairingToken,
@@ -44680,6 +44681,22 @@ ${error48.message || ""}`;
44680
44681
  }
44681
44682
  return s2;
44682
44683
  }
44684
+ function collectIgnoredMagiSlotFields(slots) {
44685
+ if (!Array.isArray(slots)) return [];
44686
+ const out = [];
44687
+ slots.forEach((entry, idx) => {
44688
+ if (!entry || typeof entry !== "object" || Array.isArray(entry)) return;
44689
+ for (const key2 of Object.keys(entry)) {
44690
+ if (MAGI_SLOT_KNOWN_KEYS.includes(key2)) continue;
44691
+ out.push({
44692
+ slot: idx,
44693
+ field: key2,
44694
+ reason: MAGI_SLOT_IGNORED_FIELD_REASONS[key2] ?? `not a recognized MAGI slot key (accepted: ${MAGI_SLOT_KNOWN_KEYS.join(", ")}); it was dropped and has no effect.`
44695
+ });
44696
+ }
44697
+ });
44698
+ return out;
44699
+ }
44683
44700
  function normalizeMagiSlots(slots, knownNodeIds) {
44684
44701
  const allowed = knownNodeIds ? new Set(knownNodeIds) : void 0;
44685
44702
  if (!Array.isArray(slots) || slots.length === 0) {
@@ -44862,6 +44879,8 @@ ${error48.message || ""}`;
44862
44879
  var mergeMeshPolicy;
44863
44880
  var MAGI_KIND_PANEL_KINDS;
44864
44881
  var MAX_MAGI_KIND_SLOTS;
44882
+ var MAGI_SLOT_KNOWN_KEYS;
44883
+ var MAGI_SLOT_IGNORED_FIELD_REASONS;
44865
44884
  var QUOTA_ROUTING_PERCENT_FIELDS;
44866
44885
  var QUOTA_ROUTING_NONNEGATIVE_FIELDS;
44867
44886
  var init_mesh_config = __esm2({
@@ -44878,6 +44897,13 @@ ${error48.message || ""}`;
44878
44897
  mergeMeshPolicy = mergeAndNormalizePolicy;
44879
44898
  MAGI_KIND_PANEL_KINDS = ["claim_audit", "rca", "design", "freeform"];
44880
44899
  MAX_MAGI_KIND_SLOTS = 24;
44900
+ MAGI_SLOT_KNOWN_KEYS = ["provider", "nodeId", "model", "capabilityTags", "n"];
44901
+ MAGI_SLOT_IGNORED_FIELD_REASONS = Object.freeze({
44902
+ thinkingLevel: "not part of a MAGI slot \u2014 a panel selects WHO answers independently, not how hard each replica thinks. Set thinkingLevel on the node's capability slots (mesh_node_slots_set), which is the routing axis.",
44903
+ difficulty: "not part of a MAGI slot \u2014 MAGI always enqueues its replicas with the fixed 'freeform' difficulty sentinel because the panel has already chosen the (node, provider) target. Set difficulty on the node's capability slots instead.",
44904
+ maxParallel: "not part of a MAGI slot \u2014 per-slot concurrency is a node capability-slot axis. Use the per-slot `n` replica count to control MAGI fan-out width.",
44905
+ capability: "not a MAGI slot key \u2014 did you mean `capabilityTags`?"
44906
+ });
44881
44907
  QUOTA_ROUTING_PERCENT_FIELDS = /* @__PURE__ */ new Set(["sessionMinRemainingPercent", "weeklyMinRemainingPercent"]);
44882
44908
  QUOTA_ROUTING_NONNEGATIVE_FIELDS = /* @__PURE__ */ new Set(["staleAfterMs", "sessionResetImminentMs", "spreadBonusMax"]);
44883
44909
  }
@@ -48569,6 +48595,36 @@ ${blocks.join("\n\n")}`;
48569
48595
  divergenceLogOnce = /* @__PURE__ */ new Set();
48570
48596
  }
48571
48597
  });
48598
+ function s(v) {
48599
+ return typeof v === "string" && v.trim() ? v.trim() : "";
48600
+ }
48601
+ function meshEventTraceKey(ctx) {
48602
+ const segs = [`task=${s(ctx.taskId) || "-"}`];
48603
+ const eventId = s(ctx.eventId);
48604
+ if (eventId) segs.push(`evt=${eventId}`);
48605
+ segs.push(`sess=${s(ctx.sessionId) || "-"}`);
48606
+ const nodeId = s(ctx.nodeId);
48607
+ if (nodeId) segs.push(`node=${nodeId}`);
48608
+ const meshId = s(ctx.meshId);
48609
+ if (meshId) segs.push(`mesh=${meshId}`);
48610
+ const event = s(ctx.event);
48611
+ if (event) segs.push(`event=${event}`);
48612
+ return segs.join(" ");
48613
+ }
48614
+ function traceMeshEventStage(stage, ctx, detail) {
48615
+ LOG2.info(CAT, `[stage:${stage}] ${meshEventTraceKey(ctx)}${detail ? ` \u2014 ${detail}` : ""}`);
48616
+ }
48617
+ function traceMeshEventDrop(reason, ctx, detail) {
48618
+ LOG2.warn(CAT, `[drop:${reason}] ${meshEventTraceKey(ctx)}${detail ? ` \u2014 ${detail}` : ""}`);
48619
+ }
48620
+ var CAT;
48621
+ var init_mesh_event_trace = __esm2({
48622
+ "src/mesh/mesh-event-trace.ts"() {
48623
+ "use strict";
48624
+ init_logger();
48625
+ CAT = "EvtTrace";
48626
+ }
48627
+ });
48572
48628
  function isSupportedMeshProtocolVersion(value) {
48573
48629
  return typeof value === "string" && SUPPORTED_MESH_PROTOCOL_VERSIONS.includes(value);
48574
48630
  }
@@ -49039,13 +49095,55 @@ ${blocks.join("\n\n")}`;
49039
49095
  }
49040
49096
  return backfilled.reverse();
49041
49097
  }
49098
+ function readPendingEventTaskId(event) {
49099
+ const metadataEvent = readRecord2(event.metadataEvent);
49100
+ return readNonEmptyString(metadataEvent?.taskId);
49101
+ }
49102
+ function dropStaleTerminalTaskEvents(meshId, events) {
49103
+ if (!events.some((event) => STALE_TASK_DROPPABLE_EVENTS.has(event.event))) return events;
49104
+ let store;
49105
+ try {
49106
+ store = MeshRuntimeStore.getInstance();
49107
+ } catch {
49108
+ return events;
49109
+ }
49110
+ const terminalByTaskId = /* @__PURE__ */ new Map();
49111
+ const isTaskTerminal = (taskId) => {
49112
+ const cached5 = terminalByTaskId.get(taskId);
49113
+ if (cached5 !== void 0) return cached5;
49114
+ let terminal = false;
49115
+ try {
49116
+ const entry = store.findQueueEntryById(meshId, taskId);
49117
+ terminal = !!entry && STALE_TASK_TERMINAL_STATUSES.has(entry.status);
49118
+ } catch {
49119
+ terminal = false;
49120
+ }
49121
+ terminalByTaskId.set(taskId, terminal);
49122
+ return terminal;
49123
+ };
49124
+ return events.filter((event) => {
49125
+ if (!STALE_TASK_DROPPABLE_EVENTS.has(event.event)) return true;
49126
+ const taskId = readPendingEventTaskId(event);
49127
+ if (!taskId) return true;
49128
+ if (!isTaskTerminal(taskId)) return true;
49129
+ traceMeshEventDrop("stale_task_terminal", {
49130
+ taskId,
49131
+ sessionId: resolveEventSessionId(event.metadataEvent) ?? event.targetCoordinatorSessionId,
49132
+ nodeId: event.nodeId,
49133
+ meshId,
49134
+ event: event.event
49135
+ }, "task row is already terminal (completed/failed/cancelled) \u2014 non-terminal alert is stale");
49136
+ return false;
49137
+ });
49138
+ }
49042
49139
  function reconcilePendingMeshCoordinatorEvents(meshId, events) {
49043
49140
  const backfilled = refineTerminalEventFromLedger(meshId, events);
49044
49141
  const terminalJobIds = new Set(
49045
49142
  [...events.filter((event) => REFINE_TERMINAL_EVENTS.has(event.event)), ...backfilled].map((event) => readRefineJobId2(event)).filter(Boolean)
49046
49143
  );
49047
49144
  const reconciled = terminalJobIds.size === 0 ? events : events.filter((event) => !(event.event === "refine:accepted" && terminalJobIds.has(readRefineJobId2(event))));
49048
- return backfilled.length === 0 ? reconciled : [...reconciled, ...backfilled];
49145
+ const fresh = dropStaleTerminalTaskEvents(meshId, reconciled);
49146
+ return backfilled.length === 0 ? fresh : [...fresh, ...backfilled];
49049
49147
  }
49050
49148
  function getPendingRetentionCounters() {
49051
49149
  return { ...pendingRetentionCounters };
@@ -49430,6 +49528,8 @@ ${blocks.join("\n\n")}`;
49430
49528
  var TERMINAL_COMPLETION_EVENTS;
49431
49529
  var COORDINATOR_ALERT_EVENTS_WITH_REASON_FINGERPRINT;
49432
49530
  var TERMINAL_COMPLETION_DEDUP_TTL_MS;
49531
+ var STALE_TASK_DROPPABLE_EVENTS;
49532
+ var STALE_TASK_TERMINAL_STATUSES;
49433
49533
  var PENDING_EVENTS_DRAINED_RETENTION_MS;
49434
49534
  var PENDING_EVENTS_UNDRAINED_RETENTION_MS;
49435
49535
  var PENDING_RETENTION_EXPIRED_HOLD_REASON;
@@ -49444,6 +49544,7 @@ ${blocks.join("\n\n")}`;
49444
49544
  init_mesh_runtime_store();
49445
49545
  init_mesh_turn_presentation();
49446
49546
  init_mesh_events_utils();
49547
+ init_mesh_event_trace();
49447
49548
  init_dist();
49448
49549
  init_contracts();
49449
49550
  REFINE_TERMINAL_EVENTS = /* @__PURE__ */ new Set(["refine:completed", "refine:failed"]);
@@ -49484,6 +49585,15 @@ ${blocks.join("\n\n")}`;
49484
49585
  "mesh:dispatch_blocked"
49485
49586
  ]);
49486
49587
  TERMINAL_COMPLETION_DEDUP_TTL_MS = 60 * 60 * 1e3;
49588
+ STALE_TASK_DROPPABLE_EVENTS = /* @__PURE__ */ new Set([
49589
+ // Actionable dispatch-skip page ("this task will NOT dispatch on its own"). Meaningless
49590
+ // once the task is terminal — the measured 081317f3 case.
49591
+ "mesh:dispatch_blocked",
49592
+ // Stall watchdog ("no progress observed"). A terminal task cannot make progress; the
49593
+ // alert only invites the coordinator to re-drive already-finished work.
49594
+ "monitor:no_progress"
49595
+ ]);
49596
+ STALE_TASK_TERMINAL_STATUSES = /* @__PURE__ */ new Set(["completed", "failed", "cancelled"]);
49487
49597
  PENDING_EVENTS_DRAINED_RETENTION_MS = 7 * 24 * 60 * 60 * 1e3;
49488
49598
  PENDING_EVENTS_UNDRAINED_RETENTION_MS = 30 * 24 * 60 * 60 * 1e3;
49489
49599
  PENDING_RETENTION_EXPIRED_HOLD_REASON = "pending_retention_expired";
@@ -49504,36 +49614,6 @@ ${blocks.join("\n\n")}`;
49504
49614
  };
49505
49615
  }
49506
49616
  });
49507
- function s(v) {
49508
- return typeof v === "string" && v.trim() ? v.trim() : "";
49509
- }
49510
- function meshEventTraceKey(ctx) {
49511
- const segs = [`task=${s(ctx.taskId) || "-"}`];
49512
- const eventId = s(ctx.eventId);
49513
- if (eventId) segs.push(`evt=${eventId}`);
49514
- segs.push(`sess=${s(ctx.sessionId) || "-"}`);
49515
- const nodeId = s(ctx.nodeId);
49516
- if (nodeId) segs.push(`node=${nodeId}`);
49517
- const meshId = s(ctx.meshId);
49518
- if (meshId) segs.push(`mesh=${meshId}`);
49519
- const event = s(ctx.event);
49520
- if (event) segs.push(`event=${event}`);
49521
- return segs.join(" ");
49522
- }
49523
- function traceMeshEventStage(stage, ctx, detail) {
49524
- LOG2.info(CAT, `[stage:${stage}] ${meshEventTraceKey(ctx)}${detail ? ` \u2014 ${detail}` : ""}`);
49525
- }
49526
- function traceMeshEventDrop(reason, ctx, detail) {
49527
- LOG2.warn(CAT, `[drop:${reason}] ${meshEventTraceKey(ctx)}${detail ? ` \u2014 ${detail}` : ""}`);
49528
- }
49529
- var CAT;
49530
- var init_mesh_event_trace = __esm2({
49531
- "src/mesh/mesh-event-trace.ts"() {
49532
- "use strict";
49533
- init_logger();
49534
- CAT = "EvtTrace";
49535
- }
49536
- });
49537
49617
  function taskIsParked(task) {
49538
49618
  return !!readNonEmptyString(task?.parked?.reason);
49539
49619
  }
@@ -58370,6 +58450,7 @@ ${rules.join("\n")}`;
58370
58450
  - **Classify task difficulty honestly.** Judge each task's real difficulty (\`easy\`/\`medium\`/\`difficult\`/\`freeform\`) per the Task difficulty section above \u2014 it is a routing hint, and the matched slot's own model/thinking is what launches. Never bend difficulty to chase a model; retune slots instead (\`mesh_node_slots_set\`).
58371
58451
  - **Retune node profiles when routing is a poor fit \u2014 but only with approval.** A node's capability slots (its provider/model/thinking + difficulty range + capability tags, seen via \`mesh_node_slots_list\`) are what task\u2192node fitness routing matches against. If you notice a persistent mismatch \u2014 e.g. every \`difficult\` task lands on a node whose only slot is a cheap model, or a capability a node clearly has isn't declared \u2014 you MAY propose a slot change with \`mesh_node_slots_set\` (write=false). That returns current-vs-proposed; present that diff to the user with a one-line reason and apply (write=true) ONLY after they approve. It is a WHOLESALE replacement of the node's slots, so include the slots you want to keep. Never rewrite a node's profile silently or without a clear routing reason.
58372
58452
  - **Bootstrap a node's slots from what's actually installed.** When a node has NO slots configured (routing then falls back to "first available provider"), or CLI agents were newly installed on it, call \`mesh_node_slots_propose({ node_id })\` instead of hand-writing a profile. It detects the node's installed CLI agents and drafts a slot list from them \u2014 read-only, it never writes. Present its \`proposedSlots\` with the \`droppedSlots\` / \`destructive\` fields it reports (a wholesale write would delete any existing hand-tuned slot the draft doesn't reproduce, including providers not currently on PATH), then apply with \`mesh_node_slots_set({ slots: proposedSlots, write: true })\` after approval. It flags \`unknownProvider\` / \`provisional\` slots whose placement is a conservative guess rather than an attested one \u2014 call those out rather than presenting them as settled.
58453
+ - **When a MAGI panel is unconfigured, bootstrap it from the same detection.** \`mesh_magi_review({ task_kind })\` resolves its panel SOLELY from the configured kind-panel binding, so a task_kind with no slots fails outright with \`magi_kind_not_configured\` \u2014 MAGI is simply unavailable until someone binds it, and the usual reason nobody has is that this path is easy to miss. Pass \`mesh_node_slots_propose({ node_id, include_magi: true })\` to also get a \`magiPanel\` draft: one slot per DISTINCT detected provider, with no model pinned, because a panel's value is cross-provider independence rather than picking the best provider. It is read-only like the rest of the tool. Apply it per kind with \`mesh_magi_kind_panel_set({ task_kind, slots, write: true })\` after approval \u2014 and note that write is a WHOLESALE replacement of that kind's binding, so present the dry-run's \`currentSlots\` first. Do NOT reach for \`include_magi\` on every slot proposal; it is for when the panels are actually empty or a newly installed provider should join them.
58373
58454
  - **Respect explicit provider requests.** Map: Hermes \u2192 \`hermes-cli\`, Claude/Claude Code \u2192 \`claude-cli\`, Codex \u2192 \`codex-cli\`, Gemini \u2192 \`gemini-cli\`, Antigravity \u2192 \`antigravity-cli\`. Never substitute the coordinator's own runtime.
58374
58455
  - **Verify via git, not source.** Use \`mesh_git_status\` to confirm side effects. Treat agent summaries as self-reports, not verification.
58375
58456
  - **Match concurrency to task kind.** Independent read-only tasks (\`live_debug_readonly\`) dispatch all at once up to the read-only cap \u2014 no worktree, no free node needed. Each write task needs its OWN branch workspace (Workflow 3.b0); spreading writes across base nodes is NOT a substitute: a mesh with four base nodes still has zero branch isolation. Ramp up cautiously only when tasks share a base branch or submodule pointer (landing order matters). Never launch a second session onto in-flight work for the same issue, even when \`mesh_read_chat\` shows no final message yet \u2014 successive stages of one investigation stay in their session (see Workflow 3f).
@@ -58530,6 +58611,7 @@ Before doing any coordinator work, confirm that the actual callable tool list in
58530
58611
  e. For a continuation of the same issue in an existing session, send a concise **delta instruction**: current verified state, the exact failed/blocked step, the newly approved action, and final reporting requirements. Do not resend the full original task or open a new chat solely to continue the same work; that wastes coordinator and worker context.
58531
58612
  f. **Let the investigator apply the fix when the findings settle it \u2014 otherwise split deliberately.** An investigator that has read the source and named the file:line and the fix already holds context a fresh worker must rebuild from scratch, and you would have to restate its findings in the new task message to get there. Task mode is **per task, not per session**: the read-only guardrail is evaluated on each dispatch from that task's own \`readonly\`/\`task_mode\`, so you hand off by sending a follow-up \`mesh_send_task\` to the SAME session WITHOUT the read-only flag (use \`task_mode: "code_change"\`). You do not need a new session or a fresh worktree for the mode to change. **Hand off in-session when** the findings match your hypothesis, the fix stays inside the files just investigated, and no user decision is pending. **Split to a separate task when** the investigation needs a user decision (it surfaced design options, or a cost/risk tradeoff), when it OVERTURNED your hypothesis so the direction itself needs rethinking, or when the fix touches files another in-flight worker owns. **Never convert an investigation whose own conclusion was "do not change this"** \u2014 a correct no-op finding is a completed task, and pushing it into a fix produces an unverified change nobody asked for. Dispatching the investigation as an ordinary report-first task skips the handoff, but drops the guardrail against premature fixes \u2014 keep \`live_debug_readonly\` whenever the point is to find out whether anything is wrong at all.
58532
58613
  4. **Monitor** \u2014 Prefer event-driven completion/status notifications. Do **not** poll \`mesh_read_chat\` repeatedly. Do **not** repeatedly call \`mesh_status\` or \`mesh_view_queue\` just to wait for assigned/generating work. After dispatching a direct or queued task, send one progress update with the task/session handle, then stop. Wait for \`pendingCoordinatorEvents\` or another completion/approval/status signal, an explicit user status request, or a real timeout/stall signal before reading status/chat/queue again. Use at most one compact \`mesh_read_chat\` check after a terminal signal. Handle approvals via \`mesh_approve\`. **Proactively parallelize new work.** When the user reports a new bug or asks for new work, start it immediately if it is independent of in-flight tasks and there is headroom under \`maxParallelTasks\` \u2014 do not wait for a current task to finish or for the user to prompt you to parallelize. Read-only diagnosis (\`live_debug_readonly\`) has no isolation or merge cost, so dispatch it in parallel right away. The no-polling / concurrency-limit rules constrain *re-checking or duplicating already-dispatched work*; they are **not** a reason to defer starting a new, independent task.
58614
+ - **Arrival order is not occurrence order \u2014 identify every notification by its \`taskId\`/\`sessionId\`.** While you are generating, worker notifications are held in the queue and injected together on the tick after you go idle. This is intended (a raw write into a generating session is not consumed as a turn), and the delay is normally well under a minute \u2014 measured median ~1 minute, worst case ~10 minutes. The consequence is that a notification arriving now is **not necessarily about the task you most recently dispatched**. Never infer a notification's subject from timing or from what you just sent: read the \`taskId\`/\`sessionId\` in the notification itself and match it to your own record of what you dispatched. Also note that your own coordinator session id appears in these traces, so a session id in a notification is not automatically a worker's. If a notification refers to a task you have already cancelled or completed, treat it as stale \u2014 do not act on it, and say so rather than silently reinterpreting it as being about current work.
58533
58615
  5. **Verify** \u2014 When a task reports completion or git work is visible, call \`mesh_git_status\` to verify changes were made.
58534
58616
  6. **Checkpoint** \u2014 Call \`mesh_checkpoint\` to save the work.
58535
58617
  7. **Converge branches** \u2014 Before marking any task complete, classify every touched node/branch into exactly one final state: \`merged_to_main\`, \`pushed_feature_branch_needs_merge\`, \`blocked_review\`, \`cleanup_candidate\`, or \`not_mergeable\`. Use \`mesh_status\` branchConvergenceSummary. For obvious clean branch catch-up (ahead 0, behind > 0, upstream fresh, no dirty/stash/submodule issues), use \`mesh_fast_forward_node\` dry-run first and execute only when explicitly safe/approved; this avoids consuming an agent session. Use \`mesh_refine_node\` for clean worktree branches when safe \u2014 but when 2+ sibling worktrees share a base, converge them with \`mesh_refine_batch\` rather than repeated single-node calls (see the sequencing rule in Rules). Before/refine merging root commits that contain submodule gitlink changes, require each submodule commit to be reachable from the configured submodule remote main branch, not merely present on a feature ref or local checkout. If \`mesh_refine_node\` returns \`submodule_reachability_failed\` or publish-required evidence, keep the public convergence bucket as \`blocked_review\`; unless \`allowAutoPublishSubmoduleMainCommits\` is explicitly enabled and Refinery reports successful non-force publish plus post-publish verification, ask the user for explicit approval to push/publish the unreachable submodule commit(s) to submodule main, then rerun \`mesh_refine_node\`. Do not merge the root branch until the submodule commit(s) are reachable from submodule origin/main. A task that remains on a non-main branch is not fully complete unless the final report names the follow-up state and next step.
@@ -85561,6 +85643,7 @@ ${e?.stderr || ""}`;
85561
85643
  clearDebugTrace: () => clearDebugTrace,
85562
85644
  clearPendingMeshCoordinatorEvents: () => clearPendingMeshCoordinatorEvents,
85563
85645
  codexSessionsDir: () => codexSessionsDir,
85646
+ collectIgnoredMagiSlotFields: () => collectIgnoredMagiSlotFields,
85564
85647
  collectPendingApprovals: () => collectPendingApprovals,
85565
85648
  collectSyncTargetTypes: () => collectSyncTargetTypes,
85566
85649
  commitMeshGraphPlan: () => commitMeshGraphPlan,
@@ -120702,10 +120785,17 @@ ${formatManifestValidationIssues2(validation2.issues)}`);
120702
120785
  if (!kind) return { success: false, error: "invalid_magi_kind_panel: task_kind is required" };
120703
120786
  const requestedMeshId = typeof args?.meshId === "string" ? args.meshId.trim() : "";
120704
120787
  try {
120705
- const { setMagiKindPanel: setMagiKindPanel2, resolveScopedMeshId: resolveScopedMeshId2 } = await Promise.resolve().then(() => (init_mesh_config(), mesh_config_exports));
120788
+ const { setMagiKindPanel: setMagiKindPanel2, resolveScopedMeshId: resolveScopedMeshId2, collectIgnoredMagiSlotFields: collectIgnoredMagiSlotFields2 } = await Promise.resolve().then(() => (init_mesh_config(), mesh_config_exports));
120789
+ const ignoredFields = collectIgnoredMagiSlotFields2(args?.slots);
120706
120790
  const slots = setMagiKindPanel2(kind, args?.slots, requestedMeshId || void 0);
120707
120791
  const meshId = requestedMeshId || resolveScopedMeshId2();
120708
- return { success: true, kind, slots, meshId: meshId ?? null };
120792
+ return {
120793
+ success: true,
120794
+ kind,
120795
+ slots,
120796
+ meshId: meshId ?? null,
120797
+ ...ignoredFields.length ? { ignoredFields } : {}
120798
+ };
120709
120799
  } catch (e) {
120710
120800
  return { success: false, error: e.message };
120711
120801
  }