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.
- package/README.md +2 -2
- package/dist/bin/glimmervoid.js +8 -8
- package/dist/chunks/{adapters-CWIHOfVo.js → adapters-Bga1N6Ie.js} +2 -2
- package/dist/chunks/{adapters-DzClvFt5.js → adapters-DeqV4wUv.js} +1 -1
- package/dist/chunks/{agent-api-cli-Cn-g_ej_.js → agent-api-cli-DWVeqlLu.js} +1 -1
- package/dist/chunks/{agent-api-cli-2FKWf5jj.js → agent-api-cli-YvQ8WxHA.js} +1 -1
- package/dist/chunks/{agent-api-core-CP4J2B39.js → agent-api-core-DFYLP1bF.js} +1 -1
- package/dist/chunks/config-store-CGrS8s6x.js +1 -0
- package/dist/chunks/{config-store-Br2PY4Tg.js → config-store-DOGtTJ1d.js} +2 -69
- package/dist/chunks/{contracts-DJqeCtR3.js → contracts-Ds_eevZs.js} +2 -12
- package/dist/chunks/{control-messages-DHDEMTLI.js → control-messages-Dgap3JRR.js} +1 -44
- package/dist/chunks/{main-ZpBLKI1h.js → main-DOZJniDn.js} +44 -456
- package/dist/chunks/{pair-cli-DW5mUBZa.js → pair-cli-PCXITdEd.js} +2 -2
- package/dist/chunks/{remote-config-DcmhRuRc.js → remote-config-DeWURqqr.js} +1 -1
- package/dist/chunks/{settings-cli-BnM9rg8B.js → settings-cli-xpR7vk9L.js} +4 -4
- package/dist/chunks/{settings-readout-core-2XunjdBA.js → settings-readout-core-C2mOk9Yz.js} +1 -1
- package/dist/chunks/{ssh-sign-cli-CmnA5lFM.js → ssh-sign-cli-rKiqiNem.js} +1 -1
- package/dist/client/assets/index-CuuOi3Bp.js +177 -0
- package/dist/client/assets/index-NhAGtpDY.css +2 -0
- package/dist/client/index.html +2 -3
- package/dist/server/index.js +1 -1
- package/package.json +2 -2
- package/dist/chunks/config-store-DwYjz6h1.js +0 -1
- package/dist/client/assets/index-CBGmkbVV.js +0 -176
- 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
|
|
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-
|
|
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-
|
|
25
|
-
import {
|
|
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-
|
|
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-
|
|
30
|
-
import { n as configFileViewOf, u as readSettingsForAgent } from "./settings-readout-core-
|
|
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,
|
|
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
|
|
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
|
-
|
|
50298
|
+
return ChangeMap.parse({
|
|
50642
50299
|
sessionId: session.id,
|
|
50643
50300
|
sig: hashText(JSON.stringify(scopes)),
|
|
50644
50301
|
generatedAt: nowFn(),
|
|
50645
|
-
repos
|
|
50646
|
-
|
|
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
|
|
50656
|
-
const running = assemble(session
|
|
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
|
|
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
|
|
50670
|
-
const followUp = {
|
|
50671
|
-
|
|
50672
|
-
|
|
50673
|
-
|
|
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
|
|
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,
|
|
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,
|
|
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
|