@runfusion/fusion 0.36.0 → 0.37.0
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/bin.js +164 -15
- package/dist/client/.vite/manifest.json +61 -61
- package/dist/client/assets/{AgentDetailView-CGycokdR.js → AgentDetailView-T_AHPxcG.js} +1 -1
- package/dist/client/assets/{AgentPermissionPolicyEditor-BoD6come.js → AgentPermissionPolicyEditor-niLSqGAE.js} +1 -1
- package/dist/client/assets/{AgentsView-B_afRRfc.js → AgentsView-CQhaLHz_.js} +3 -3
- package/dist/client/assets/{ChatView-IjNrSZSf.js → ChatView-B60kYfdk.js} +1 -1
- package/dist/client/assets/{DevServerView-Dd613aZ5.js → DevServerView-0Gb44WOb.js} +1 -1
- package/dist/client/assets/{DirectoryPicker-H-fUl2dF.js → DirectoryPicker-BSQA0XM9.js} +1 -1
- package/dist/client/assets/{DocumentsView-Dshc9e5K.js → DocumentsView-XZbaqEFF.js} +1 -1
- package/dist/client/assets/{EvalsView-50W0K5h7.js → EvalsView-CJNtXxX9.js} +1 -1
- package/dist/client/assets/{ExperimentalAgentOnboardingModal-BXBljPFj.js → ExperimentalAgentOnboardingModal-DR8E3i36.js} +1 -1
- package/dist/client/assets/GoalsView-CN1zQ_Ax.js +1 -0
- package/dist/client/assets/GoalsView-CtWi0fxE.css +1 -0
- package/dist/client/assets/{InsightsView-sVbGRKTl.js → InsightsView-D_jRaMyn.js} +1 -1
- package/dist/client/assets/{MemoryView-006a_sB0.js → MemoryView-D90vdPnp.js} +1 -1
- package/dist/client/assets/{NodesView-CiRPqgVx.js → NodesView-C1zuedAe.js} +1 -1
- package/dist/client/assets/{PiExtensionsManager-Y1ETuTxf.js → PiExtensionsManager-DBJDDVfM.js} +1 -1
- package/dist/client/assets/{PluginManager-Df_KHiXn.js → PluginManager-Ceg64P2Z.js} +1 -1
- package/dist/client/assets/{ResearchView-DU_QuS_-.js → ResearchView-XRwWdczc.js} +1 -1
- package/dist/client/assets/{SecretsView-D61Jvysn.js → SecretsView-TCrKyCme.js} +1 -1
- package/dist/client/assets/{SettingsModal-Cpur3WpT.js → SettingsModal-B8fRuWdQ.js} +3 -3
- package/dist/client/assets/{SettingsModal-BarzmqNb.js → SettingsModal-C1TczsEr.js} +1 -1
- package/dist/client/assets/{SetupWizardModal-BF3iRNq9.js → SetupWizardModal-D6moSTT3.js} +1 -1
- package/dist/client/assets/{SkillsView-tCKOFw3j.js → SkillsView-BDHLPVBi.js} +1 -1
- package/dist/client/assets/{StashRecoveryView-nGtypd10.js → StashRecoveryView-DZGa591R.js} +1 -1
- package/dist/client/assets/{TodoView-IyGPV6AO.js → TodoView-nr_SnCJv.js} +1 -1
- package/dist/client/assets/{dashboard-view-DiA5-hnb.js → dashboard-view-0XeZ1FTR.js} +1 -1
- package/dist/client/assets/{folder-open-Byqfi_N-.js → folder-open-iURwQbEg.js} +1 -1
- package/dist/client/assets/{index-B9Ro_NwC.js → index-CjuQj4qe.js} +14 -14
- package/dist/client/assets/index-DmrpDn7c.css +1 -0
- package/dist/client/assets/{upload-D6_BjqVi.js → upload-Beqg4S4L.js} +1 -1
- package/dist/client/assets/{users-CERYgInO.js → users-C2o86ZCR.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/client/version.json +1 -1
- package/dist/droid-cli/package.json +1 -1
- package/dist/extension.js +195 -15
- package/dist/pi-claude-cli/package.json +1 -1
- package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
- package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
- package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-reports/package.json +1 -1
- package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
- package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
- package/package.json +1 -1
- package/skill/fusion/SKILL.md +1 -1
- package/skill/fusion/references/extension-tools.md +16 -0
- package/skill/fusion/references/fusion-capabilities.md +1 -0
- package/dist/client/assets/GoalsView-Cg136Jcn.css +0 -1
- package/dist/client/assets/GoalsView-Dh508Z2s.js +0 -1
- package/dist/client/assets/index-DVFBXjGT.css +0 -1
package/dist/bin.js
CHANGED
|
@@ -71754,6 +71754,8 @@ var init_gating_classifications = __esm({
|
|
|
71754
71754
|
"fn_insight_show",
|
|
71755
71755
|
"fn_insight_run_list",
|
|
71756
71756
|
"fn_insight_run_show",
|
|
71757
|
+
"fn_goal_list",
|
|
71758
|
+
"fn_goal_show",
|
|
71757
71759
|
"fn_mission_list",
|
|
71758
71760
|
"fn_mission_show",
|
|
71759
71761
|
"fn_list_agents",
|
|
@@ -92596,6 +92598,7 @@ __export(merger_exports, {
|
|
|
92596
92598
|
VERIFICATION_LOG_MAX_CHARS: () => VERIFICATION_LOG_MAX_CHARS,
|
|
92597
92599
|
VerificationError: () => VerificationError,
|
|
92598
92600
|
__executePostMergeScriptStepForTests: () => __executePostMergeScriptStepForTests,
|
|
92601
|
+
__testOnlyBuildDeterministicMergeMessage: () => buildDeterministicMergeMessage,
|
|
92599
92602
|
__test__: () => __test__,
|
|
92600
92603
|
aiMergeTask: () => aiMergeTask,
|
|
92601
92604
|
applyAutostashBySha: () => applyAutostashBySha,
|
|
@@ -95331,7 +95334,7 @@ async function filterStagedGitignoredPaths(rootDir, taskId) {
|
|
|
95331
95334
|
return { unstaged: [], remainingStaged };
|
|
95332
95335
|
}
|
|
95333
95336
|
}
|
|
95334
|
-
async function commitOrAmendMergeWithFixes(rootDir, taskId, branch, commitLog, includeTaskId, preAttemptHeadSha, authorArg, diffStat, settings, signal, aiSummary, aiSubject, fixModifiedFiles = /* @__PURE__ */ new Set(), store, auditor) {
|
|
95337
|
+
async function commitOrAmendMergeWithFixes(rootDir, taskId, branch, commitLog, includeTaskId, preAttemptHeadSha, authorArg, diffStat, settings, signal, aiSummary, aiBody, aiSubject, fixModifiedFiles = /* @__PURE__ */ new Set(), store, auditor) {
|
|
95335
95338
|
try {
|
|
95336
95339
|
const { stdout: squashStagedOut } = await execAsync26("git diff --cached --name-only", {
|
|
95337
95340
|
cwd: rootDir,
|
|
@@ -95631,7 +95634,7 @@ ${msg}`;
|
|
|
95631
95634
|
diffStat: messageDiffStat,
|
|
95632
95635
|
includeTaskId,
|
|
95633
95636
|
aiSummary,
|
|
95634
|
-
aiBody
|
|
95637
|
+
aiBody,
|
|
95635
95638
|
aiSubject
|
|
95636
95639
|
});
|
|
95637
95640
|
let lineageId;
|
|
@@ -99063,6 +99066,7 @@ async function aiMergeTask(store, rootDir, taskId, options = {}) {
|
|
|
99063
99066
|
settings,
|
|
99064
99067
|
options.signal,
|
|
99065
99068
|
aiMergeSummary,
|
|
99069
|
+
aiMergeBody,
|
|
99066
99070
|
aiMergeSubject,
|
|
99067
99071
|
verificationFixModifiedFiles,
|
|
99068
99072
|
store,
|
|
@@ -99194,6 +99198,7 @@ async function aiMergeTask(store, rootDir, taskId, options = {}) {
|
|
|
99194
99198
|
settings,
|
|
99195
99199
|
options.signal,
|
|
99196
99200
|
aiMergeSummary,
|
|
99201
|
+
aiMergeBody,
|
|
99197
99202
|
aiMergeSubject,
|
|
99198
99203
|
buildFixModifiedFiles,
|
|
99199
99204
|
store,
|
|
@@ -100108,6 +100113,7 @@ async function executeMergeAttempt(params, aiTracker) {
|
|
|
100108
100113
|
diffStat,
|
|
100109
100114
|
includeTaskId,
|
|
100110
100115
|
aiSummary: safeBody,
|
|
100116
|
+
aiBody: aiBody?.trim().length ? aiBody : safeBody,
|
|
100111
100117
|
aiSubject
|
|
100112
100118
|
});
|
|
100113
100119
|
await enforceSquashFileScopeInvariant({
|
|
@@ -100302,6 +100308,7 @@ async function executeMergeAttempt(params, aiTracker) {
|
|
|
100302
100308
|
diffStat: actualContext.diffStat || diffStat,
|
|
100303
100309
|
includeTaskId,
|
|
100304
100310
|
aiSummary,
|
|
100311
|
+
aiBody,
|
|
100305
100312
|
aiSubject
|
|
100306
100313
|
});
|
|
100307
100314
|
const trailerArg = buildTaskTrailerArgs(taskId);
|
|
@@ -115035,12 +115042,7 @@ ${summary}`,
|
|
|
115035
115042
|
this.tokenUsageBaselines.delete(task.id);
|
|
115036
115043
|
session.dispose();
|
|
115037
115044
|
await this.persistTokenUsage(task.id);
|
|
115038
|
-
await this.store.updateTask(task.id, {
|
|
115039
|
-
status: "failed",
|
|
115040
|
-
error: "executor-exit-while-review-pending"
|
|
115041
|
-
});
|
|
115042
115045
|
await this.handoffTaskToReview(task, "executor-exit-while-review-pending");
|
|
115043
|
-
this.options.onError?.(task, new Error("executor-exit-while-review-pending"));
|
|
115044
115046
|
pendingReviewParked = true;
|
|
115045
115047
|
break;
|
|
115046
115048
|
}
|
|
@@ -122863,7 +122865,10 @@ var init_mission_execution_loop = __esm({
|
|
|
122863
122865
|
try {
|
|
122864
122866
|
await this.missionStore.transitionLoopState(feature.id, "implementing");
|
|
122865
122867
|
if (feature.taskId) {
|
|
122866
|
-
await this.
|
|
122868
|
+
const linkedTask = await this.taskStore.getTask(feature.taskId).catch(() => null);
|
|
122869
|
+
if (linkedTask && (linkedTask.column === "done" || linkedTask.column === "archived")) {
|
|
122870
|
+
await this.processTaskOutcome(feature.taskId);
|
|
122871
|
+
}
|
|
122867
122872
|
}
|
|
122868
122873
|
recoveredCount++;
|
|
122869
122874
|
} catch (err) {
|
|
@@ -122874,7 +122879,10 @@ var init_mission_execution_loop = __esm({
|
|
|
122874
122879
|
loopLog.log(`Recovery: feature ${feature.id} awaiting fix implementation`);
|
|
122875
122880
|
if (feature.taskId) {
|
|
122876
122881
|
try {
|
|
122877
|
-
await this.
|
|
122882
|
+
const linkedTask = await this.taskStore.getTask(feature.taskId).catch(() => null);
|
|
122883
|
+
if (linkedTask && (linkedTask.column === "done" || linkedTask.column === "archived")) {
|
|
122884
|
+
await this.processTaskOutcome(feature.taskId);
|
|
122885
|
+
}
|
|
122878
122886
|
recoveredCount++;
|
|
122879
122887
|
} catch (err) {
|
|
122880
122888
|
loopLog.error(`Recovery failed for needs_fix feature ${feature.id}:`, err);
|
|
@@ -122916,10 +122924,17 @@ var init_mission_execution_loop = __esm({
|
|
|
122916
122924
|
}
|
|
122917
122925
|
if (feature.loopState !== "implementing") {
|
|
122918
122926
|
loopLog.log(`Feature ${feature.id} loopState is "${feature.loopState}"; skipping validation`);
|
|
122927
|
+
this.logFeatureWarningEvent(feature.id, "validation_skipped_loop_state", `Validation skipped: feature ${feature.id} is in loopState "${feature.loopState}" (expected "implementing").`, {
|
|
122928
|
+
taskId,
|
|
122929
|
+
loopState: feature.loopState
|
|
122930
|
+
});
|
|
122919
122931
|
return;
|
|
122920
122932
|
}
|
|
122921
122933
|
if (this.activeValidations.has(feature.id)) {
|
|
122922
122934
|
loopLog.log(`Feature ${feature.id} already has an active validation; skipping duplicate trigger`);
|
|
122935
|
+
this.logFeatureWarningEvent(feature.id, "validation_deduplicated", `Validation already running for feature ${feature.id}; duplicate trigger ignored.`, {
|
|
122936
|
+
taskId
|
|
122937
|
+
});
|
|
122923
122938
|
return;
|
|
122924
122939
|
}
|
|
122925
122940
|
const assertions = this.missionStore.listAssertionsForFeature(feature.id);
|
|
@@ -123387,6 +123402,10 @@ ${taskContext}` : ""}`;
|
|
|
123387
123402
|
this.missionStore.completeValidatorRun(runId, "blocked", blockedReason);
|
|
123388
123403
|
}
|
|
123389
123404
|
loopLog.log(`Feature ${featureId} blocked: ${blockedReason}`);
|
|
123405
|
+
this.logFeatureErrorEvent(featureId, "validation_blocked", `Validation blocked for feature ${featureId}: ${blockedReason ?? "no reason provided"}`, {
|
|
123406
|
+
runId,
|
|
123407
|
+
blockedReason: blockedReason ?? null
|
|
123408
|
+
});
|
|
123390
123409
|
if (this.missionAutopilot?.notifyValidationComplete) {
|
|
123391
123410
|
await this.missionAutopilot.notifyValidationComplete(featureId, "blocked");
|
|
123392
123411
|
}
|
|
@@ -123404,6 +123423,10 @@ ${taskContext}` : ""}`;
|
|
|
123404
123423
|
this.missionStore.completeValidatorRun(runId, "error", error);
|
|
123405
123424
|
}
|
|
123406
123425
|
loopLog.error(`Feature ${featureId} validation error: ${error}`);
|
|
123426
|
+
this.logFeatureErrorEvent(featureId, "validation_error", `Validation error for feature ${featureId}: ${error}`, {
|
|
123427
|
+
runId,
|
|
123428
|
+
error
|
|
123429
|
+
});
|
|
123407
123430
|
if (this.missionAutopilot?.notifyValidationComplete) {
|
|
123408
123431
|
await this.missionAutopilot.notifyValidationComplete(featureId, "error");
|
|
123409
123432
|
}
|
|
@@ -123412,6 +123435,31 @@ ${taskContext}` : ""}`;
|
|
|
123412
123435
|
loopLog.error(`Error handling validation error for ${featureId}:`, err);
|
|
123413
123436
|
}
|
|
123414
123437
|
}
|
|
123438
|
+
logFeatureWarningEvent(featureId, code, description, metadata) {
|
|
123439
|
+
this.logFeatureMissionEvent(featureId, "warning", code, description, metadata);
|
|
123440
|
+
}
|
|
123441
|
+
logFeatureErrorEvent(featureId, code, description, metadata) {
|
|
123442
|
+
this.logFeatureMissionEvent(featureId, "error", code, description, metadata);
|
|
123443
|
+
}
|
|
123444
|
+
logFeatureMissionEvent(featureId, eventType, code, description, metadata) {
|
|
123445
|
+
const feature = this.missionStore.getFeature(featureId);
|
|
123446
|
+
if (!feature) return;
|
|
123447
|
+
const slice = this.missionStore.getSlice(feature.sliceId);
|
|
123448
|
+
if (!slice) return;
|
|
123449
|
+
const milestone = this.missionStore.getMilestone(slice.milestoneId);
|
|
123450
|
+
if (!milestone) return;
|
|
123451
|
+
try {
|
|
123452
|
+
this.missionStore.logMissionEvent?.(milestone.missionId, eventType, description, {
|
|
123453
|
+
code,
|
|
123454
|
+
featureId,
|
|
123455
|
+
sliceId: slice.id,
|
|
123456
|
+
milestoneId: milestone.id,
|
|
123457
|
+
...metadata
|
|
123458
|
+
});
|
|
123459
|
+
} catch (err) {
|
|
123460
|
+
loopLog.warn(`Failed to log mission ${eventType} event for feature ${featureId}:`, err);
|
|
123461
|
+
}
|
|
123462
|
+
}
|
|
123415
123463
|
};
|
|
123416
123464
|
}
|
|
123417
123465
|
});
|
|
@@ -127874,6 +127922,78 @@ var init_error_classifier = __esm({
|
|
|
127874
127922
|
}
|
|
127875
127923
|
});
|
|
127876
127924
|
|
|
127925
|
+
// ../engine/src/goal-context-injector.ts
|
|
127926
|
+
function normalizeTitle(title) {
|
|
127927
|
+
return title.replace(/\s*\n+\s*/g, " ").trim();
|
|
127928
|
+
}
|
|
127929
|
+
function renderGoalContext(goals) {
|
|
127930
|
+
const lines = goals.map((goal) => `- ${goal.id}: ${normalizeTitle(goal.title)}`);
|
|
127931
|
+
return `## Active Goals
|
|
127932
|
+
|
|
127933
|
+
${lines.join("\n")}`;
|
|
127934
|
+
}
|
|
127935
|
+
function buildGoalContextSection(input) {
|
|
127936
|
+
const { activeGoals, onTruncated } = input;
|
|
127937
|
+
if (activeGoals.length === 0) {
|
|
127938
|
+
return { text: "", emittedGoalIds: [], truncated: null };
|
|
127939
|
+
}
|
|
127940
|
+
const sortedGoals = [...activeGoals].sort((a, b2) => {
|
|
127941
|
+
const byCreated = a.createdAt.localeCompare(b2.createdAt);
|
|
127942
|
+
if (byCreated !== 0) {
|
|
127943
|
+
return byCreated;
|
|
127944
|
+
}
|
|
127945
|
+
return a.id.localeCompare(b2.id);
|
|
127946
|
+
});
|
|
127947
|
+
const resolvedMaxGoals = Math.min(input.maxGoals ?? MAX_INJECTED_GOALS, MAX_INJECTED_GOALS);
|
|
127948
|
+
const charBudget = input.charBudget ?? DEFAULT_GOAL_INJECTION_CHAR_BUDGET;
|
|
127949
|
+
const droppedGoalIds = [];
|
|
127950
|
+
let selectedGoals = sortedGoals.slice(0, resolvedMaxGoals);
|
|
127951
|
+
if (sortedGoals.length > resolvedMaxGoals) {
|
|
127952
|
+
droppedGoalIds.push(...sortedGoals.slice(resolvedMaxGoals).map((goal) => goal.id));
|
|
127953
|
+
}
|
|
127954
|
+
let text = renderGoalContext(selectedGoals);
|
|
127955
|
+
let usedBudgetDrop = false;
|
|
127956
|
+
while (selectedGoals.length > 1 && text.length > charBudget) {
|
|
127957
|
+
const dropped = selectedGoals[selectedGoals.length - 1];
|
|
127958
|
+
selectedGoals = selectedGoals.slice(0, -1);
|
|
127959
|
+
droppedGoalIds.push(dropped.id);
|
|
127960
|
+
text = renderGoalContext(selectedGoals);
|
|
127961
|
+
usedBudgetDrop = true;
|
|
127962
|
+
}
|
|
127963
|
+
let truncated = null;
|
|
127964
|
+
if (droppedGoalIds.length > 0) {
|
|
127965
|
+
truncated = {
|
|
127966
|
+
reason: usedBudgetDrop ? "budget" : "cap",
|
|
127967
|
+
requested: activeGoals.length,
|
|
127968
|
+
emitted: selectedGoals.length,
|
|
127969
|
+
droppedGoalIds,
|
|
127970
|
+
charBudget,
|
|
127971
|
+
producedChars: text.length
|
|
127972
|
+
};
|
|
127973
|
+
onTruncated?.(truncated);
|
|
127974
|
+
}
|
|
127975
|
+
return {
|
|
127976
|
+
text,
|
|
127977
|
+
emittedGoalIds: selectedGoals.map((goal) => goal.id),
|
|
127978
|
+
truncated
|
|
127979
|
+
};
|
|
127980
|
+
}
|
|
127981
|
+
var MAX_INJECTED_GOALS, resolvedActiveGoalLimit, DEFAULT_GOAL_INJECTION_CHAR_BUDGET;
|
|
127982
|
+
var init_goal_context_injector = __esm({
|
|
127983
|
+
"../engine/src/goal-context-injector.ts"() {
|
|
127984
|
+
"use strict";
|
|
127985
|
+
init_src();
|
|
127986
|
+
MAX_INJECTED_GOALS = 5;
|
|
127987
|
+
resolvedActiveGoalLimit = "ACTIVE_GOAL_LIMIT" in src_exports && typeof ACTIVE_GOAL_LIMIT === "number" ? ACTIVE_GOAL_LIMIT : MAX_INJECTED_GOALS;
|
|
127988
|
+
if (MAX_INJECTED_GOALS > resolvedActiveGoalLimit) {
|
|
127989
|
+
throw new Error(
|
|
127990
|
+
`MAX_INJECTED_GOALS (${MAX_INJECTED_GOALS}) cannot exceed ACTIVE_GOAL_LIMIT (${resolvedActiveGoalLimit})`
|
|
127991
|
+
);
|
|
127992
|
+
}
|
|
127993
|
+
DEFAULT_GOAL_INJECTION_CHAR_BUDGET = 600;
|
|
127994
|
+
}
|
|
127995
|
+
});
|
|
127996
|
+
|
|
127877
127997
|
// ../engine/src/experiment/benchmark-runner.ts
|
|
127878
127998
|
import { spawn as spawn7 } from "node:child_process";
|
|
127879
127999
|
import { mkdtemp, writeFile as writeFile17 } from "node:fs/promises";
|
|
@@ -133007,9 +133127,19 @@ var init_in_process_runtime = __esm({
|
|
|
133007
133127
|
missionAutopilot: missionAutopilot ? {
|
|
133008
133128
|
notifyValidationComplete: async (featureId) => {
|
|
133009
133129
|
const feature = missionStore.getFeature(featureId);
|
|
133010
|
-
if (feature?.taskId) {
|
|
133011
|
-
|
|
133130
|
+
if (!feature?.taskId) {
|
|
133131
|
+
return;
|
|
133132
|
+
}
|
|
133133
|
+
const slice = missionStore.getSlice(feature.sliceId);
|
|
133134
|
+
const milestone = slice ? missionStore.getMilestone(slice.milestoneId) : void 0;
|
|
133135
|
+
const missionId = milestone?.missionId;
|
|
133136
|
+
if (missionId) {
|
|
133137
|
+
const mission = missionStore.getMission(missionId);
|
|
133138
|
+
if (mission?.autopilotEnabled && !missionAutopilot.isWatching(missionId)) {
|
|
133139
|
+
missionAutopilot.watchMission(missionId);
|
|
133140
|
+
}
|
|
133012
133141
|
}
|
|
133142
|
+
await missionAutopilot.handleTaskCompletion(feature.taskId);
|
|
133013
133143
|
}
|
|
133014
133144
|
} : void 0,
|
|
133015
133145
|
rootDir: this.config.workingDirectory,
|
|
@@ -135728,6 +135858,10 @@ function buildMergeSystemPrompt2(agentPrompts) {
|
|
|
135728
135858
|
" - The subject line must CONCISELY SUMMARIZE the squashed changes in",
|
|
135729
135859
|
' imperative mood (e.g. "add X", "fix Y") based on the actual diff \u2014 do',
|
|
135730
135860
|
" not just restate the task title.",
|
|
135861
|
+
" - The commit BODY must include:",
|
|
135862
|
+
" 1) one short narrative summary line,",
|
|
135863
|
+
" 2) a bullet list of key changes, and",
|
|
135864
|
+
" 3) a `Files changed:` section populated from `git diff --stat`.",
|
|
135731
135865
|
" - Include the task-id prefix and the trailer lines EXACTLY as given in the",
|
|
135732
135866
|
" task instructions (they associate the commit with the board task)."
|
|
135733
135867
|
].filter((l) => l !== void 0).join("\n");
|
|
@@ -135741,11 +135875,15 @@ function buildMergePrompt2(input) {
|
|
|
135741
135875
|
"Steps:",
|
|
135742
135876
|
` 1. Run: git merge --squash ${input.branch}`,
|
|
135743
135877
|
" 2. If there are conflicts, resolve them (favor the task's intent), then `git add` the resolved files.",
|
|
135744
|
-
" 3.
|
|
135745
|
-
|
|
135746
|
-
|
|
135878
|
+
" 3. Build a merge body from the staged squash diff:",
|
|
135879
|
+
" - one short narrative summary line",
|
|
135880
|
+
" - bullet list of key changes",
|
|
135881
|
+
" - `Files changed:` + the output of `git diff --stat`",
|
|
135882
|
+
" 4. Commit the staged result as a SINGLE commit whose subject summarizes the",
|
|
135883
|
+
` actual changes${input.taskTitle ? ` (task title hint: ${JSON.stringify(input.taskTitle)})` : ""}, including the body above and required trailers:`,
|
|
135884
|
+
` git commit -m ${subjectShape} -m "<narrative + bullet list + Files changed: ...>"${trailerArgs}`,
|
|
135747
135885
|
" Keep the trailer line(s) verbatim \u2014 they link the commit to the board task.",
|
|
135748
|
-
"
|
|
135886
|
+
" 5. Verify `git log --oneline ${tip}..HEAD` shows exactly one new commit and `git status` is clean.".replace("${tip}", short(input.tipSha)),
|
|
135749
135887
|
"",
|
|
135750
135888
|
"If `git merge --squash` reports the branch is already up to date (nothing to",
|
|
135751
135889
|
"merge), do nothing and leave HEAD unchanged."
|
|
@@ -142209,6 +142347,7 @@ __export(src_exports2, {
|
|
|
142209
142347
|
BranchConflictError: () => BranchConflictError,
|
|
142210
142348
|
BranchCrossContaminationError: () => BranchCrossContaminationError,
|
|
142211
142349
|
CronRunner: () => CronRunner,
|
|
142350
|
+
DEFAULT_GOAL_INJECTION_CHAR_BUDGET: () => DEFAULT_GOAL_INJECTION_CHAR_BUDGET,
|
|
142212
142351
|
DEFAULT_NTFY_EVENTS: () => DEFAULT_NTFY_EVENTS,
|
|
142213
142352
|
DiffVolumeRegressionError: () => DiffVolumeRegressionError,
|
|
142214
142353
|
EngineAlreadyRunningError: () => EngineAlreadyRunningError,
|
|
@@ -142233,6 +142372,7 @@ __export(src_exports2, {
|
|
|
142233
142372
|
KNOWN_EXTERNAL_INTEGRATIONS: () => KNOWN_EXTERNAL_INTEGRATIONS,
|
|
142234
142373
|
LLMSynthesisProvider: () => LLMSynthesisProvider,
|
|
142235
142374
|
LocalDocsProvider: () => LocalDocsProvider,
|
|
142375
|
+
MAX_INJECTED_GOALS: () => MAX_INJECTED_GOALS,
|
|
142236
142376
|
MOCK_PROVIDER_ID: () => MOCK_PROVIDER_ID3,
|
|
142237
142377
|
MOCK_SYNTHETIC_TOKEN_USAGE: () => MOCK_SYNTHETIC_TOKEN_USAGE,
|
|
142238
142378
|
MergeAbortedError: () => MergeAbortedError,
|
|
@@ -142308,6 +142448,7 @@ __export(src_exports2, {
|
|
|
142308
142448
|
assertSafeUrl: () => assertSafeUrl,
|
|
142309
142449
|
auditSquashMerge: () => auditSquashMerge,
|
|
142310
142450
|
buildAgentChatPrompt: () => buildAgentChatPrompt,
|
|
142451
|
+
buildGoalContextSection: () => buildGoalContextSection,
|
|
142311
142452
|
buildNtfyClickUrl: () => buildNtfyClickUrl,
|
|
142312
142453
|
buildRuntimeResolutionContext: () => buildRuntimeResolutionContext,
|
|
142313
142454
|
buildSystemPromptWithInstructions: () => buildSystemPromptWithInstructions,
|
|
@@ -142450,6 +142591,7 @@ var init_src2 = __esm({
|
|
|
142450
142591
|
init_external_integrations();
|
|
142451
142592
|
init_web_fetch();
|
|
142452
142593
|
init_error_classifier();
|
|
142594
|
+
init_goal_context_injector();
|
|
142453
142595
|
init_worktrunk_installer();
|
|
142454
142596
|
init_worktrunk_failure_handler();
|
|
142455
142597
|
init_usage_limit_detector();
|
|
@@ -216023,6 +216165,9 @@ function createMissionRouter(store, missionAutopilot, aiSessionStore, missionExe
|
|
|
216023
216165
|
}
|
|
216024
216166
|
if (Object.keys(updates).length > 0) {
|
|
216025
216167
|
const updatedMission = missionStore.updateMission(mission.id, updates);
|
|
216168
|
+
if (missionAutopilot && updatedMission.autopilotEnabled) {
|
|
216169
|
+
missionAutopilot.watchMission(updatedMission.id);
|
|
216170
|
+
}
|
|
216026
216171
|
res.status(201).json(updatedMission);
|
|
216027
216172
|
return;
|
|
216028
216173
|
}
|
|
@@ -216445,7 +216590,11 @@ function createMissionRouter(store, missionAutopilot, aiSessionStore, missionExe
|
|
|
216445
216590
|
throw badRequest("No valid fields to update");
|
|
216446
216591
|
}
|
|
216447
216592
|
try {
|
|
216593
|
+
const existingMission = missionStore.getMission(missionId);
|
|
216448
216594
|
const mission = missionStore.updateMission(missionId, updates);
|
|
216595
|
+
if (missionAutopilot && updates.autopilotEnabled === true && existingMission?.autopilotEnabled !== true) {
|
|
216596
|
+
missionAutopilot.watchMission(missionId);
|
|
216597
|
+
}
|
|
216449
216598
|
res.json(mission);
|
|
216450
216599
|
} catch (err) {
|
|
216451
216600
|
const errMsg = err instanceof Error ? err.message : String(err);
|