glimmervoid 0.42.1 → 0.42.3

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 (25) hide show
  1. package/README.md +2 -2
  2. package/dist/bin/glimmervoid.js +8 -8
  3. package/dist/chunks/{adapters-CWIHOfVo.js → adapters-Bga1N6Ie.js} +2 -2
  4. package/dist/chunks/{adapters-DzClvFt5.js → adapters-DeqV4wUv.js} +1 -1
  5. package/dist/chunks/{agent-api-cli-Cn-g_ej_.js → agent-api-cli-DWVeqlLu.js} +1 -1
  6. package/dist/chunks/{agent-api-cli-2FKWf5jj.js → agent-api-cli-YvQ8WxHA.js} +1 -1
  7. package/dist/chunks/{agent-api-core-CP4J2B39.js → agent-api-core-DFYLP1bF.js} +1 -1
  8. package/dist/chunks/config-store-CGrS8s6x.js +1 -0
  9. package/dist/chunks/{config-store-Br2PY4Tg.js → config-store-DOGtTJ1d.js} +2 -69
  10. package/dist/chunks/{contracts-DJqeCtR3.js → contracts-Ds_eevZs.js} +2 -12
  11. package/dist/chunks/{control-messages-DHDEMTLI.js → control-messages-Dgap3JRR.js} +1 -44
  12. package/dist/chunks/{main-ZpBLKI1h.js → main-DOZJniDn.js} +44 -456
  13. package/dist/chunks/{pair-cli-DW5mUBZa.js → pair-cli-PCXITdEd.js} +2 -2
  14. package/dist/chunks/{remote-config-DcmhRuRc.js → remote-config-DeWURqqr.js} +1 -1
  15. package/dist/chunks/{settings-cli-BnM9rg8B.js → settings-cli-xpR7vk9L.js} +4 -4
  16. package/dist/chunks/{settings-readout-core-2XunjdBA.js → settings-readout-core-C2mOk9Yz.js} +1 -1
  17. package/dist/chunks/{ssh-sign-cli-CmnA5lFM.js → ssh-sign-cli-rKiqiNem.js} +1 -1
  18. package/dist/client/assets/index-CuuOi3Bp.js +177 -0
  19. package/dist/client/assets/index-NhAGtpDY.css +2 -0
  20. package/dist/client/index.html +2 -3
  21. package/dist/server/index.js +1 -1
  22. package/package.json +2 -2
  23. package/dist/chunks/config-store-DwYjz6h1.js +0 -1
  24. package/dist/client/assets/index-CBGmkbVV.js +0 -176
  25. package/dist/client/assets/index-NhlaT6eP.css +0 -2
@@ -4,9 +4,9 @@ import { a as sanitizeWorktreeName, i as safePathSegment, n as equalsIgnoringCas
4
4
  import { a as packageRoot, n as cliPath, o as relayPath, r as clientDir, s as resolvePackageBin, t as bundled } from "./runtime-paths-BkeftE60.js";
5
5
  import { $t as STATES, A as SIGN_URL_ENV, At as TeamReviewStatus, B as LinkedPr, Bt as shortSha, Ct as ReviewThreadId, Dt as TeamReviewCompareFiles, E as SESSION_DOC_BODY_CAP_BYTES, Ft as decisionAsIfApprovalRequired, G as MyPrKeepMergeableRequest, H as MyPrAutoRebase, Ht as NODE_ID_RE, I as SshSignRequest, J as MyPrMergeMethod, L as TASK_TITLE_CONTROL_CHARACTERS, Lt as hasStandingViewerApproval, Mt as TeamReviewThreadResult, Nt as TeamReviewThreadsRepository, O as SESSION_NAME_PATTERN, Ot as TeamReviewResolveResponse, Pt as canApproveAfterComment, Q as MyPrMergeWhenReadyRequest, Qt as RESTARTABLE_STATES, R as TaskTitle, S as ConversationQuestion, St as ReviewResult, Tt as TeamReviewActionRequest, U as MyPrCheckContext, Ut as REPO_SLUG_RE, V as MyPr, Vt as GH_SEGMENT, W as MyPrCheckContextsResponse, Wt as repoParts, Xt as KILLABLE_STATES, Y as MyPrMergeRequest, Yt as BADGE_LABELS, Z as MyPrMergeStateResponse, Zt as MERGEABLE_LIVE_STATES, _ as CONVERSATION_TOOL_RESULT_HOOK_EVENT, _t as QueuedReview, bt as ReviewDraft, dt as EarlierReview, ft as FindingSeverity, g as CONVERSATION_PERMISSION_HOOK_EVENT, gt as PrDetail, h as CONVERSATION_APPROVAL_SUMMARY_MAX_CHARS, ht as PostingPlan, it as MyPrsState, j as SSH_SIGN_BODY_CAP_BYTES, jt as TeamReviewThreadCommentsResponse, k as SESSION_NAME_RULE_TEXT, kt as TeamReviewStateEntry, lt as CommitSha, m as COHERENCE_HOOKS_INACTIVE, mt as GithubReviewState, n as AGENT_URL_ENV, nt as MyPrThreadsResponse, q as MyPrLaneEntry, r as ASK_USER_QUESTION_TOOL_NAME, rt as MyPrsSnapshot, tt as MyPrThreadNode, ut as DECIDING_REVIEW_STATES, w as RefinedTaskTitle, wt as ReviewVerdict, xt as ReviewFinding, yt as ReviewComment, zt as HEX_SHA_RE } from "./session-3eSP3t1i.js";
6
6
  import { n as execFileAsync, o as spawn, r as execFileSync, t as execFile } from "./child-process-safe-D4hyVIXj.js";
7
- import { At as planTitle, C as GithubPrsFrame, Ct as PLAN_HOOK_EVENT, D as WorkflowsSettings, Dt as PlanDecision, E as WorkflowLabelName, Et as PLAN_TOOL_NAME, Ft as IssuesSearchResponse, It as IssuesState, L as KEEP_MERGEABLE_TIMEOUT_MINUTES_RANGE, Lt as IssuesStatus, Mt as GithubIssueResponse, Nt as IssueKey, Ot as PlanRevision, Pt as IssueUpdate, Rt as issuePullRequestStateFromGithub, S as GithubPrLightSearchNode, St as PLAN_BODY_CAP_BYTES, T as WorkflowCommentBody, Tt as PLAN_RESULT_HOOK_EVENT, _ as MergedPrListing, _t as TraceCheckpoint, b as GithubPrDetailNode, bt as ChangeMap, c as pullRequestKeyFromReference, d as BenchmarkId, f as BenchmarkJudgement, g as CommitComparison, gt as MAX_RAW_LINE_CHARS, h as BenchmarkSuite, ht as SessionSetup, i as DIFF_ANNOTATION_NOTE_MAX_CHARS, jt as GithubIssuePullRequestsRepository, k as WorkflowsState, kt as parseExitPlanModeHookPayload, l as BenchmarkActionRequest, m as BenchmarkStatus, mt as UpdateJournal, n as ClientMessage, p as BenchmarkRun, rt as USAGE_INTEGER_RANGES, t as CONTROL_FRAME_MAX_BYTES, u as BenchmarkCase, v as MinedPrReviewData, vt as TraceRecord, w as comparablePrKey, wt as PLAN_HOOK_OUTPUT_MAX_CHARS, x as GithubPrKey, xt as changeMapFactId, y as PrCheckoutCaseInput, yt as CoherenceJournalOutput } from "./control-messages-DHDEMTLI.js";
7
+ import { At as GithubIssueResponse, C as comparablePrKey, Ct as PLAN_RESULT_HOOK_EVENT, Dt as parseExitPlanModeHookPayload, E as WorkflowsSettings, Et as PlanRevision, F as KEEP_MERGEABLE_TIMEOUT_MINUTES_RANGE, Ft as IssuesStatus, It as issuePullRequestStateFromGithub, Mt as IssueUpdate, Nt as IssuesSearchResponse, O as WorkflowsState, Ot as planTitle, Pt as IssuesState, S as GithubPrsFrame, St as PLAN_HOOK_OUTPUT_MAX_CHARS, T as WorkflowLabelName, Tt as PlanDecision, _ as MinedPrReviewData, _t as CoherenceJournalOutput, b as GithubPrKey, bt as PLAN_BODY_CAP_BYTES, c as BenchmarkActionRequest, d as BenchmarkJudgement, f as BenchmarkRun, ft as UpdateJournal, g as MergedPrListing, gt as TraceRecord, h as CommitComparison, ht as TraceCheckpoint, jt as IssueKey, kt as GithubIssuePullRequestsRepository, l as BenchmarkCase, m as BenchmarkSuite, mt as MAX_RAW_LINE_CHARS, n as ClientMessage, p as BenchmarkStatus, pt as SessionSetup, s as pullRequestKeyFromReference, t as CONTROL_FRAME_MAX_BYTES, tt as USAGE_INTEGER_RANGES, u as BenchmarkId, v as PrCheckoutCaseInput, vt as ChangeMap, w as WorkflowCommentBody, wt as PLAN_TOOL_NAME, x as GithubPrLightSearchNode, xt as PLAN_HOOK_EVENT, y as GithubPrDetailNode, yt as changeMapFactId } from "./control-messages-Dgap3JRR.js";
8
8
  import { a as permitsHelpCommand, r as describeSessionLimits } from "./session-routes-B2oSzmQn.js";
9
- import { a as decideSpawnAllowance, c as describeKeptChildAttention, d as describeUnpushedCloseRefusal, h as projectReviews, i as decideAgentRequest, l as describePushLanding, m as projectMyPrs, n as REFUSAL_REASON, o as deriveChildSessionName, p as parseAgentVerb, s as describeChildEndNote, u as describeRoleRefusal } from "./agent-api-core-CP4J2B39.js";
9
+ import { a as decideSpawnAllowance, c as describeKeptChildAttention, d as describeUnpushedCloseRefusal, h as projectReviews, i as decideAgentRequest, l as describePushLanding, m as projectMyPrs, n as REFUSAL_REASON, o as deriveChildSessionName, p as parseAgentVerb, s as describeChildEndNote, u as describeRoleRefusal } from "./agent-api-core-DFYLP1bF.js";
10
10
  import { n as glimmervoidHomeDir, t as decideConfigPath } from "./config-path-core-DFt-TemS.js";
11
11
  import { i as parseCommandLine, n as warnWhenGitIsTooOld } from "./git-version-DqagvnAZ.js";
12
12
  import { n as checkGuardrailsDependencies, t as allowGuardedSpawn } from "./guardrails-deps-BjPzk1rE.js";
@@ -21,13 +21,13 @@ import { n as DEFAULT_MAX_MS, r as nextBackoffMs, t as DEFAULT_BASE_MS } from ".
21
21
  import { n as unrefTimer, t as DEFAULT_TIMER_FNS } from "./timer-deps-u2DAQLok.js";
22
22
  import { n as shellQuote } from "./hook-command-core-qTNK-xMF.js";
23
23
  import { C as parseCgroupBytes, S as memoryReserveBytes, T as parseMemAvailableBytes, _ as createSpawnGate, a as jsonStateLoadError, b as cgroupLimitBytes, c as loadedJsonValue, d as writeJsonAtomicSync, f as writeTextAtomic, g as createSerialQueue, h as createMemoryAdmission, i as createJsonStateWriter, m as createKeyedSerialQueue, n as appendJsonLines, o as loadJsonStateFile, p as writeTextAtomicSync, r as createJsonStateStore, s as loadJsonStateFileSync, t as appendJsonLine, u as writeJsonAtomic, v as isQueueAdmissionTimeout, w as parseCgroupV2Path, x as headroomFromReadings, y as cgroupAncestorPaths } from "./json-file-DFCTvPjj.js";
24
- import { $ as DEFAULT_BRANCH_GC_PREFIXES, B as buildExceptionProperties, F as TELEMETRY_BATCH_URL, G as exceptionFingerprint, H as decideIsDevInstall, I as TELEMETRY_FLAGS_URL, J as resolveProjectToken, K as nodeMajorVersion, L as adapterBucket, P as FIRST_RUN_NOTICE, R as buildAiGenerationEvents, U as decideRemoteTelemetryState, V as classifySessionExit, W as decideTelemetryConsent, Z as stableConfigKey, a as generateProjectId, at as worktreeIntegrationTips, b as validateSettingsBlock, ct as isSameDirectoryPath, d as assetForPlatform, et as matchedPrefix, f as decideRtkInstall, g as verifyDigest, h as isRtkBinaryName, i as ensureProjectIds, it as usablePrefixes, m as installTargetPath, n as DEFAULT_CONFIG, nt as planWorktreeGc, o as glimmervoidHomeDir$1, ot as canonicalizePath, p as findEscapingArchiveMember, q as parsePosthogReleaseId, r as createConfigStore, rt as sessionIdFromBranch, st as comparableDirectoryPath, t as ABORT_CONFIG_SAVE, tt as planBranchGc, v as mergeSettingsBlock, y as settingsBlockSpecFor, z as buildBrowserExceptionProperties } from "./config-store-Br2PY4Tg.js";
25
- import { E as USAGE_VENDOR_KEYS, T as USAGE_COST_MODES, _ as PersistedTaskTitle, a as parseDataClientMessage, b as configIssueMessage, c as PendingCrashReport, d as TelemetryState, g as ConfigUpdate, i as parseDataAttachHistory, l as TELEMETRY_EVENT_SCHEMAS, m as BrowserConfig, n as HookEnvelope, o as DashboardTelemetryReport, r as DEEP_HISTORY_SCROLLBACK_LINES, t as HTTP_URL_RE, v as RUNTIME_CONFIG_SCALAR_KEYS, y as TASK_TITLE_SOURCE_PRIORITY } from "./contracts-DJqeCtR3.js";
26
- import { A as dedupeCodexFiles, B as shouldPersistWarehouse, C as shortSha$1, D as codexSessionIdFromPath, E as codexRootCandidates, F as passOutcome, H as claudeCode, I as projectDirCandidates, L as resolveProjectsDirs, M as grokHomes, N as grokRootCandidates, O as continuationDelayMs, P as isUsageFile, R as scopedClaudeRoots, S as parseResolvedSha, T as codexHomes, V as splitLines$1, _ as isCheckFresh, a as describeAgentResolvability, b as parseRegistryDeprecation, c as isKnownAgentId, d as resolveAdapter, f as setCustomAgents, g as decideUpdateStatus, h as decideInstallFlavor, i as customAgentFingerprint, j as expandTilde, k as decideFileRead, l as listAgentIds, m as readHostCodexVersion, n as cachedAgentResolvability, o as getAdapter, p as codex, r as commandFor, s as hookProfileOf, t as DEFAULT_AGENT_ID, u as resetCommandCache, v as normalizeSha, w as codexFallbackRoots, x as parseRegistryLatest, y as normalizeUpdateChannel, z as shouldEvaluateDespiteIoFailures } from "./adapters-CWIHOfVo.js";
24
+ import { $ as DEFAULT_BRANCH_GC_PREFIXES, B as buildExceptionProperties, F as TELEMETRY_BATCH_URL, G as exceptionFingerprint, H as decideIsDevInstall, I as TELEMETRY_FLAGS_URL, J as resolveProjectToken, K as nodeMajorVersion, L as adapterBucket, P as FIRST_RUN_NOTICE, R as buildAiGenerationEvents, U as decideRemoteTelemetryState, V as classifySessionExit, W as decideTelemetryConsent, Z as stableConfigKey, a as generateProjectId, at as worktreeIntegrationTips, b as validateSettingsBlock, ct as isSameDirectoryPath, d as assetForPlatform, et as matchedPrefix, f as decideRtkInstall, g as verifyDigest, h as isRtkBinaryName, i as ensureProjectIds, it as usablePrefixes, m as installTargetPath, n as DEFAULT_CONFIG, nt as planWorktreeGc, o as glimmervoidHomeDir$1, ot as canonicalizePath, p as findEscapingArchiveMember, q as parsePosthogReleaseId, r as createConfigStore, rt as sessionIdFromBranch, st as comparableDirectoryPath, t as ABORT_CONFIG_SAVE, tt as planBranchGc, v as mergeSettingsBlock, y as settingsBlockSpecFor, z as buildBrowserExceptionProperties } from "./config-store-DOGtTJ1d.js";
25
+ import { T as USAGE_VENDOR_KEYS, _ as PersistedTaskTitle, a as parseDataClientMessage, b as configIssueMessage, c as PendingCrashReport, d as TelemetryState, g as ConfigUpdate, i as parseDataAttachHistory, l as TELEMETRY_EVENT_SCHEMAS, m as BrowserConfig, n as HookEnvelope, o as DashboardTelemetryReport, r as DEEP_HISTORY_SCROLLBACK_LINES, t as HTTP_URL_RE, v as RUNTIME_CONFIG_SCALAR_KEYS, w as USAGE_COST_MODES, y as TASK_TITLE_SOURCE_PRIORITY } from "./contracts-Ds_eevZs.js";
26
+ import { A as dedupeCodexFiles, B as shouldPersistWarehouse, C as shortSha$1, D as codexSessionIdFromPath, E as codexRootCandidates, F as passOutcome, H as claudeCode, I as projectDirCandidates, L as resolveProjectsDirs, M as grokHomes, N as grokRootCandidates, O as continuationDelayMs, P as isUsageFile, R as scopedClaudeRoots, S as parseResolvedSha, T as codexHomes, V as splitLines$1, _ as isCheckFresh, a as describeAgentResolvability, b as parseRegistryDeprecation, c as isKnownAgentId, d as resolveAdapter, f as setCustomAgents, g as decideUpdateStatus, h as decideInstallFlavor, i as customAgentFingerprint, j as expandTilde, k as decideFileRead, l as listAgentIds, m as readHostCodexVersion, n as cachedAgentResolvability, o as getAdapter, p as codex, r as commandFor, s as hookProfileOf, t as DEFAULT_AGENT_ID, u as resetCommandCache, v as normalizeSha, w as codexFallbackRoots, x as parseRegistryLatest, y as normalizeUpdateChannel, z as shouldEvaluateDespiteIoFailures } from "./adapters-Bga1N6Ie.js";
27
27
  import { t as HOOK_TOOLS } from "./hook-tools-Dl7-r2Eb.js";
28
28
  import { a as formatSshPublicKey, c as orderAgentSockets, i as commitSigningShimText, l as parseSshPublicKey, n as NO_AGENT_HOLDS_KEY, o as isForwardedAgentDirName, r as agentListsKey, s as isSignableGitObject, t as COMMIT_SIGNING_SHIM_NAME } from "./ssh-signing-core-CRhVVWNW.js";
29
- import { a as configSiblingPath, c as defaultPairingsPath, d as decideDeviceAuth, f as deviceNameFromUserAgent, l as defaultSeenPath, n as normalizeRemoteConfig, o as createPairingsStore, p as hashSecret, r as validateRemoteConfig, s as createSeenStore, t as decideBindHost, u as DEFAULT_DEVICE_MAX_AGE_MS } from "./remote-config-DcmhRuRc.js";
30
- import { n as configFileViewOf, u as readSettingsForAgent } from "./settings-readout-core-2XunjdBA.js";
29
+ import { a as configSiblingPath, c as defaultPairingsPath, d as decideDeviceAuth, f as deviceNameFromUserAgent, l as defaultSeenPath, n as normalizeRemoteConfig, o as createPairingsStore, p as hashSecret, r as validateRemoteConfig, s as createSeenStore, t as decideBindHost, u as DEFAULT_DEVICE_MAX_AGE_MS } from "./remote-config-DeWURqqr.js";
30
+ import { n as configFileViewOf, u as readSettingsForAgent } from "./settings-readout-core-C2mOk9Yz.js";
31
31
  import { _ as escapeMarkup, g as createLaneLog, n as createVisionsSetup } from "./visions-setup-DB2P8JUL.js";
32
32
  import { t as getRtkPath } from "./rtk-resolver-BDHi6RMv.js";
33
33
  import { createRequire } from "node:module";
@@ -3874,7 +3874,6 @@ function createBackendShutdown(dependencies) {
3874
3874
  stoppers.add("telegram-outbox", () => dependencies.telegramOutbox.idle());
3875
3875
  destroySessions([
3876
3876
  dependencies.visionsSessions,
3877
- dependencies.changeMapSessions,
3878
3877
  dependencies.taskTitleSessions ?? /* @__PURE__ */ new Map(),
3879
3878
  dependencies.benchmarkSessions ?? /* @__PURE__ */ new Map()
3880
3879
  ], pendingReaps);
@@ -17243,7 +17242,7 @@ function createSessionWorktreeLifecycle({ id, projectPath, integrationBranch = n
17243
17242
  "--quiet",
17244
17243
  candidate
17245
17244
  ], opts) !== null) return {
17246
- ref: candidate,
17245
+ ref: await freshestBaseRef(candidate, opts),
17247
17246
  verified: true
17248
17247
  };
17249
17248
  return {
@@ -17251,6 +17250,23 @@ function createSessionWorktreeLifecycle({ id, projectPath, integrationBranch = n
17251
17250
  verified: false
17252
17251
  };
17253
17252
  }
17253
+ async function freshestBaseRef(baseBranch, opts) {
17254
+ const localRef = `refs/heads/${baseBranch}`;
17255
+ const originRef = `refs/remotes/origin/${baseBranch}`;
17256
+ const existingRefs = (await gitOut([
17257
+ "for-each-ref",
17258
+ "--format=%(refname)",
17259
+ localRef,
17260
+ originRef
17261
+ ], opts)).split("\n");
17262
+ if (!existingRefs.includes(localRef) || !existingRefs.includes(originRef)) return baseBranch;
17263
+ return await gitLookup([
17264
+ "merge-base",
17265
+ "--is-ancestor",
17266
+ localRef,
17267
+ originRef
17268
+ ], opts) !== null ? `origin/${baseBranch}` : baseBranch;
17269
+ }
17254
17270
  function diffGitOptions(cwd) {
17255
17271
  return {
17256
17272
  cwd,
@@ -17319,7 +17335,7 @@ function createSessionWorktreeLifecycle({ id, projectPath, integrationBranch = n
17319
17335
  async function memberMergeBase(member) {
17320
17336
  const opts = diffGitOptions(member.dir);
17321
17337
  const candidates = member.base ? [
17322
- member.base,
17338
+ await freshestBaseRef(member.base, opts),
17323
17339
  `origin/${member.base}`,
17324
17340
  "origin/HEAD"
17325
17341
  ] : ["origin/HEAD"];
@@ -34791,319 +34807,6 @@ function createIngestLane({ config = null, broadcast = null, logger = console, l
34791
34807
  };
34792
34808
  }
34793
34809
  //#endregion
34794
- //#region server/change-map/core/change-narrative-core.ts
34795
- var FACT_GROUPS = [
34796
- "files",
34797
- "subsystems",
34798
- "coChangeGaps",
34799
- "hotspots",
34800
- "blastRadius",
34801
- "untestedFiles",
34802
- "collisions",
34803
- "links"
34804
- ];
34805
- function narrativeFacts(map) {
34806
- return { repos: map.repos.map((repo) => ({
34807
- name: repo.name,
34808
- base: repo.base,
34809
- totalCounts: Object.fromEntries(FACT_GROUPS.map((group) => [group, repo[group].length])),
34810
- files: capFacts(repo.files, compareFactIds),
34811
- subsystems: capFacts(repo.subsystems, compareFactIds).map(capSubsystemPaths),
34812
- coChangeGaps: capFacts(repo.coChangeGaps, compareFactIds),
34813
- hotspots: capFacts(repo.hotspots, compareFactIds),
34814
- blastRadius: capFacts(repo.blastRadius, compareBlastRadius),
34815
- untestedFiles: capFacts(repo.untestedFiles, compareFactIds),
34816
- collisions: capFacts(repo.collisions, compareFactIds),
34817
- links: capFacts(repo.links, compareLinks)
34818
- })).sort((left, right) => left.name.localeCompare(right.name)) };
34819
- }
34820
- function capFacts(facts, compare) {
34821
- return [...facts].sort(compare).slice(0, 20);
34822
- }
34823
- function capSubsystemPaths(subsystem) {
34824
- return {
34825
- ...subsystem,
34826
- paths: subsystem.paths.slice(0, 20),
34827
- pathCount: subsystem.paths.length
34828
- };
34829
- }
34830
- function compareFactIds(left, right) {
34831
- return left.factId.localeCompare(right.factId);
34832
- }
34833
- function compareBlastRadius(left, right) {
34834
- return right.transitiveDependentCount - left.transitiveDependentCount || compareFactIds(left, right);
34835
- }
34836
- function compareLinks(left, right) {
34837
- return right.changedImporterCount - left.changedImporterCount || right.importerCount - left.importerCount || compareFactIds(left, right);
34838
- }
34839
- function factsHashInput(map) {
34840
- return JSON.stringify(narrativeFacts(map), (_key, value) => {
34841
- if (!value || typeof value !== "object" || Array.isArray(value)) return value;
34842
- return Object.fromEntries(Object.entries(value).sort(([left], [right]) => {
34843
- if (left < right) return -1;
34844
- if (left > right) return 1;
34845
- return 0;
34846
- }));
34847
- });
34848
- }
34849
- function hasNarratableFacts(map) {
34850
- return map.repos.some((repo) => repo.files.length > 0);
34851
- }
34852
- function knownNarrativeFactIds(map) {
34853
- const knownFactIds = /* @__PURE__ */ new Set();
34854
- for (const repo of narrativeFacts(map).repos) for (const group of FACT_GROUPS) for (const fact of repo[group]) knownFactIds.add(fact.factId);
34855
- return knownFactIds;
34856
- }
34857
- function buildNarrativePrompt({ facts, resultPath }) {
34858
- const deliveryLines = resultPath ? ["Use no tools except Write to the exact result file path below.", "Write"] : ["Answer with the JSON as your final message and write no files.", "Return"];
34859
- return [
34860
- "The facts below are your only source of truth. Read nothing else.",
34861
- deliveryLines[0],
34862
- `${deliveryLines[1]} JSON { "claims": [{ "text": string, "factIds": string[] }] } with at most 12 claims.`,
34863
- "Each claim must be one or two plain-English sentences about how a change connects to the codebase or what risk it carries.",
34864
- "Every claim must cite one or more factIds copied exactly from the facts. Do not invent facts or identifiers.",
34865
- "When links are present, lead with how a change in one repository reaches another through them.",
34866
- `Each fact list and subsystem path list holds at most 20 entries; totalCounts and pathCount give the full sizes.`,
34867
- `Keep each claim within 600 characters.`,
34868
- ...resultPath ? [`Result file: ${resultPath}`] : [],
34869
- `Facts JSON: ${JSON.stringify(facts)}`
34870
- ].join("\n");
34871
- }
34872
- function validateNarrative({ raw, knownFactIds, factsHash, model }) {
34873
- if (!raw || typeof raw !== "object" || Array.isArray(raw)) return null;
34874
- const offeredClaims = "claims" in raw ? raw.claims : null;
34875
- if (!Array.isArray(offeredClaims)) return null;
34876
- const claims = [];
34877
- for (const offeredClaim of offeredClaims) {
34878
- if (!offeredClaim || typeof offeredClaim !== "object" || Array.isArray(offeredClaim)) continue;
34879
- const text = "text" in offeredClaim ? offeredClaim.text : null;
34880
- const factIds = "factIds" in offeredClaim ? offeredClaim.factIds : null;
34881
- if (typeof text !== "string" || text.length > 600) continue;
34882
- if (!Array.isArray(factIds)) continue;
34883
- const cleanText = text.replaceAll(String.fromCharCode(8212), "-").replaceAll(String.fromCharCode(8211), "-").replaceAll(String.fromCharCode(8230), "...").trim();
34884
- if (!cleanText || cleanText.length > 600) continue;
34885
- const citedFactIds = [...new Set(factIds.filter((factId) => typeof factId === "string" && knownFactIds.has(factId)))];
34886
- if (citedFactIds.length === 0) continue;
34887
- claims.push({
34888
- text: cleanText,
34889
- factIds: citedFactIds
34890
- });
34891
- if (claims.length >= 12) break;
34892
- }
34893
- if (claims.length === 0) return null;
34894
- return {
34895
- factsHash,
34896
- model,
34897
- claims
34898
- };
34899
- }
34900
- //#endregion
34901
- //#region server/change-map/change-narrator.ts
34902
- var MAX_CACHED_HASHES = 64;
34903
- var PROMPT_FILE$2 = "change-narrative-prompt.txt";
34904
- var RESULT_FILE$2 = "change-narrative-result.json";
34905
- var SCHEMA_FILE = "change-narrative-schema.json";
34906
- var BOOTSTRAP_PROMPT$1 = `Read ${PROMPT_FILE$2} and follow its instructions`;
34907
- var CODEX_BOOTSTRAP_PROMPT = `Read ${PROMPT_FILE$2} in your cwd and answer only with the JSON`;
34908
- var CODEX_OUTPUT_SCHEMA = {
34909
- type: "object",
34910
- additionalProperties: false,
34911
- required: ["claims"],
34912
- properties: { claims: {
34913
- type: "array",
34914
- maxItems: 12,
34915
- items: {
34916
- type: "object",
34917
- additionalProperties: false,
34918
- required: ["text", "factIds"],
34919
- properties: {
34920
- text: { type: "string" },
34921
- factIds: {
34922
- type: "array",
34923
- items: { type: "string" }
34924
- }
34925
- }
34926
- }
34927
- } }
34928
- };
34929
- async function codexLaunch(workDir, resultPath, codexModel) {
34930
- const schemaPath = path.join(workDir, SCHEMA_FILE);
34931
- await fsp.writeFile(schemaPath, JSON.stringify(CODEX_OUTPUT_SCHEMA), "utf8");
34932
- return {
34933
- promptResultPath: null,
34934
- bootstrapPrompt: CODEX_BOOTSTRAP_PROMPT,
34935
- agent: "codex",
34936
- extraArgs: [
34937
- "exec",
34938
- "--ephemeral",
34939
- "--skip-git-repo-check",
34940
- "--output-schema",
34941
- schemaPath,
34942
- "-o",
34943
- resultPath,
34944
- ...codexModel ? ["-m", codexModel] : []
34945
- ],
34946
- model: null
34947
- };
34948
- }
34949
- function claudeLaunch(resultPath, model) {
34950
- return {
34951
- promptResultPath: resultPath,
34952
- bootstrapPrompt: BOOTSTRAP_PROMPT$1,
34953
- agent: void 0,
34954
- extraArgs: [],
34955
- model
34956
- };
34957
- }
34958
- function makeNarrationWorkDir() {
34959
- return fsp.mkdtemp(path.join(os.tmpdir(), "glimmervoid-change-narrative-"));
34960
- }
34961
- async function spawnNarrationWithSession({ map, factsHash, engine, model, codexModel, timeoutSeconds }, spawn, nowFn) {
34962
- const workDir = await makeNarrationWorkDir();
34963
- const promptPath = path.join(workDir, PROMPT_FILE$2);
34964
- const resultPath = path.join(workDir, RESULT_FILE$2);
34965
- const controller = new AbortController();
34966
- const timeout = setTimeout(() => controller.abort(), timeoutSeconds * 1e3);
34967
- timeout.unref();
34968
- try {
34969
- const launch = engine === "codex" ? await codexLaunch(workDir, resultPath, codexModel) : claudeLaunch(resultPath, model);
34970
- await fsp.writeFile(promptPath, buildNarrativePrompt({
34971
- facts: narrativeFacts(map),
34972
- resultPath: launch.promptResultPath
34973
- }), "utf8");
34974
- await spawn({
34975
- id: `change-narrative:${nowFn()}:${crypto.randomUUID()}`,
34976
- name: "Change map narrative",
34977
- cwd: workDir,
34978
- prompt: launch.bootstrapPrompt,
34979
- agent: launch.agent,
34980
- extraArgs: launch.extraArgs,
34981
- model: launch.model,
34982
- signal: controller.signal
34983
- });
34984
- if (controller.signal.aborted) return null;
34985
- return validateNarrative({
34986
- raw: await readLaneResultFile(resultPath),
34987
- knownFactIds: knownNarrativeFactIds(map),
34988
- factsHash,
34989
- model
34990
- });
34991
- } finally {
34992
- clearTimeout(timeout);
34993
- await fsp.rm(workDir, {
34994
- recursive: true,
34995
- force: true
34996
- });
34997
- }
34998
- }
34999
- function createChangeNarrator({ getConfig, spawnNarration, spawnLane = createLaneSpawn({ laneName: "change-map" }), nowFn = () => Date.now() }) {
35000
- const runNarration = spawnNarration ?? ((request) => spawnNarrationWithSession(request, spawnLane, nowFn));
35001
- const cachedByHash = /* @__PURE__ */ new Map();
35002
- const queuedBySessionId = /* @__PURE__ */ new Map();
35003
- let active = null;
35004
- function narratorSettings() {
35005
- const parsed = BrowserConfig.shape.changeMap.safeParse(getConfig().changeMap);
35006
- if (!parsed.success) return null;
35007
- return parsed.data?.narrator ?? null;
35008
- }
35009
- function cache(factsHash, narrative) {
35010
- cachedByHash.delete(factsHash);
35011
- cachedByHash.set(factsHash, narrative);
35012
- if (cachedByHash.size <= MAX_CACHED_HASHES) return;
35013
- const oldestHash = cachedByHash.keys().next().value;
35014
- if (oldestHash) cachedByHash.delete(oldestHash);
35015
- }
35016
- function start(request) {
35017
- const callbacksBySessionId = /* @__PURE__ */ new Map([[request.sessionId, request.onSettled]]);
35018
- active = {
35019
- factsHash: request.factsHash,
35020
- callbacksBySessionId
35021
- };
35022
- Promise.resolve().then(() => runNarration(request)).then((narrative) => finish(request.factsHash, narrative), () => finish(request.factsHash, null));
35023
- }
35024
- function startNext() {
35025
- if (active) return;
35026
- for (const [sessionId, request] of queuedBySessionId) {
35027
- queuedBySessionId.delete(sessionId);
35028
- if (!narratorSettings()?.enabled || cachedByHash.has(request.factsHash)) {
35029
- request.onSettled();
35030
- continue;
35031
- }
35032
- start(request);
35033
- break;
35034
- }
35035
- }
35036
- function finish(factsHash, narrative) {
35037
- if (!active || active.factsHash !== factsHash) return;
35038
- const callbacks = [...active.callbacksBySessionId.values()];
35039
- cache(factsHash, narrative);
35040
- active = null;
35041
- startNext();
35042
- for (const callback of callbacks) callback();
35043
- }
35044
- function narrationFor(map, onSettled, { mayStart = true } = {}) {
35045
- const config = narratorSettings();
35046
- if (!config?.enabled || !hasNarratableFacts(map)) {
35047
- queuedBySessionId.delete(map.sessionId);
35048
- return {
35049
- narrative: null,
35050
- narratorState: "disabled"
35051
- };
35052
- }
35053
- const engine = config.engine ?? "claude";
35054
- const configuredModel = config.model?.trim() || "";
35055
- const model = configuredModel || (engine === "claude" ? "haiku" : "codex default");
35056
- const factsHash = crypto.createHash("sha256").update(JSON.stringify([
35057
- factsHashInput(map),
35058
- engine,
35059
- configuredModel
35060
- ])).digest("hex");
35061
- if (cachedByHash.has(factsHash)) {
35062
- queuedBySessionId.delete(map.sessionId);
35063
- const narrative = cachedByHash.get(factsHash) ?? null;
35064
- return {
35065
- narrative,
35066
- narratorState: narrative ? "ready" : "failed"
35067
- };
35068
- }
35069
- if (active?.factsHash === factsHash) {
35070
- active.callbacksBySessionId.set(map.sessionId, onSettled);
35071
- queuedBySessionId.delete(map.sessionId);
35072
- return {
35073
- narrative: null,
35074
- narratorState: "pending"
35075
- };
35076
- }
35077
- if (!mayStart) return {
35078
- narrative: null,
35079
- narratorState: queuedBySessionId.has(map.sessionId) ? "pending" : "disabled"
35080
- };
35081
- const request = {
35082
- map,
35083
- factsHash,
35084
- sessionId: map.sessionId,
35085
- onSettled,
35086
- engine,
35087
- model,
35088
- codexModel: engine === "codex" ? configuredModel || null : null,
35089
- timeoutSeconds: config.timeoutSeconds ?? 90
35090
- };
35091
- if (active) {
35092
- queuedBySessionId.set(map.sessionId, request);
35093
- return {
35094
- narrative: null,
35095
- narratorState: "pending"
35096
- };
35097
- }
35098
- start(request);
35099
- return {
35100
- narrative: null,
35101
- narratorState: "pending"
35102
- };
35103
- }
35104
- return { narrationFor };
35105
- }
35106
- //#endregion
35107
34810
  //#region server/task-title-refiner.ts
35108
34811
  var PROMPT_FILE$1 = "task-title-prompt.txt";
35109
34812
  var RESULT_FILE$1 = "task-title-result.json";
@@ -46476,7 +46179,6 @@ function createBackendLanes(dependencies) {
46476
46179
  reviewSessions,
46477
46180
  investigationSessions,
46478
46181
  visionsSessions,
46479
- changeMapSessions,
46480
46182
  taskTitleSessions,
46481
46183
  benchmarkSessions
46482
46184
  ];
@@ -46757,21 +46459,6 @@ function createBackendLanes(dependencies) {
46757
46459
  ...notice
46758
46460
  });
46759
46461
  });
46760
- const changeMapSessions = /* @__PURE__ */ new Map();
46761
- const changeMapNarrator = createChangeNarrator({
46762
- getConfig: () => configStore.config,
46763
- spawnLane: createLaneSpawn({
46764
- sessions: changeMapSessions,
46765
- closeSessionDataClients,
46766
- hookRouter,
46767
- getHookPort,
46768
- spawnGate,
46769
- recordLane,
46770
- replayBufferKB: config.replayBufferKB,
46771
- laneName: "change-map",
46772
- guardrailsRefusal
46773
- })
46774
- });
46775
46462
  const taskTitleSessions = /* @__PURE__ */ new Map();
46776
46463
  const taskTitleRefiner = createTaskTitleRefiner({
46777
46464
  getConfig: () => configStore.config,
@@ -46959,13 +46646,11 @@ function createBackendLanes(dependencies) {
46959
46646
  branchGc,
46960
46647
  coderActivity,
46961
46648
  coderEnv,
46962
- changeMapNarrator,
46963
46649
  taskTitleRefiner,
46964
46650
  taskTitleSessions,
46965
46651
  current,
46966
46652
  currentIngest,
46967
46653
  currentVisions,
46968
- changeMapSessions,
46969
46654
  gitWorkspace,
46970
46655
  gitWorkspaceSync,
46971
46656
  githubStore,
@@ -49391,34 +49076,6 @@ function createSessionFactory(dependencies) {
49391
49076
  };
49392
49077
  }
49393
49078
  //#endregion
49394
- //#region server/core/diff-annotations-core.ts
49395
- var DIFF_ANNOTATION_HEADER = "Operator review notes on the current worktree diff:";
49396
- var DIFF_ANNOTATION_CLOSING = "Address each note, then reply with what changed.";
49397
- var REMOVED_LINE_MARKER = "(removed line)";
49398
- function sortAnnotations(list) {
49399
- return [...list].sort((left, right) => {
49400
- if (left.path !== right.path) return left.path < right.path ? -1 : 1;
49401
- if (left.line !== right.line) return left.line - right.line;
49402
- if (left.side === right.side) return 0;
49403
- return left.side < right.side ? -1 : 1;
49404
- });
49405
- }
49406
- function formatDiffAnnotationMessage(annotations) {
49407
- const entries = sortAnnotations(annotations).flatMap((annotation) => {
49408
- const note = scrubForPaste(annotation.note, DIFF_ANNOTATION_NOTE_MAX_CHARS);
49409
- const path = scrubForPaste(annotation.path, 400);
49410
- if (!note || !path) return [];
49411
- const marker = annotation.side === "old" ? ` ${REMOVED_LINE_MARKER}` : "";
49412
- return [`- ${path}:${annotation.line} (${annotation.section})${marker} ${note}`];
49413
- });
49414
- if (entries.length === 0) return "";
49415
- return [
49416
- DIFF_ANNOTATION_HEADER,
49417
- ...entries,
49418
- DIFF_ANNOTATION_CLOSING
49419
- ].join("\n");
49420
- }
49421
- //#endregion
49422
49079
  //#region server/github/core/github-issues-core.ts
49423
49080
  var GITHUB_ISSUE_BODY_MAX_CHARS = 12e3;
49424
49081
  function fencedBody(body) {
@@ -50406,7 +50063,7 @@ function changedFilesOf(scope) {
50406
50063
  isCommitted: false
50407
50064
  }));
50408
50065
  }
50409
- function createChangeMapService({ sessions, narrator = null, onNarrationSettled = () => {}, runGit = runGitAsync, nowFn = Date.now }) {
50066
+ function createChangeMapService({ sessions, runGit = runGitAsync, nowFn = Date.now }) {
50410
50067
  const specifierCache = createFileFactCache(extractImportSpecifiers, []);
50411
50068
  const pythonSpecifierCache = createFileFactCache(extractPythonImportSpecifiers, []);
50412
50069
  const tsconfigCache = createFileFactCache((text) => ({ config: parseTsconfigJsonc(text) }), { config: null });
@@ -50557,7 +50214,7 @@ function createChangeMapService({ sessions, narrator = null, onNarrationSettled
50557
50214
  };
50558
50215
  }
50559
50216
  }
50560
- async function assemble(session, mayStartNarration) {
50217
+ async function assemble(session) {
50561
50218
  forgetEndedSiblings();
50562
50219
  const scopes = await session.getChangeScopes();
50563
50220
  const inputsByRoot = /* @__PURE__ */ new Map();
@@ -50638,44 +50295,31 @@ function createChangeMapService({ sessions, narrator = null, onNarrationSettled
50638
50295
  for (const repo of repos) repo.links = [];
50639
50296
  }
50640
50297
  }
50641
- const factsOnly = {
50298
+ return ChangeMap.parse({
50642
50299
  sessionId: session.id,
50643
50300
  sig: hashText(JSON.stringify(scopes)),
50644
50301
  generatedAt: nowFn(),
50645
- repos,
50646
- narrative: null,
50647
- narratorState: "disabled"
50648
- };
50649
- const narration = narrator ? narrator.narrationFor(factsOnly, () => onNarrationSettled(session.id), { mayStart: mayStartNarration }) : null;
50650
- return ChangeMap.parse(narration ? {
50651
- ...factsOnly,
50652
- ...narration
50653
- } : factsOnly);
50302
+ repos
50303
+ });
50654
50304
  }
50655
- function startAssembly(session, mayStartNarration) {
50656
- const running = assemble(session, mayStartNarration).finally(() => {
50305
+ function startAssembly(session) {
50306
+ const running = assemble(session).finally(() => {
50657
50307
  if (runningBySessionId.get(session.id) === running) runningBySessionId.delete(session.id);
50658
50308
  });
50659
50309
  runningBySessionId.set(session.id, running);
50660
50310
  return running;
50661
50311
  }
50662
- function build(session, { mayStartNarration = true } = {}) {
50312
+ function build(session) {
50663
50313
  const queued = queuedBySessionId.get(session.id);
50664
- if (queued) {
50665
- queued.mayStartNarration ||= mayStartNarration;
50666
- return queued.promise;
50667
- }
50314
+ if (queued) return queued;
50668
50315
  const running = runningBySessionId.get(session.id);
50669
- if (!running) return startAssembly(session, mayStartNarration);
50670
- const followUp = {
50671
- mayStartNarration,
50672
- promise: running.then(ignoreOutcome, ignoreOutcome).then(() => {
50673
- queuedBySessionId.delete(session.id);
50674
- return startAssembly(session, followUp.mayStartNarration);
50675
- })
50676
- };
50316
+ if (!running) return startAssembly(session);
50317
+ const followUp = running.then(ignoreOutcome, ignoreOutcome).then(() => {
50318
+ queuedBySessionId.delete(session.id);
50319
+ return startAssembly(session);
50320
+ });
50677
50321
  queuedBySessionId.set(session.id, followUp);
50678
- return followUp.promise;
50322
+ return followUp;
50679
50323
  }
50680
50324
  return { build };
50681
50325
  }
@@ -50969,12 +50613,6 @@ function requestValidationErrorReply(msg, message) {
50969
50613
  ok: false,
50970
50614
  error: message
50971
50615
  }),
50972
- "send-diff-annotations": () => ({
50973
- type: "send-diff-annotations-result",
50974
- requestId,
50975
- ok: false,
50976
- error: message
50977
- }),
50978
50616
  "session-doc-read": () => ({
50979
50617
  type: "session-doc-response",
50980
50618
  requestId,
@@ -51042,25 +50680,8 @@ function registerControlHandlers(controlWss, deps) {
51042
50680
  issue: null,
51043
50681
  error: "Issues polling is not running."
51044
50682
  }
51045
- }), issueProjectRepos = null, serverBuild = () => null, getUsageSessions = null, getUsageReport = null, requestUsageReport = null, getPlanLimits = null, controlReplayLog = null, getRtkInstallStatus = () => null, telegramDelivery = null, resolveRtkPath = () => getRtkPath(), conversationFs = fs, conversationGit = runGitForConversationHistory, conversationProjectsDir = claudeProjectsDir(process.env, os.homedir()), readTracePage = null, readPlanRevision = null, decidePlanReview = null, sessionDocs = null, coherenceFeed = null, changeMapNarrator = null, coderEnv = null, remoteRepoGit = null, agentConnect = null } = deps;
51046
- const changeMaps = createChangeMapService({
51047
- sessions,
51048
- narrator: changeMapNarrator,
51049
- onNarrationSettled: (sessionId) => {
51050
- broadcastChangeMap(sessionId).catch((error) => {
51051
- console.warn(`[control] change-map broadcast failed: id=${sessionId}: ${errorMessage(error)}`);
51052
- });
51053
- }
51054
- });
51055
- async function broadcastChangeMap(sessionId) {
51056
- const session = sessions.get(sessionId);
51057
- if (!session) return;
51058
- broadcastControl({
51059
- type: "change-map",
51060
- id: session.id,
51061
- map: await changeMaps.build(session, { mayStartNarration: false })
51062
- });
51063
- }
50683
+ }), issueProjectRepos = null, serverBuild = () => null, getUsageSessions = null, getUsageReport = null, requestUsageReport = null, getPlanLimits = null, controlReplayLog = null, getRtkInstallStatus = () => null, telegramDelivery = null, resolveRtkPath = () => getRtkPath(), conversationFs = fs, conversationGit = runGitForConversationHistory, conversationProjectsDir = claudeProjectsDir(process.env, os.homedir()), readTracePage = null, readPlanRevision = null, decidePlanReview = null, sessionDocs = null, coherenceFeed = null, coderEnv = null, remoteRepoGit = null, agentConnect = null } = deps;
50684
+ const changeMaps = createChangeMapService({ sessions });
51064
50685
  function buildSettingsPayload$1() {
51065
50686
  return buildSettingsPayload({
51066
50687
  configStore,
@@ -52337,33 +51958,6 @@ function registerControlHandlers(controlWss, deps) {
52337
51958
  error: res.error || null
52338
51959
  });
52339
51960
  }
52340
- function handleSendDiffAnnotations(msg, ws) {
52341
- const reply = (payload) => replyTo(ws, msg, "send-diff-annotations-result", {
52342
- ok: false,
52343
- error: null,
52344
- ...payload
52345
- });
52346
- const session = findSession(msg);
52347
- if (!session) {
52348
- reply({ error: "Session not found" });
52349
- return;
52350
- }
52351
- const text = formatDiffAnnotationMessage(msg.annotations ?? []);
52352
- if (!text) {
52353
- reply({ error: "No review notes to send" });
52354
- return;
52355
- }
52356
- const pasted = session.pasteTextWhenReady(text);
52357
- if (!pasted.ok) {
52358
- reply({ error: `Could not write to "${session.name}" (${pasted.reason})` });
52359
- return;
52360
- }
52361
- session.noteOperatorDraft();
52362
- reply({
52363
- ok: true,
52364
- pending: pasted.deferred === true
52365
- });
52366
- }
52367
51961
  async function handleRequestUsageReport(msg, ws) {
52368
51962
  if (!requestUsageReport) {
52369
51963
  ws.send(JSON.stringify({
@@ -52563,7 +52157,6 @@ function registerControlHandlers(controlWss, deps) {
52563
52157
  "request-hooks-report": handleRequestHooksReport,
52564
52158
  "save-hook": handleSaveHook,
52565
52159
  "delete-hook": handleDeleteHook,
52566
- "send-diff-annotations": handleSendDiffAnnotations,
52567
52160
  "kill": (msg) => {
52568
52161
  const s = findSession(msg);
52569
52162
  if (s) s.killSession();
@@ -52632,8 +52225,6 @@ function registerControlHandlers(controlWss, deps) {
52632
52225
  sig: null,
52633
52226
  generatedAt: Date.now(),
52634
52227
  repos: [],
52635
- narrative: null,
52636
- narratorState: "disabled",
52637
52228
  error: `Change map could not be built: ${errorMessage(error)}`
52638
52229
  };
52639
52230
  });
@@ -53090,7 +52681,6 @@ function createBackendControl(dependencies) {
53090
52681
  decidePlanReview: dependencies.decidePlanReview,
53091
52682
  sessionDocs: dependencies.sessionDocs,
53092
52683
  coherenceFeed: dependencies.coherenceFeed,
53093
- changeMapNarrator: dependencies.changeMapNarrator,
53094
52684
  coderEnv: laneAssembly.coderEnv,
53095
52685
  remoteRepoGit: laneAssembly.gitWorkspace,
53096
52686
  agentConnect: dependencies.agentConnect
@@ -56905,7 +56495,7 @@ function createBackend(httpServer, options = {}) {
56905
56495
  logger: console,
56906
56496
  renameSessionFromTaskTitle
56907
56497
  });
56908
- const { allLiveSessions, branchGc, coderActivity, changeMapSessions, gitWorkspace: assembledGitWorkspace, gitWorkspaceSync, posthog, recordLane, spawnGate, tapIngestForSession, teamReview, myPrs, issues, traceChangeBroadcast, traceWiring, uploadsWiring, usage, visionsSessions, visionsSetup } = laneAssembly;
56498
+ const { allLiveSessions, branchGc, coderActivity, gitWorkspace: assembledGitWorkspace, gitWorkspaceSync, posthog, recordLane, spawnGate, tapIngestForSession, teamReview, myPrs, issues, traceChangeBroadcast, traceWiring, uploadsWiring, usage, visionsSessions, visionsSetup } = laneAssembly;
56909
56499
  gitWorkspace = assembledGitWorkspace;
56910
56500
  agentApi = createAgentApiWiring({
56911
56501
  config,
@@ -57093,7 +56683,6 @@ function createBackend(httpServer, options = {}) {
57093
56683
  reviewSessions,
57094
56684
  investigationSessions,
57095
56685
  visionsSessions,
57096
- changeMapSessions,
57097
56686
  taskTitleSessions: laneAssembly.taskTitleSessions,
57098
56687
  benchmarkSessions: laneAssembly.benchmarkSessions,
57099
56688
  branchGc,
@@ -57169,7 +56758,6 @@ function createBackend(httpServer, options = {}) {
57169
56758
  decidePlanReview: laneAssembly.planReview?.decide ?? null,
57170
56759
  sessionDocs,
57171
56760
  coherenceFeed,
57172
- changeMapNarrator: laneAssembly.changeMapNarrator,
57173
56761
  serverBuild: () => serverBuild,
57174
56762
  telemetry,
57175
56763
  logger: console