@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 +127 -37
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/vendor/mcp-server/index.js +4 -0
- package/vendor/mcp-server/index.js.map +1 -1
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 ? "
|
|
36772
|
-
const commitShort = readInjected(true ? "
|
|
36773
|
-
const version2 = readInjected(true ? "1.0.58-rc.
|
|
36774
|
-
const builtAt = readInjected(true ? "2026-08-
|
|
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
|
-
|
|
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 {
|
|
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
|
}
|