@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.
Files changed (54) hide show
  1. package/dist/bin.js +164 -15
  2. package/dist/client/.vite/manifest.json +61 -61
  3. package/dist/client/assets/{AgentDetailView-CGycokdR.js → AgentDetailView-T_AHPxcG.js} +1 -1
  4. package/dist/client/assets/{AgentPermissionPolicyEditor-BoD6come.js → AgentPermissionPolicyEditor-niLSqGAE.js} +1 -1
  5. package/dist/client/assets/{AgentsView-B_afRRfc.js → AgentsView-CQhaLHz_.js} +3 -3
  6. package/dist/client/assets/{ChatView-IjNrSZSf.js → ChatView-B60kYfdk.js} +1 -1
  7. package/dist/client/assets/{DevServerView-Dd613aZ5.js → DevServerView-0Gb44WOb.js} +1 -1
  8. package/dist/client/assets/{DirectoryPicker-H-fUl2dF.js → DirectoryPicker-BSQA0XM9.js} +1 -1
  9. package/dist/client/assets/{DocumentsView-Dshc9e5K.js → DocumentsView-XZbaqEFF.js} +1 -1
  10. package/dist/client/assets/{EvalsView-50W0K5h7.js → EvalsView-CJNtXxX9.js} +1 -1
  11. package/dist/client/assets/{ExperimentalAgentOnboardingModal-BXBljPFj.js → ExperimentalAgentOnboardingModal-DR8E3i36.js} +1 -1
  12. package/dist/client/assets/GoalsView-CN1zQ_Ax.js +1 -0
  13. package/dist/client/assets/GoalsView-CtWi0fxE.css +1 -0
  14. package/dist/client/assets/{InsightsView-sVbGRKTl.js → InsightsView-D_jRaMyn.js} +1 -1
  15. package/dist/client/assets/{MemoryView-006a_sB0.js → MemoryView-D90vdPnp.js} +1 -1
  16. package/dist/client/assets/{NodesView-CiRPqgVx.js → NodesView-C1zuedAe.js} +1 -1
  17. package/dist/client/assets/{PiExtensionsManager-Y1ETuTxf.js → PiExtensionsManager-DBJDDVfM.js} +1 -1
  18. package/dist/client/assets/{PluginManager-Df_KHiXn.js → PluginManager-Ceg64P2Z.js} +1 -1
  19. package/dist/client/assets/{ResearchView-DU_QuS_-.js → ResearchView-XRwWdczc.js} +1 -1
  20. package/dist/client/assets/{SecretsView-D61Jvysn.js → SecretsView-TCrKyCme.js} +1 -1
  21. package/dist/client/assets/{SettingsModal-Cpur3WpT.js → SettingsModal-B8fRuWdQ.js} +3 -3
  22. package/dist/client/assets/{SettingsModal-BarzmqNb.js → SettingsModal-C1TczsEr.js} +1 -1
  23. package/dist/client/assets/{SetupWizardModal-BF3iRNq9.js → SetupWizardModal-D6moSTT3.js} +1 -1
  24. package/dist/client/assets/{SkillsView-tCKOFw3j.js → SkillsView-BDHLPVBi.js} +1 -1
  25. package/dist/client/assets/{StashRecoveryView-nGtypd10.js → StashRecoveryView-DZGa591R.js} +1 -1
  26. package/dist/client/assets/{TodoView-IyGPV6AO.js → TodoView-nr_SnCJv.js} +1 -1
  27. package/dist/client/assets/{dashboard-view-DiA5-hnb.js → dashboard-view-0XeZ1FTR.js} +1 -1
  28. package/dist/client/assets/{folder-open-Byqfi_N-.js → folder-open-iURwQbEg.js} +1 -1
  29. package/dist/client/assets/{index-B9Ro_NwC.js → index-CjuQj4qe.js} +14 -14
  30. package/dist/client/assets/index-DmrpDn7c.css +1 -0
  31. package/dist/client/assets/{upload-D6_BjqVi.js → upload-Beqg4S4L.js} +1 -1
  32. package/dist/client/assets/{users-CERYgInO.js → users-C2o86ZCR.js} +1 -1
  33. package/dist/client/index.html +2 -2
  34. package/dist/client/version.json +1 -1
  35. package/dist/droid-cli/package.json +1 -1
  36. package/dist/extension.js +195 -15
  37. package/dist/pi-claude-cli/package.json +1 -1
  38. package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
  39. package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
  40. package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
  41. package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
  42. package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
  43. package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
  44. package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
  45. package/dist/plugins/fusion-plugin-reports/package.json +1 -1
  46. package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
  47. package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
  48. package/package.json +1 -1
  49. package/skill/fusion/SKILL.md +1 -1
  50. package/skill/fusion/references/extension-tools.md +16 -0
  51. package/skill/fusion/references/fusion-capabilities.md +1 -0
  52. package/dist/client/assets/GoalsView-Cg136Jcn.css +0 -1
  53. package/dist/client/assets/GoalsView-Dh508Z2s.js +0 -1
  54. 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: void 0,
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.processTaskOutcome(feature.taskId);
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.processTaskOutcome(feature.taskId);
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
- await missionAutopilot.handleTaskCompletion(feature.taskId);
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. Commit the staged result as a SINGLE commit whose subject summarizes the",
135745
- ` actual changes${input.taskTitle ? ` (task title hint: ${JSON.stringify(input.taskTitle)})` : ""}, including the required trailers:`,
135746
- ` git commit -m ${subjectShape}${trailerArgs}`,
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
- " 4. Verify `git log --oneline ${tip}..HEAD` shows exactly one new commit and `git status` is clean.".replace("${tip}", short(input.tipSha)),
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);