@adhdev/daemon-core 0.9.82-rc.82 → 0.9.82-rc.83
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 +145 -13
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +145 -13
- package/dist/index.mjs.map +1 -1
- package/dist/mesh/refine-config.d.ts +12 -0
- package/dist/repo-mesh-types.d.ts +7 -0
- package/package.json +1 -1
- package/src/commands/chat-commands.ts +13 -1
- package/src/commands/cli-manager.ts +25 -0
- package/src/commands/router.ts +107 -7
- package/src/config/mesh-config.ts +1 -0
- package/src/mesh/coordinator-prompt.ts +5 -2
- package/src/mesh/mesh-events.ts +2 -1
- package/src/mesh/refine-config.ts +15 -0
- package/src/repo-mesh-types.ts +8 -0
package/dist/index.js
CHANGED
|
@@ -39,6 +39,7 @@ var init_repo_mesh_types = __esm({
|
|
|
39
39
|
requirePreTaskCheckpoint: false,
|
|
40
40
|
requirePostTaskCheckpoint: true,
|
|
41
41
|
requireApprovalForPush: true,
|
|
42
|
+
allowAutoPublishSubmoduleMainCommits: false,
|
|
42
43
|
requireApprovalForDestructiveGit: true,
|
|
43
44
|
dirtyWorkspaceBehavior: "warn",
|
|
44
45
|
maxParallelTasks: 2,
|
|
@@ -789,6 +790,7 @@ function mergeMeshPolicy(base, patch) {
|
|
|
789
790
|
}
|
|
790
791
|
const maxParallelTasks = Number(policy.maxParallelTasks);
|
|
791
792
|
policy.maxParallelTasks = Number.isFinite(maxParallelTasks) ? Math.max(1, Math.min(8, Math.floor(maxParallelTasks))) : 2;
|
|
793
|
+
policy.allowAutoPublishSubmoduleMainCommits = policy.allowAutoPublishSubmoduleMainCommits === true;
|
|
792
794
|
if (!SESSION_CLEANUP_MODES.has(String(policy.sessionCleanupOnNodeRemove))) {
|
|
793
795
|
policy.sessionCleanupOnNodeRemove = "preserve";
|
|
794
796
|
}
|
|
@@ -1178,6 +1180,9 @@ function buildPolicySection(policy) {
|
|
|
1178
1180
|
if (policy.requirePreTaskCheckpoint) rules.push("- Create a git checkpoint **before** starting each task");
|
|
1179
1181
|
if (policy.requirePostTaskCheckpoint) rules.push("- Create a git checkpoint **after** each task completes");
|
|
1180
1182
|
if (policy.requireApprovalForPush) rules.push("- **Ask for user approval** before pushing to remote");
|
|
1183
|
+
if (policy.allowAutoPublishSubmoduleMainCommits) {
|
|
1184
|
+
rules.push("- Refinery may auto-publish unreachable submodule gitlink commits to submodule origin/main with non-force pushes after validation and patch-equivalence pass");
|
|
1185
|
+
}
|
|
1181
1186
|
if (policy.requireApprovalForDestructiveGit) rules.push("- **Ask for user approval** before destructive git operations (force push, reset, etc.)");
|
|
1182
1187
|
const dirtyBehavior = {
|
|
1183
1188
|
block: "- **Do not** send tasks to nodes with dirty workspaces",
|
|
@@ -1209,7 +1214,7 @@ function buildRulesSection(coordinatorCliType) {
|
|
|
1209
1214
|
- **Clean up worktree nodes.** After a worktree task completes and its changes are merged or checkpointed, call \`mesh_remove_node\` to free resources.
|
|
1210
1215
|
- **Do not strand completed branches.** A checkpointed or clean feature/worktree branch is not done by itself. Merge/refine it to the mesh default branch, fast-forward obvious clean behind-only branches with \`mesh_fast_forward_node\`, or explicitly report one of \`pushed_feature_branch_needs_merge\`, \`blocked_review\`, \`cleanup_candidate\`, or \`not_mergeable\` with the next action.
|
|
1211
1216
|
- **Keep Refinery validation project-configurable.** \`mesh_refine_node\` must execute validation from repo mesh/refine config (for example \`.adhdev/refine.{json,yaml,yml}\`, \`.adhdev/repo-mesh-refine.*\`, or \`repo-mesh.refine.*\`). Heuristics are suggestions/scaffolding only, not the execution path.
|
|
1212
|
-
- **Treat submodule main reachability as publish-needed.** A \`submodule_reachability_failed\` refine result means the root gitlink points at a submodule commit that is not reachable from the configured submodule remote main branch. Do not treat feature-branch reachability as complete, retry validation blindly, or start code review first. Classify it as \`blocked_review\`, request user approval to push/publish the submodule commit to submodule main, then rerun \`mesh_refine_node
|
|
1217
|
+
- **Treat submodule main reachability as publish-needed.** A \`submodule_reachability_failed\` refine result means the root gitlink points at a submodule commit that is not reachable from the configured submodule remote main branch. Do not treat feature-branch reachability as complete, retry validation blindly, or start code review first. Classify it as \`blocked_review\`, request user approval to push/publish the submodule commit to submodule main, then rerun \`mesh_refine_node\`, unless the mesh or repo refine config explicitly enabled \`allowAutoPublishSubmoduleMainCommits\` and Refinery reports exact path/commit/remote/branch evidence with post-publish verification.
|
|
1213
1218
|
- **Name worktree branches meaningfully.** Use descriptive names like \`feat/auth-refactor\` or \`fix/build-123\`.${coordinatorNote}`;
|
|
1214
1219
|
}
|
|
1215
1220
|
var TOOLS_SECTION, TOOL_EXPOSURE_PREFLIGHT_SECTION, WORKFLOW_SECTION;
|
|
@@ -1256,7 +1261,7 @@ Before doing any coordinator work, confirm that the actual callable tool list in
|
|
|
1256
1261
|
4. **Monitor** \u2014 Prefer event-driven completion/status notifications. Do **not** poll \`mesh_read_chat\` repeatedly. Use \`mesh_view_queue\` to see the status of all pending, assigned, completed, and failed tasks. Do not call \`mesh_read_chat\` again within a few seconds for the same generating session. Use at most one compact \`mesh_read_chat\` check after a completion/approval signal. Handle approvals via \`mesh_approve\`.
|
|
1257
1262
|
5. **Verify** \u2014 When a task reports completion or git work is visible, call \`mesh_git_status\` to verify changes were made.
|
|
1258
1263
|
6. **Checkpoint** \u2014 Call \`mesh_checkpoint\` to save the work.
|
|
1259
|
-
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. 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
|
|
1264
|
+
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. 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.
|
|
1260
1265
|
8. **Clean up** \u2014 Remove worktree nodes via \`mesh_remove_node\` after their work is merged or no longer needed.
|
|
1261
1266
|
9. **Report** \u2014 Summarize what was done, what changed, any issues, and the branch convergence state.
|
|
1262
1267
|
|
|
@@ -3206,7 +3211,8 @@ function injectMeshSystemMessage(components, args) {
|
|
|
3206
3211
|
const providerSessionId = readNonEmptyString2(args.metadataEvent.providerSessionId) || void 0;
|
|
3207
3212
|
const finalSummary = readNonEmptyString2(args.metadataEvent.finalSummary) || void 0;
|
|
3208
3213
|
const workerResult = readWorkerResultMetadata(args.metadataEvent);
|
|
3209
|
-
const
|
|
3214
|
+
const hasCompletionEvidence = !!finalSummary || !!workerResult;
|
|
3215
|
+
const completedTask = sessionId && hasCompletionEvidence ? updateSessionTaskStatus(args.meshId, sessionId, "completed") : null;
|
|
3210
3216
|
if (completedTask) {
|
|
3211
3217
|
completedTaskForLedger = { id: completedTask.id };
|
|
3212
3218
|
try {
|
|
@@ -8680,6 +8686,11 @@ var MESH_REFINE_CONFIG_SCHEMA = {
|
|
|
8680
8686
|
required: ["version"],
|
|
8681
8687
|
properties: {
|
|
8682
8688
|
version: { const: 1 },
|
|
8689
|
+
allowAutoPublishSubmoduleMainCommits: {
|
|
8690
|
+
type: "boolean",
|
|
8691
|
+
default: false,
|
|
8692
|
+
description: "When true, Refinery may non-force publish submodule gitlink commits referenced by the refined root tree to each submodule origin/main after validation and patch-equivalence pass, then verify reachability."
|
|
8693
|
+
},
|
|
8683
8694
|
validation: {
|
|
8684
8695
|
type: "object",
|
|
8685
8696
|
additionalProperties: false,
|
|
@@ -8772,6 +8783,9 @@ function validateMeshRefineConfig(config, source = "inline") {
|
|
|
8772
8783
|
const rejectedCommands = [];
|
|
8773
8784
|
if (!isRecord(config)) return { valid: false, errors: ["config must be an object"], commands, rejectedCommands };
|
|
8774
8785
|
if (config.version !== 1) errors.push("version must be 1");
|
|
8786
|
+
if (config.allowAutoPublishSubmoduleMainCommits !== void 0 && typeof config.allowAutoPublishSubmoduleMainCommits !== "boolean") {
|
|
8787
|
+
errors.push("allowAutoPublishSubmoduleMainCommits must be a boolean when provided");
|
|
8788
|
+
}
|
|
8775
8789
|
const validation = config.validation;
|
|
8776
8790
|
if (validation !== void 0 && !isRecord(validation)) errors.push("validation must be an object");
|
|
8777
8791
|
const rawCommands = isRecord(validation) ? validation.commands : void 0;
|
|
@@ -16731,7 +16745,7 @@ async function handleReadChat(h, args) {
|
|
|
16731
16745
|
returnedMessages,
|
|
16732
16746
|
ptyStatusApprovalOnly: false
|
|
16733
16747
|
});
|
|
16734
|
-
if (supportsCliNativeTranscript(providerType)) {
|
|
16748
|
+
if (supportsCliNativeTranscript(providerType) && provider?.canonicalHistory?.mode === "native-source") {
|
|
16735
16749
|
const agentStr = provider?.type || args?.agentType || getCurrentProviderType(h, adapter.cliType);
|
|
16736
16750
|
const workspace = typeof args?.workspace === "string" ? args.workspace : typeof h.currentSession?.workspace === "string" ? h.currentSession.workspace : typeof adapter.workingDir === "string" ? adapter.workingDir : void 0;
|
|
16737
16751
|
const nativeHistoryLimit = Math.max(
|
|
@@ -16890,6 +16904,17 @@ async function handleReadChat(h, args) {
|
|
|
16890
16904
|
freshEnough: true,
|
|
16891
16905
|
ptyStatusApprovalOnly: false
|
|
16892
16906
|
});
|
|
16907
|
+
const requiresNativeSource = supportsCliNativeTranscript(agentStr) && provider?.canonicalHistory?.mode === "native-source";
|
|
16908
|
+
if (requiresNativeSource && !nativeSelected) {
|
|
16909
|
+
return {
|
|
16910
|
+
success: false,
|
|
16911
|
+
code: "native_history_not_safely_available",
|
|
16912
|
+
error: "Provider-native history was not safely available for the requested CLI session.",
|
|
16913
|
+
providerSessionId: historyProviderSessionId,
|
|
16914
|
+
messageSource,
|
|
16915
|
+
transcriptProvenance: messageSource
|
|
16916
|
+
};
|
|
16917
|
+
}
|
|
16893
16918
|
return buildReadChatCommandResult({
|
|
16894
16919
|
messages: historyMessages,
|
|
16895
16920
|
status: "idle",
|
|
@@ -21788,6 +21813,14 @@ function hasAdapterPendingResponse(adapter) {
|
|
|
21788
21813
|
function countMessages(value) {
|
|
21789
21814
|
return Array.isArray(value) ? value.length : 0;
|
|
21790
21815
|
}
|
|
21816
|
+
function hasFinalAssistantMessage(value) {
|
|
21817
|
+
const messages = Array.isArray(value) ? value : [];
|
|
21818
|
+
const last = messages[messages.length - 1];
|
|
21819
|
+
if (!last || last.role !== "assistant") return false;
|
|
21820
|
+
if (last.bubbleState === "streaming") return false;
|
|
21821
|
+
if (last.meta?.streaming === true) return false;
|
|
21822
|
+
return typeof last.content === "string" && last.content.trim().length > 0;
|
|
21823
|
+
}
|
|
21791
21824
|
function hasZeroMessageStartingLaunch(adapter) {
|
|
21792
21825
|
const adapterStatus = adapter?.getStatus?.({ allowParse: false }) ?? adapter?.getStatus?.() ?? {};
|
|
21793
21826
|
const parsedStatus = typeof adapter?.getScriptParsedStatus === "function" ? adapter.getScriptParsedStatus() : {};
|
|
@@ -21799,6 +21832,17 @@ function hasZeroMessageStartingLaunch(adapter) {
|
|
|
21799
21832
|
if (countMessages(adapterStatus?.messages) > 0 || countMessages(parsedStatus?.messages) > 0) return false;
|
|
21800
21833
|
return !hasAdapterPendingResponse(adapter);
|
|
21801
21834
|
}
|
|
21835
|
+
function hasCompletedStartingLaunch(adapter) {
|
|
21836
|
+
const adapterStatus = adapter?.getStatus?.({ allowParse: false }) ?? adapter?.getStatus?.() ?? {};
|
|
21837
|
+
const adapterRawStatus = normalizeAgentStatus(adapterStatus?.status);
|
|
21838
|
+
if (adapterRawStatus !== "starting") return false;
|
|
21839
|
+
if (hasAdapterPendingResponse(adapter)) return false;
|
|
21840
|
+
const parsedStatus = typeof adapter?.getScriptParsedStatus === "function" ? adapter.getScriptParsedStatus() : {};
|
|
21841
|
+
const parsedRawStatus = normalizeAgentStatus(parsedStatus?.status);
|
|
21842
|
+
if (parsedRawStatus !== "idle") return false;
|
|
21843
|
+
if (hasNonEmptyModalButtons2(adapterStatus?.activeModal ?? adapterStatus?.modal ?? parsedStatus?.activeModal ?? parsedStatus?.modal)) return false;
|
|
21844
|
+
return hasFinalAssistantMessage(parsedStatus?.messages);
|
|
21845
|
+
}
|
|
21802
21846
|
function shouldSuppressStaleParsedBusyStatus(adapterStatus, parsedStatus, adapter) {
|
|
21803
21847
|
const parsedRawStatus = normalizeAgentStatus(parsedStatus?.status);
|
|
21804
21848
|
if (!BUSY_AGENT_STATUSES.has(parsedRawStatus)) return false;
|
|
@@ -21808,6 +21852,7 @@ function shouldSuppressStaleParsedBusyStatus(adapterStatus, parsedStatus, adapte
|
|
|
21808
21852
|
}
|
|
21809
21853
|
function getEffectiveAgentSendStatus(adapter) {
|
|
21810
21854
|
const adapterStatus = normalizeAgentStatus(adapter?.getStatus?.({ allowParse: false })?.status ?? adapter?.getStatus?.()?.status);
|
|
21855
|
+
if (adapterStatus === "starting" && hasCompletedStartingLaunch(adapter)) return "idle";
|
|
21811
21856
|
if (adapterStatus && adapterStatus !== "idle") return adapterStatus;
|
|
21812
21857
|
if (adapterStatus !== "idle") return adapterStatus;
|
|
21813
21858
|
if (typeof adapter?.getScriptParsedStatus !== "function") return adapterStatus;
|
|
@@ -26786,6 +26831,16 @@ function buildSubmodulePublishRequiredNextStep(entries) {
|
|
|
26786
26831
|
const refs = entries.map((entry) => `${entry.path}@${entry.commit}`).join(", ");
|
|
26787
26832
|
return `Ask the user for explicit approval to push/publish the unreachable submodule commit(s) (${refs}) to the configured submodule remote main branch, then rerun mesh_refine_node. Do not merge the root branch until every submodule gitlink commit is reachable from submodule origin/main.`;
|
|
26788
26833
|
}
|
|
26834
|
+
function resolveRefineryAutoPublishSubmoduleMainCommits(mesh, workspace) {
|
|
26835
|
+
if (mesh?.policy?.allowAutoPublishSubmoduleMainCommits === true) {
|
|
26836
|
+
return { enabled: true, source: "mesh.policy.allowAutoPublishSubmoduleMainCommits" };
|
|
26837
|
+
}
|
|
26838
|
+
const loaded = loadMeshRefineConfig(mesh, workspace);
|
|
26839
|
+
if (loaded.config?.allowAutoPublishSubmoduleMainCommits === true) {
|
|
26840
|
+
return { enabled: true, source: loaded.path || loaded.source };
|
|
26841
|
+
}
|
|
26842
|
+
return { enabled: false };
|
|
26843
|
+
}
|
|
26789
26844
|
async function computeGitPatchId(cwd, fromRef, toRef) {
|
|
26790
26845
|
const { execFileSync: execFileSync3 } = await import("child_process");
|
|
26791
26846
|
const diff = execFileSync3("git", ["diff", "--patch", "--full-index", fromRef, toRef], {
|
|
@@ -26854,7 +26909,7 @@ async function runMeshRefinePatchEquivalenceGate(repoRoot, baseHead, branchHead)
|
|
|
26854
26909
|
};
|
|
26855
26910
|
}
|
|
26856
26911
|
}
|
|
26857
|
-
async function runMeshRefineSubmoduleReachabilityGate(repoRoot, mergedTree) {
|
|
26912
|
+
async function runMeshRefineSubmoduleReachabilityGate(repoRoot, mergedTree, options = {}) {
|
|
26858
26913
|
const startedAt = Date.now();
|
|
26859
26914
|
const entries = [];
|
|
26860
26915
|
try {
|
|
@@ -26875,6 +26930,17 @@ async function runMeshRefineSubmoduleReachabilityGate(repoRoot, mergedTree) {
|
|
|
26875
26930
|
await runGit2(submodulePath, ["-c", "protocol.file.allow=always", "fetch", "origin", `refs/heads/${branch}:refs/remotes/origin/${branch}`]);
|
|
26876
26931
|
await runGit2(submodulePath, ["merge-base", "--is-ancestor", commit, `refs/remotes/origin/${branch}`]);
|
|
26877
26932
|
};
|
|
26933
|
+
const publishCommitToRemoteMain = async (submodulePath, commit, branch = "main") => {
|
|
26934
|
+
const refspec = `${commit}:refs/heads/${branch}`;
|
|
26935
|
+
const { stdout, stderr } = await execFileAsync3("git", ["push", "origin", refspec], {
|
|
26936
|
+
cwd: submodulePath,
|
|
26937
|
+
encoding: "utf8",
|
|
26938
|
+
timeout: 3e4,
|
|
26939
|
+
maxBuffer: REFINE_PATCH_EQUIVALENCE_OUTPUT_LIMIT_BYTES,
|
|
26940
|
+
windowsHide: true
|
|
26941
|
+
});
|
|
26942
|
+
return { stdout: String(stdout || ""), stderr: String(stderr || ""), refspec };
|
|
26943
|
+
};
|
|
26878
26944
|
const treeOutput = await runGit2(repoRoot, ["ls-tree", "-r", "-z", mergedTree]);
|
|
26879
26945
|
const gitlinks = treeOutput.split("\0").filter(Boolean).map((record) => {
|
|
26880
26946
|
const match = /^160000\s+commit\s+([0-9a-f]{40})\t(.+)$/.exec(record);
|
|
@@ -26915,11 +26981,43 @@ async function runMeshRefineSubmoduleReachabilityGate(repoRoot, mergedTree) {
|
|
|
26915
26981
|
continue;
|
|
26916
26982
|
}
|
|
26917
26983
|
entry.remoteMainBranch = "main";
|
|
26918
|
-
|
|
26919
|
-
|
|
26920
|
-
|
|
26921
|
-
|
|
26922
|
-
|
|
26984
|
+
try {
|
|
26985
|
+
await verifyRemoteMainContainsCommit(submodulePath, gitlink.commit, "main");
|
|
26986
|
+
entry.fetchedFromOrigin = true;
|
|
26987
|
+
entry.remoteReachable = true;
|
|
26988
|
+
entry.remoteMainReachable = true;
|
|
26989
|
+
entry.reachable = true;
|
|
26990
|
+
} catch (e) {
|
|
26991
|
+
entry.remoteReachable = false;
|
|
26992
|
+
entry.remoteMainReachable = false;
|
|
26993
|
+
entry.publishRequired = true;
|
|
26994
|
+
const details = truncateValidationOutput(e?.stderr || e?.message || String(e));
|
|
26995
|
+
entry.error = `Submodule remote main reachability check failed for origin/main: ${details}`;
|
|
26996
|
+
if (options.allowAutoPublishSubmoduleMainCommits === true && entry.localReachable === true) {
|
|
26997
|
+
entry.autoPublishAllowed = true;
|
|
26998
|
+
entry.autoPublishAttempted = true;
|
|
26999
|
+
try {
|
|
27000
|
+
const publish = await publishCommitToRemoteMain(submodulePath, gitlink.commit, "main");
|
|
27001
|
+
entry.autoPublishRefspec = publish.refspec;
|
|
27002
|
+
entry.publishStdout = truncateValidationOutput(publish.stdout);
|
|
27003
|
+
entry.publishStderr = truncateValidationOutput(publish.stderr);
|
|
27004
|
+
entry.autoPublishSucceeded = true;
|
|
27005
|
+
await verifyRemoteMainContainsCommit(submodulePath, gitlink.commit, "main");
|
|
27006
|
+
entry.fetchedFromOrigin = true;
|
|
27007
|
+
entry.remoteReachable = true;
|
|
27008
|
+
entry.remoteMainReachable = true;
|
|
27009
|
+
entry.autoPublishVerified = true;
|
|
27010
|
+
entry.publishRequired = false;
|
|
27011
|
+
entry.reachable = true;
|
|
27012
|
+
entry.error = void 0;
|
|
27013
|
+
} catch (publishError) {
|
|
27014
|
+
entry.autoPublishSucceeded = false;
|
|
27015
|
+
entry.autoPublishVerified = false;
|
|
27016
|
+
const publishDetails = truncateValidationOutput(publishError?.stderr || publishError?.message || String(publishError));
|
|
27017
|
+
entry.error = `Submodule auto-publish to origin/main failed or could not be verified: ${publishDetails}`;
|
|
27018
|
+
}
|
|
27019
|
+
}
|
|
27020
|
+
}
|
|
26923
27021
|
} catch (e) {
|
|
26924
27022
|
entry.remoteReachable = false;
|
|
26925
27023
|
entry.remoteMainReachable = false;
|
|
@@ -26939,7 +27037,9 @@ async function runMeshRefineSubmoduleReachabilityGate(repoRoot, mergedTree) {
|
|
|
26939
27037
|
checked: entries.length,
|
|
26940
27038
|
unreachable: unreachable.map((entry) => ({ ...entry, publishRequired: entry.publishRequired !== false })),
|
|
26941
27039
|
entries: entries.map((entry) => entry.reachable ? entry : { ...entry, publishRequired: entry.publishRequired !== false }),
|
|
26942
|
-
durationMs: Date.now() - startedAt
|
|
27040
|
+
durationMs: Date.now() - startedAt,
|
|
27041
|
+
autoPublishAllowed: options.allowAutoPublishSubmoduleMainCommits === true,
|
|
27042
|
+
autoPublishPolicySource: options.autoPublishPolicySource
|
|
26943
27043
|
};
|
|
26944
27044
|
} catch (e) {
|
|
26945
27045
|
const unreachable = entries.filter((entry) => !entry.reachable).map((entry) => ({ ...entry, publishRequired: true }));
|
|
@@ -26949,6 +27049,8 @@ async function runMeshRefineSubmoduleReachabilityGate(repoRoot, mergedTree) {
|
|
|
26949
27049
|
unreachable,
|
|
26950
27050
|
entries: entries.map((entry) => entry.reachable ? entry : { ...entry, publishRequired: true }),
|
|
26951
27051
|
durationMs: Date.now() - startedAt,
|
|
27052
|
+
autoPublishAllowed: options.allowAutoPublishSubmoduleMainCommits === true,
|
|
27053
|
+
autoPublishPolicySource: options.autoPublishPolicySource,
|
|
26952
27054
|
error: truncateValidationOutput(e?.message || String(e))
|
|
26953
27055
|
};
|
|
26954
27056
|
}
|
|
@@ -28087,13 +28189,36 @@ var DaemonCommandRouter = class {
|
|
|
28087
28189
|
};
|
|
28088
28190
|
}
|
|
28089
28191
|
const submoduleReachabilityStarted = Date.now();
|
|
28090
|
-
const
|
|
28192
|
+
const autoPublishSubmoduleMainCommits = resolveRefineryAutoPublishSubmoduleMainCommits(mesh, node.workspace);
|
|
28193
|
+
const submoduleReachability = await runMeshRefineSubmoduleReachabilityGate(repoRoot, patchEquivalence.mergedTree || branchHead, {
|
|
28194
|
+
allowAutoPublishSubmoduleMainCommits: autoPublishSubmoduleMainCommits.enabled,
|
|
28195
|
+
autoPublishPolicySource: autoPublishSubmoduleMainCommits.source
|
|
28196
|
+
});
|
|
28091
28197
|
recordMeshRefineStage(refineStages, "submodule_reachability", submoduleReachability.status, submoduleReachabilityStarted, {
|
|
28092
28198
|
checked: submoduleReachability.checked,
|
|
28199
|
+
autoPublishAllowed: submoduleReachability.autoPublishAllowed,
|
|
28200
|
+
autoPublishPolicySource: submoduleReachability.autoPublishPolicySource,
|
|
28201
|
+
autoPublished: submoduleReachability.entries.filter((entry) => entry.autoPublishAttempted).map((entry) => ({
|
|
28202
|
+
path: entry.path,
|
|
28203
|
+
commit: entry.commit,
|
|
28204
|
+
remote: entry.remote,
|
|
28205
|
+
remoteUrl: entry.remoteUrl,
|
|
28206
|
+
remoteMainBranch: entry.remoteMainBranch,
|
|
28207
|
+
refspec: entry.autoPublishRefspec,
|
|
28208
|
+
succeeded: entry.autoPublishSucceeded,
|
|
28209
|
+
verified: entry.autoPublishVerified,
|
|
28210
|
+
remoteMainReachable: entry.remoteMainReachable,
|
|
28211
|
+
error: entry.error
|
|
28212
|
+
})),
|
|
28093
28213
|
unreachable: submoduleReachability.unreachable.map((entry) => ({
|
|
28094
28214
|
path: entry.path,
|
|
28095
28215
|
commit: entry.commit,
|
|
28096
28216
|
publishRequired: entry.publishRequired === true,
|
|
28217
|
+
autoPublishAllowed: entry.autoPublishAllowed,
|
|
28218
|
+
autoPublishAttempted: entry.autoPublishAttempted,
|
|
28219
|
+
autoPublishSucceeded: entry.autoPublishSucceeded,
|
|
28220
|
+
autoPublishVerified: entry.autoPublishVerified,
|
|
28221
|
+
autoPublishRefspec: entry.autoPublishRefspec,
|
|
28097
28222
|
remote: entry.remote,
|
|
28098
28223
|
remoteUrl: entry.remoteUrl,
|
|
28099
28224
|
remoteReachable: entry.remoteReachable,
|
|
@@ -28127,6 +28252,11 @@ var DaemonCommandRouter = class {
|
|
|
28127
28252
|
remoteReachable: entry.remoteReachable,
|
|
28128
28253
|
remoteMainBranch: entry.remoteMainBranch,
|
|
28129
28254
|
remoteMainReachable: entry.remoteMainReachable,
|
|
28255
|
+
autoPublishAllowed: entry.autoPublishAllowed,
|
|
28256
|
+
autoPublishAttempted: entry.autoPublishAttempted,
|
|
28257
|
+
autoPublishSucceeded: entry.autoPublishSucceeded,
|
|
28258
|
+
autoPublishVerified: entry.autoPublishVerified,
|
|
28259
|
+
autoPublishRefspec: entry.autoPublishRefspec,
|
|
28130
28260
|
error: entry.error
|
|
28131
28261
|
})),
|
|
28132
28262
|
branch,
|
|
@@ -28201,7 +28331,7 @@ var DaemonCommandRouter = class {
|
|
|
28201
28331
|
appendLedgerEntry2(meshId, {
|
|
28202
28332
|
kind: "node_removed",
|
|
28203
28333
|
nodeId,
|
|
28204
|
-
payload: { refined: true, mergedBranch: branch, into: baseBranch, validationSummary, patchEquivalence }
|
|
28334
|
+
payload: { refined: true, mergedBranch: branch, into: baseBranch, validationSummary, patchEquivalence, submoduleReachability }
|
|
28205
28335
|
});
|
|
28206
28336
|
recordMeshRefineStage(refineStages, "ledger", "passed", ledgerStarted);
|
|
28207
28337
|
} catch (e) {
|
|
@@ -28229,6 +28359,7 @@ var DaemonCommandRouter = class {
|
|
|
28229
28359
|
removeResult,
|
|
28230
28360
|
validationSummary,
|
|
28231
28361
|
patchEquivalence,
|
|
28362
|
+
submoduleReachability,
|
|
28232
28363
|
mergeResult,
|
|
28233
28364
|
refineStages,
|
|
28234
28365
|
...ledgerError ? { ledgerError } : {},
|
|
@@ -28243,6 +28374,7 @@ var DaemonCommandRouter = class {
|
|
|
28243
28374
|
removeResult,
|
|
28244
28375
|
validationSummary,
|
|
28245
28376
|
patchEquivalence,
|
|
28377
|
+
submoduleReachability,
|
|
28246
28378
|
mergeResult,
|
|
28247
28379
|
refineStages,
|
|
28248
28380
|
...ledgerError ? { ledgerError } : {},
|