@cmmd-center/forge 0.13.16 → 0.13.17

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 (23) hide show
  1. package/dist/bin.cjs +40 -724
  2. package/dist/bin.mjs +34 -718
  3. package/dist/client/assets/{CanvasPanel-RpD9Eh_S.js → CanvasPanel-uofZ5KUR.js} +2 -2
  4. package/dist/client/assets/{CompositeItem-DEIBUHJR.js → CompositeItem-C5YSRi5B.js} +2 -2
  5. package/dist/client/assets/{DiffPanel-DI782ZMI.js → DiffPanel-DBxERq43.js} +2 -2
  6. package/dist/client/assets/{DiffPanel.logic-DtVm1IjE.js → DiffPanel.logic-CVvbOj4s.js} +2 -2
  7. package/dist/client/assets/{DiffPanelShell-IB1GWoYr.js → DiffPanelShell-3FSe-Ixv.js} +6 -6
  8. package/dist/client/assets/{DiffWorkerPoolProvider-DDMgJC0H.js → DiffWorkerPoolProvider-DGz1EBXf.js} +2 -2
  9. package/dist/client/assets/{PullRequestCodePanel-DPwb2trb.js → PullRequestCodePanel-BsTzlXhi.js} +2 -2
  10. package/dist/client/assets/{Virtualizer-CU-TBcmx.js → Virtualizer-BABEZSz9.js} +2 -2
  11. package/dist/client/assets/{canvasStateStore-NrAxDqvM.js → canvasStateStore-IBP3QM_C.js} +2 -2
  12. package/dist/client/assets/{cmmdAuthRedirect-BahlX0gF.js → cmmdAuthRedirect-Ck1QfYaS.js} +2 -2
  13. package/dist/client/assets/index-DBkypII5.js +153 -0
  14. package/dist/client/assets/index-EZbGVDT4.css +1 -0
  15. package/dist/client/assets/{popover-Z8Tvl-OD.js → popover-BQaoSlk7.js} +2 -2
  16. package/dist/client/assets/{src-BU7yHzO9.js → src-Bj8vTcnP.js} +2 -2
  17. package/dist/client/assets/{toggle-CWYdWYBn.js → toggle-CE2NHkQL.js} +2 -2
  18. package/dist/client/index.html +11 -11
  19. package/dist/forge-build.json +1 -1
  20. package/dist/{open-D8mGyWmt.mjs → open-FIgTDosf.mjs} +3 -3
  21. package/package.json +1 -1
  22. package/dist/client/assets/index-B9000khV.css +0 -1
  23. package/dist/client/assets/index-CB-vPC0y.js +0 -153
package/dist/bin.mjs CHANGED
@@ -22,7 +22,7 @@ import { createCipheriv, createDecipheriv, createHash, createHmac, createPublicK
22
22
  import * as FS$1 from "node:fs";
23
23
  import fs, { accessSync, chmodSync, constants, createReadStream, existsSync, mkdirSync, mkdtempSync, promises, readFile, readFileSync, readdir, readdirSync, realpathSync, rmSync, statSync, unlinkSync, writeFileSync } from "node:fs";
24
24
  import * as NodeOS from "node:os";
25
- import $U, { homedir, networkInterfaces, tmpdir } from "node:os";
25
+ import os, { homedir, networkInterfaces, tmpdir } from "node:os";
26
26
  import * as Path$1 from "node:path";
27
27
  import path, { basename, delimiter, dirname, extname, isAbsolute, join, posix, relative, resolve, sep } from "node:path";
28
28
  import { pathToFileURL } from "node:url";
@@ -25521,160 +25521,6 @@ const WorkspaceEnsureScratchResult = Struct({
25521
25521
  workspaceRoot: String$1,
25522
25522
  title: String$1
25523
25523
  });
25524
- const CodeGraphRelation = Literals([
25525
- "contains",
25526
- "imports",
25527
- "calls",
25528
- "imports_from",
25529
- "method",
25530
- "references",
25531
- "re_exports",
25532
- "indirect_call",
25533
- "dynamic_import",
25534
- "inherits",
25535
- "rationale_for",
25536
- "implements",
25537
- "cites",
25538
- "triggers"
25539
- ]);
25540
- const CodeGraphConfidence = Literals(["EXTRACTED", "INFERRED"]);
25541
- const CodeGraphEdgeClass = Literals([
25542
- "containment",
25543
- "dependency",
25544
- "behavior"
25545
- ]);
25546
- /**
25547
- * Relation to drawn class. Exhaustive over CODE_GRAPH_RELATIONS by construction
25548
- * — `codeGraph.test.ts` fails if a relation is added without a class.
25549
- */
25550
- const CODE_GRAPH_RELATION_CLASS = {
25551
- contains: "containment",
25552
- method: "containment",
25553
- imports: "dependency",
25554
- imports_from: "dependency",
25555
- re_exports: "dependency",
25556
- dynamic_import: "dependency",
25557
- inherits: "dependency",
25558
- implements: "dependency",
25559
- calls: "behavior",
25560
- indirect_call: "behavior",
25561
- references: "behavior",
25562
- triggers: "behavior",
25563
- cites: "behavior",
25564
- rationale_for: "behavior"
25565
- };
25566
- const CodeGraphNodeKind = Literals(["file", "symbol"]);
25567
- /**
25568
- * One community, positioned.
25569
- *
25570
- * Positions are computed server-side and are stable for a given graph build, so
25571
- * the map does not rearrange itself between openings. A map you have to re-learn
25572
- * every time is not a map.
25573
- */
25574
- const CodeGraphRegion = Struct({
25575
- id: NonNegativeInt,
25576
- label: TrimmedNonEmptyString,
25577
- nodeCount: PositiveInt,
25578
- x: Number$1,
25579
- y: Number$1
25580
- });
25581
- /** An aggregated edge between two regions, weighted by how many edges cross. */
25582
- const CodeGraphRegionLink = Struct({
25583
- source: NonNegativeInt,
25584
- target: NonNegativeInt,
25585
- weight: PositiveInt
25586
- });
25587
- /**
25588
- * The default view: the whole repository as ~120 named regions.
25589
- *
25590
- * `truncatedRegions` is not decoration. When a graph has more regions than the
25591
- * map shows, the surface says so — a view that silently drops a third of the
25592
- * codebase while looking complete is the failure mode this field exists to
25593
- * prevent.
25594
- */
25595
- const CodeGraphSummary = Struct({
25596
- repoLabel: TrimmedNonEmptyString,
25597
- builtAtCommit: NullOr(String$1),
25598
- nodeCount: NonNegativeInt,
25599
- edgeCount: NonNegativeInt,
25600
- extractedEdgeCount: NonNegativeInt,
25601
- inferredEdgeCount: NonNegativeInt,
25602
- regionCount: NonNegativeInt,
25603
- regions: ArraySchema(CodeGraphRegion),
25604
- links: ArraySchema(CodeGraphRegionLink),
25605
- truncatedRegions: NonNegativeInt
25606
- });
25607
- /** A node as it appears in a list, a search result, or a neighborhood. */
25608
- const CodeGraphNodeSummary = Struct({
25609
- id: TrimmedNonEmptyString,
25610
- label: TrimmedNonEmptyString,
25611
- kind: CodeGraphNodeKind,
25612
- sourceFile: NullOr(String$1),
25613
- sourceLocation: NullOr(String$1),
25614
- regionId: NullOr(NonNegativeInt),
25615
- regionLabel: NullOr(String$1),
25616
- degree: NonNegativeInt
25617
- });
25618
- /** One edge, carrying both the exact relation and the class it is drawn as. */
25619
- const CodeGraphEdgeView = Struct({
25620
- source: TrimmedNonEmptyString,
25621
- target: TrimmedNonEmptyString,
25622
- relation: CodeGraphRelation,
25623
- edgeClass: CodeGraphEdgeClass,
25624
- confidence: CodeGraphConfidence,
25625
- confidenceScore: Number$1
25626
- });
25627
- /**
25628
- * One node and what surrounds it — the view a person actually works in.
25629
- *
25630
- * `truncated` fires when a hub's fan-out exceeds the cap. A god node with
25631
- * thousands of edges must degrade to "showing 150 of 2,310", never to a frozen
25632
- * tab or a quietly partial picture.
25633
- */
25634
- const CodeGraphNeighborhood = Struct({
25635
- root: CodeGraphNodeSummary,
25636
- nodes: ArraySchema(CodeGraphNodeSummary),
25637
- edges: ArraySchema(CodeGraphEdgeView),
25638
- depth: PositiveInt,
25639
- truncated: Boolean$1,
25640
- omittedCount: NonNegativeInt
25641
- });
25642
- const CodeGraphSearchResult = Struct({
25643
- nodes: ArraySchema(CodeGraphNodeSummary),
25644
- truncated: Boolean$1
25645
- });
25646
- const CodeGraphSummaryInput = Struct({ cwd: TrimmedNonEmptyString });
25647
- const CodeGraphNeighborhoodInput = Struct({
25648
- cwd: TrimmedNonEmptyString,
25649
- nodeId: TrimmedNonEmptyString,
25650
- depth: optional$4(PositiveInt)
25651
- });
25652
- const CodeGraphSearchInput = Struct({
25653
- cwd: TrimmedNonEmptyString,
25654
- query: TrimmedNonEmptyString,
25655
- limit: optional$4(PositiveInt)
25656
- });
25657
- /** Where the extractor writes, relative to the project root. */
25658
- const CODE_GRAPH_ARTIFACT_PATH = "graphify-out/graph.json";
25659
- /**
25660
- * No graph in this checkout, or one that cannot be read.
25661
- *
25662
- * Distinct from a read failure on purpose: "not indexed yet" is the normal
25663
- * first-run state and gets an action, while a malformed or unreadable artifact
25664
- * is a fault and gets an explanation. Collapsing them would tell a user with a
25665
- * corrupt file to run a build they have already run.
25666
- */
25667
- var CodeGraphUnavailableError = class extends TaggedErrorClass()("CodeGraphUnavailableError", {
25668
- reason: Literals([
25669
- "missing",
25670
- "unreadable",
25671
- "malformed",
25672
- "lfs-pointer"
25673
- ]),
25674
- message: String$1
25675
- }) {};
25676
- /** A node id that is not in this graph — usually a stale link into a rebuilt graph. */
25677
- var CodeGraphNodeNotFoundError = class extends TaggedErrorClass()("CodeGraphNodeNotFoundError", { nodeId: String$1 }) {};
25678
25524
  //#endregion
25679
25525
  //#region ../../packages/contracts/src/relay.ts
25680
25526
  const RELAY_PROTOCOL_FAMILY = "forge-relay";
@@ -26055,9 +25901,6 @@ const WS_METHODS = {
26055
25901
  projectsWriteFile: "projects.writeFile",
26056
25902
  projectCheckoutDeletionPreview: "projectCheckoutDeletion.preview",
26057
25903
  projectCheckoutDeletionExecute: "projectCheckoutDeletion.execute",
26058
- codeGraphSummary: "codeGraph.summary",
26059
- codeGraphNeighborhood: "codeGraph.neighborhood",
26060
- codeGraphSearch: "codeGraph.search",
26061
25904
  workspaceReadFile: "workspace.readFile",
26062
25905
  workspaceBeginWriteFile: "workspace.beginWriteFile",
26063
25906
  workspaceWriteFileChunk: "workspace.writeFileChunk",
@@ -26343,21 +26186,6 @@ const WsProjectCheckoutDeletionExecuteRpc = make$30(WS_METHODS.projectCheckoutDe
26343
26186
  payload: ProjectCheckoutDeletionExecuteInput,
26344
26187
  success: ProjectCheckoutDeletionResult
26345
26188
  });
26346
- const WsCodeGraphSummaryRpc = make$30(WS_METHODS.codeGraphSummary, {
26347
- payload: CodeGraphSummaryInput,
26348
- success: CodeGraphSummary,
26349
- error: CodeGraphUnavailableError
26350
- });
26351
- const WsCodeGraphNeighborhoodRpc = make$30(WS_METHODS.codeGraphNeighborhood, {
26352
- payload: CodeGraphNeighborhoodInput,
26353
- success: CodeGraphNeighborhood,
26354
- error: Union([CodeGraphUnavailableError, CodeGraphNodeNotFoundError])
26355
- });
26356
- const WsCodeGraphSearchRpc = make$30(WS_METHODS.codeGraphSearch, {
26357
- payload: CodeGraphSearchInput,
26358
- success: CodeGraphSearchResult,
26359
- error: CodeGraphUnavailableError
26360
- });
26361
26189
  const WsWorkspaceReadFileRpc = make$30(WS_METHODS.workspaceReadFile, {
26362
26190
  payload: BulkTransferReadFileInput,
26363
26191
  success: BulkTransferStreamEvent,
@@ -26807,7 +26635,7 @@ const WsRpcGroup = make$29(WsServerGetConfigRpc, WsServerRefreshProvidersRpc, Ws
26807
26635
  payload: UsageSummaryInput,
26808
26636
  success: UsageSummary,
26809
26637
  error: UsageReadError
26810
- }), WsPullRequestsListRpc, WsPullRequestsListStatsRpc, WsPullRequestsDetailRpc, WsPullRequestsActivityRpc, WsPullRequestsThreadCommentsRpc, WsPullRequestsDiffFileContentsRpc, WsPullRequestsRunActionRpc, WsPullRequestsUpdateRpc, WsPullRequestsCommentRpc, WsPullRequestsUpdateCommentRpc, WsPullRequestsSubmitReviewRpc, WsPullRequestsReplyToThreadRpc, WsPullRequestsSetThreadResolutionRpc, WsPullRequestsSetReactionRpc, WsPullRequestsInvalidateRpc, WsPullRequestsReviewerCandidatesRpc, WsPullRequestsRequestReviewersRpc, WsProjectsSearchContentsRpc, WsProjectsSearchEntriesRpc, WsProjectsWriteFileRpc, WsProjectCheckoutDeletionPreviewRpc, WsProjectCheckoutDeletionExecuteRpc, WsCodeGraphSummaryRpc, WsCodeGraphNeighborhoodRpc, WsCodeGraphSearchRpc, WsWorkspaceReadFileRpc, WsWorkspaceBeginWriteFileRpc, WsWorkspaceWriteFileChunkRpc, WsWorkspaceCommitWriteFileRpc, WsWorkspaceCancelWriteFileRpc, WsShellOpenInEditorRpc, WsSubscribeGitStatusRpc, WsGitPullRpc, WsGitRefreshStatusRpc, WsGitRunStackedActionRpc, WsGitResolvePullRequestRpc, WsGitPreparePullRequestThreadRpc, WsGitListBranchesRpc, WsVcsListRefsRpc, WsVcsRefreshStatusRpc, WsSubscribeVcsStatusRpc, WsVcsPullRpc, WsVcsCreateWorktreeRpc, WsVcsRemoveWorktreeRpc, WsVcsCreateRefRpc, WsVcsSwitchRefRpc, WsVcsInitRpc, WsGitCreateWorktreeRpc, WsGitRemoveWorktreeRpc, WsGitCreateBranchRpc, WsGitCheckoutRpc, WsGitInitRpc, WsFilesystemBrowseRpc, WsProjectsReadFileRpc, WsReviewGetDiffPreviewRpc, WsCloudListRuntimesRpc, WsTerminalOpenRpc, WsTerminalAttachRpc, WsTerminalWriteRpc, WsTerminalResizeRpc, WsTerminalSignalRpc, WsTerminalClearRpc, WsTerminalRestartRpc, WsTerminalCloseRpc, WsBrowserOpenSessionRpc, WsBrowserListSessionsRpc, WsBrowserCloseSessionRpc, WsBrowserGetSessionRpc, WsBrowserCommandRpc, WsBrowserClearBrowsingDataRpc, WsBrowserAttachDisplayRpc, WsBrowserAddDisplayIceCandidateRpc, WsComputerInputRpc, WsDevTunnelRegisterRpc, WsDevTunnelUnregisterRpc, WsDevTunnelListRpc, WsThreadDevRuntimeGetRpc, WsThreadDevRuntimeAllocatePortRpc, WsThreadDevRuntimeReleaseRpc, WsWorkspaceEnvironmentPreflightRpc, WsWorkspaceEnsureScratchRpc, WsSubscribeTerminalEventsRpc, WsSubscribeTerminalMetadataRpc, WsProjectsListEntriesRpc, WsServerDiscoverSourceControlRpc, WsServerReportClientActivityRpc, WsSubscribeBrowserEventsRpc, WsSubscribeServerConfigRpc, WsSubscribeServerLifecycleRpc, WsSubscribeAuthAccessRpc, WsSubscribeWorkspaceReadinessRpc, WsOrchestrationDispatchCommandRpc, WsOrchestrationGetTurnDiffRpc, WsOrchestrationGetFullThreadDiffRpc, WsOrchestrationStreamTurnDiffRpc, WsOrchestrationStreamFullThreadDiffRpc, WsOrchestrationReplayEventsRpc, WsOrchestrationGetArchivedShellSnapshotRpc, WsOrchestrationSubscribeShellRpc, WsOrchestrationSubscribeThreadRpc, make$30(WS_METHODS.assetsCreateUrl, {
26638
+ }), WsPullRequestsListRpc, WsPullRequestsListStatsRpc, WsPullRequestsDetailRpc, WsPullRequestsActivityRpc, WsPullRequestsThreadCommentsRpc, WsPullRequestsDiffFileContentsRpc, WsPullRequestsRunActionRpc, WsPullRequestsUpdateRpc, WsPullRequestsCommentRpc, WsPullRequestsUpdateCommentRpc, WsPullRequestsSubmitReviewRpc, WsPullRequestsReplyToThreadRpc, WsPullRequestsSetThreadResolutionRpc, WsPullRequestsSetReactionRpc, WsPullRequestsInvalidateRpc, WsPullRequestsReviewerCandidatesRpc, WsPullRequestsRequestReviewersRpc, WsProjectsSearchContentsRpc, WsProjectsSearchEntriesRpc, WsProjectsWriteFileRpc, WsProjectCheckoutDeletionPreviewRpc, WsProjectCheckoutDeletionExecuteRpc, WsWorkspaceReadFileRpc, WsWorkspaceBeginWriteFileRpc, WsWorkspaceWriteFileChunkRpc, WsWorkspaceCommitWriteFileRpc, WsWorkspaceCancelWriteFileRpc, WsShellOpenInEditorRpc, WsSubscribeGitStatusRpc, WsGitPullRpc, WsGitRefreshStatusRpc, WsGitRunStackedActionRpc, WsGitResolvePullRequestRpc, WsGitPreparePullRequestThreadRpc, WsGitListBranchesRpc, WsVcsListRefsRpc, WsVcsRefreshStatusRpc, WsSubscribeVcsStatusRpc, WsVcsPullRpc, WsVcsCreateWorktreeRpc, WsVcsRemoveWorktreeRpc, WsVcsCreateRefRpc, WsVcsSwitchRefRpc, WsVcsInitRpc, WsGitCreateWorktreeRpc, WsGitRemoveWorktreeRpc, WsGitCreateBranchRpc, WsGitCheckoutRpc, WsGitInitRpc, WsFilesystemBrowseRpc, WsProjectsReadFileRpc, WsReviewGetDiffPreviewRpc, WsCloudListRuntimesRpc, WsTerminalOpenRpc, WsTerminalAttachRpc, WsTerminalWriteRpc, WsTerminalResizeRpc, WsTerminalSignalRpc, WsTerminalClearRpc, WsTerminalRestartRpc, WsTerminalCloseRpc, WsBrowserOpenSessionRpc, WsBrowserListSessionsRpc, WsBrowserCloseSessionRpc, WsBrowserGetSessionRpc, WsBrowserCommandRpc, WsBrowserClearBrowsingDataRpc, WsBrowserAttachDisplayRpc, WsBrowserAddDisplayIceCandidateRpc, WsComputerInputRpc, WsDevTunnelRegisterRpc, WsDevTunnelUnregisterRpc, WsDevTunnelListRpc, WsThreadDevRuntimeGetRpc, WsThreadDevRuntimeAllocatePortRpc, WsThreadDevRuntimeReleaseRpc, WsWorkspaceEnvironmentPreflightRpc, WsWorkspaceEnsureScratchRpc, WsSubscribeTerminalEventsRpc, WsSubscribeTerminalMetadataRpc, WsProjectsListEntriesRpc, WsServerDiscoverSourceControlRpc, WsServerReportClientActivityRpc, WsSubscribeBrowserEventsRpc, WsSubscribeServerConfigRpc, WsSubscribeServerLifecycleRpc, WsSubscribeAuthAccessRpc, WsSubscribeWorkspaceReadinessRpc, WsOrchestrationDispatchCommandRpc, WsOrchestrationGetTurnDiffRpc, WsOrchestrationGetFullThreadDiffRpc, WsOrchestrationStreamTurnDiffRpc, WsOrchestrationStreamFullThreadDiffRpc, WsOrchestrationReplayEventsRpc, WsOrchestrationGetArchivedShellSnapshotRpc, WsOrchestrationSubscribeShellRpc, WsOrchestrationSubscribeThreadRpc, make$30(WS_METHODS.assetsCreateUrl, {
26811
26639
  payload: AssetsRpcSchemas.createUrl.input,
26812
26640
  success: AssetsRpcSchemas.createUrl.output,
26813
26641
  error: AssetAccessError
@@ -31496,21 +31324,6 @@ const RELAY_METHOD_POLICY_BASES = [
31496
31324
  requiredScope: "runtime.read",
31497
31325
  deliveryClass: "read"
31498
31326
  },
31499
- {
31500
- method: WS_METHODS.codeGraphSummary,
31501
- requiredScope: "workspace.read",
31502
- deliveryClass: "read"
31503
- },
31504
- {
31505
- method: WS_METHODS.codeGraphNeighborhood,
31506
- requiredScope: "workspace.read",
31507
- deliveryClass: "read"
31508
- },
31509
- {
31510
- method: WS_METHODS.codeGraphSearch,
31511
- requiredScope: "workspace.read",
31512
- deliveryClass: "read"
31513
- },
31514
31327
  {
31515
31328
  method: WS_METHODS.projectsWriteFile,
31516
31329
  requiredScope: "workspace.write",
@@ -50735,7 +50548,7 @@ function _supportsColor(haveStream, { streamIsTTY, sniffFlags = true } = {}) {
50735
50548
  const min = forceColor || 0;
50736
50549
  if (env.TERM === "dumb") return min;
50737
50550
  if (process$1.platform === "win32") {
50738
- const osRelease = $U.release().split(".");
50551
+ const osRelease = os.release().split(".");
50739
50552
  if (Number(osRelease[0]) >= 10 && Number(osRelease[2]) >= 10586) return Number(osRelease[2]) >= 14931 ? 3 : 2;
50740
50553
  return 1;
50741
50554
  }
@@ -53178,7 +52991,7 @@ var require_ProcessDetector = /* @__PURE__ */ __commonJSMin(((exports) => {
53178
52991
  exports.processDetector = void 0;
53179
52992
  const api_1 = (init_esm$1(), __toCommonJS(esm_exports$1));
53180
52993
  const semconv_1 = require_semconv$1();
53181
- const os$3 = __require("os");
52994
+ const os$4 = __require("os");
53182
52995
  /**
53183
52996
  * ProcessDetector will be used to detect the resources related current process running
53184
52997
  * and being instrumented from the NodeJS Process module.
@@ -53200,7 +53013,7 @@ var require_ProcessDetector = /* @__PURE__ */ __commonJSMin(((exports) => {
53200
53013
  };
53201
53014
  if (process.argv.length > 1) attributes[semconv_1.ATTR_PROCESS_COMMAND] = process.argv[1];
53202
53015
  try {
53203
- const userInfo = os$3.userInfo();
53016
+ const userInfo = os$4.userInfo();
53204
53017
  attributes[semconv_1.ATTR_PROCESS_OWNER] = userInfo.username;
53205
53018
  } catch (e) {
53206
53019
  api_1.diag.debug(`error obtaining process owner: ${e}`);
@@ -66123,7 +65936,7 @@ function normalizeNumberish(value) {
66123
65936
  }
66124
65937
  //#endregion
66125
65938
  //#region package.json
66126
- var version$1 = "0.13.16";
65939
+ var version$1 = "0.13.17";
66127
65940
  //#endregion
66128
65941
  //#region src/sentry.ts
66129
65942
  const SERVER_APP_NAME = "forge-server";
@@ -67161,7 +66974,7 @@ function toPersistenceDecodeDefect(operation) {
67161
66974
  const isPersistenceError = (u) => is$1(PersistenceSqlError)(u) || is$1(PersistenceDecodeError)(u);
67162
66975
  //#endregion
67163
66976
  //#region src/cmmdConnection/CmmdConnectionStore.ts
67164
- const cache$1 = /* @__PURE__ */ new Map();
66977
+ const cache = /* @__PURE__ */ new Map();
67165
66978
  const jwtCache = /* @__PURE__ */ new Map();
67166
66979
  const jwtExpiryCache = /* @__PURE__ */ new Map();
67167
66980
  const refreshTokenCache = /* @__PURE__ */ new Map();
@@ -67302,7 +67115,7 @@ const hydrateCommandAccessTokenStore = gen(function* () {
67302
67115
  session_grant AS "sessionGrant"
67303
67116
  FROM command_access_tokens
67304
67117
  `.pipe(mapError(toPersistenceSqlError("CommandAccessTokenStore.hydrate:query")))).pipe(mapError(toPersistenceDecodeError("CommandAccessTokenStore.hydrate:decodeRows")));
67305
- cache$1.clear();
67118
+ cache.clear();
67306
67119
  jwtCache.clear();
67307
67120
  jwtExpiryCache.clear();
67308
67121
  refreshTokenCache.clear();
@@ -67312,7 +67125,7 @@ const hydrateCommandAccessTokenStore = gen(function* () {
67312
67125
  try: () => {
67313
67126
  for (const row of decoded) {
67314
67127
  const sessionId = row.sessionId;
67315
- cache$1.set(sessionId, decodeSensitiveValue(ACCESS_TOKEN_SCOPE, row.accessToken));
67128
+ cache.set(sessionId, decodeSensitiveValue(ACCESS_TOKEN_SCOPE, row.accessToken));
67316
67129
  const jwtToken = decryptNullable(JWT_TOKEN_SCOPE, row.jwtToken);
67317
67130
  if (jwtToken) jwtCache.set(sessionId, jwtToken);
67318
67131
  if (row.jwtExpiresAt) jwtExpiryCache.set(sessionId, row.jwtExpiresAt);
@@ -67332,7 +67145,7 @@ const hydrateCommandAccessTokenStore = gen(function* () {
67332
67145
  * Returns `null` when the session has no paired CMMD token.
67333
67146
  */
67334
67147
  function readCommandAccessTokenForSession(sessionId) {
67335
- return cache$1.get(sessionId) ?? null;
67148
+ return cache.get(sessionId) ?? null;
67336
67149
  }
67337
67150
  const threadSessions = /* @__PURE__ */ new Map();
67338
67151
  /**
@@ -67709,7 +67522,7 @@ const promoteMostRecentOwnerCommandAuthToSession = (sessionId) => gen(function*
67709
67522
  cmmd_user_identity = excluded.cmmd_user_identity,
67710
67523
  updated_at = excluded.updated_at
67711
67524
  `.pipe(mapError(toPersistenceSqlError("CommandAccessTokenStore.promoteLatestOwnerAuth:upsert")));
67712
- cache$1.set(sessionId, accessToken);
67525
+ cache.set(sessionId, accessToken);
67713
67526
  if (jwtToken) jwtCache.set(sessionId, jwtToken);
67714
67527
  else jwtCache.delete(sessionId);
67715
67528
  if (row.jwtExpiresAt) jwtExpiryCache.set(sessionId, row.jwtExpiresAt);
@@ -67754,7 +67567,7 @@ const setCommandAccessTokenForSession = (sessionId, accessToken) => gen(function
67754
67567
  access_token = excluded.access_token,
67755
67568
  updated_at = excluded.updated_at
67756
67569
  `.pipe(mapError(toPersistenceSqlError("CommandAccessTokenStore.set:query")));
67757
- cache$1.set(sessionId, token);
67570
+ cache.set(sessionId, token);
67758
67571
  });
67759
67572
  /**
67760
67573
  * Remove the PAT for a session from both durable persistence and the in-memory cache.
@@ -67767,7 +67580,7 @@ const clearCommandAccessTokenForSession = (sessionId) => gen(function* () {
67767
67580
  forgetCommandAccessTokenCachesForSession(sessionId);
67768
67581
  });
67769
67582
  function forgetCommandAccessTokenCachesForSession(sessionId) {
67770
- cache$1.delete(sessionId);
67583
+ cache.delete(sessionId);
67771
67584
  jwtCache.delete(sessionId);
67772
67585
  jwtExpiryCache.delete(sessionId);
67773
67586
  refreshTokenCache.delete(sessionId);
@@ -75971,7 +75784,7 @@ var require_node_gyp_build = /* @__PURE__ */ __commonJSMin(((exports, module) =>
75971
75784
  var fs$6 = __require("fs");
75972
75785
  var path$5 = __require("path");
75973
75786
  var url$1 = __require("url");
75974
- var os$2 = __require("os");
75787
+ var os$3 = __require("os");
75975
75788
  var runtimeRequire = typeof __webpack_require__ === "function" ? __non_webpack_require__ : __require;
75976
75789
  var vars = process.config && process.config.variables || {};
75977
75790
  var prebuildsOnly = !!process.env.PREBUILDS_ONLY;
@@ -75979,8 +75792,8 @@ var require_node_gyp_build = /* @__PURE__ */ __commonJSMin(((exports, module) =>
75979
75792
  var abi = versions.modules;
75980
75793
  if (versions.deno || process.isBun) abi = "unsupported";
75981
75794
  var runtime = isElectron() ? "electron" : isNwjs() ? "node-webkit" : "node";
75982
- var arch = process.env.npm_config_arch || os$2.arch();
75983
- var platform = process.env.npm_config_platform || os$2.platform();
75795
+ var arch = process.env.npm_config_arch || os$3.arch();
75796
+ var platform = process.env.npm_config_platform || os$3.platform();
75984
75797
  var libc = process.env.LIBC || (isMusl(platform) ? "musl" : "glibc");
75985
75798
  var armv = process.env.ARM_VERSION || (arch === "arm64" ? "8" : vars.arm_version) || "";
75986
75799
  var uv = (versions.uv || "").split(".")[0];
@@ -77318,500 +77131,6 @@ const makeSocketProtocol = /* @__PURE__ */ gen(function* () {
77318
77131
  };
77319
77132
  });
77320
77133
  //#endregion
77321
- //#region src/codeGraph/aggregate.ts
77322
- /**
77323
- * Turning a 26 MB graph into slices small enough to draw.
77324
- *
77325
- * Pure functions over an already-parsed graph, deliberately free of Effect, the
77326
- * filesystem and the RPC layer, so the interesting parts — capping, ranking,
77327
- * hub suppression — are testable without a runtime or a fixture file on disk.
77328
- *
77329
- * The whole module exists because of one number: this repo's graph is 34,102
77330
- * nodes and 86,347 edges. Nothing here ever returns more than a few hundred of
77331
- * either. A view that tries to show everything shows nothing.
77332
- */
77333
- function pushInto(map, key, link) {
77334
- const existing = map.get(key);
77335
- if (existing === void 0) {
77336
- map.set(key, [link]);
77337
- return;
77338
- }
77339
- existing.push(link);
77340
- }
77341
- function isKnownRelation(relation) {
77342
- return Object.hasOwn(CODE_GRAPH_RELATION_CLASS, relation);
77343
- }
77344
- /**
77345
- * Index a parsed graph once so every later query is a map lookup.
77346
- *
77347
- * Edges naming a node the artifact does not define are dropped rather than
77348
- * synthesised. Graphify does emit these — a call into a module outside the scan
77349
- * root — and inventing a placeholder node for one would put a file in the map
77350
- * that is not in the repository.
77351
- */
77352
- function indexGraph(raw, repoLabel) {
77353
- const nodes = /* @__PURE__ */ new Map();
77354
- for (const node of raw.nodes) nodes.set(node.id, node);
77355
- const outbound = /* @__PURE__ */ new Map();
77356
- const inbound = /* @__PURE__ */ new Map();
77357
- const degree = /* @__PURE__ */ new Map();
77358
- const unknownRelations = /* @__PURE__ */ new Set();
77359
- let extractedEdgeCount = 0;
77360
- let inferredEdgeCount = 0;
77361
- let edgeCount = 0;
77362
- for (const link of raw.links) {
77363
- if (!nodes.has(link.source) || !nodes.has(link.target)) continue;
77364
- const relation = link.relation ?? "";
77365
- if (relation !== "" && !isKnownRelation(relation)) {
77366
- unknownRelations.add(relation);
77367
- continue;
77368
- }
77369
- edgeCount += 1;
77370
- if (link.confidence === "INFERRED") inferredEdgeCount += 1;
77371
- else extractedEdgeCount += 1;
77372
- pushInto(outbound, link.source, link);
77373
- pushInto(inbound, link.target, link);
77374
- degree.set(link.source, (degree.get(link.source) ?? 0) + 1);
77375
- degree.set(link.target, (degree.get(link.target) ?? 0) + 1);
77376
- }
77377
- return {
77378
- repoLabel,
77379
- builtAtCommit: raw.built_at_commit ?? null,
77380
- nodes,
77381
- outbound,
77382
- inbound,
77383
- degree,
77384
- edgeCount,
77385
- extractedEdgeCount,
77386
- inferredEdgeCount,
77387
- unknownRelations: [...unknownRelations].toSorted()
77388
- };
77389
- }
77390
- /**
77391
- * Deterministic sunflower placement.
77392
- *
77393
- * A phyllotaxis spiral rather than a force simulation, for three reasons: it
77394
- * needs no dependency, it is O(n), and — the one that actually matters — it is
77395
- * *stable*. The same graph opens to the same picture every time, so the spatial
77396
- * memory a person builds up survives closing the panel. A force layout reshuffles
77397
- * on every mount and quietly costs them that.
77398
- *
77399
- * Index 0 lands nearest the centre, so ordering regions by size puts the
77400
- * architectural core where the eye starts.
77401
- */
77402
- function spiralPosition(index, total) {
77403
- const goldenAngle = Math.PI * (3 - Math.sqrt(5));
77404
- const radius = total <= 1 ? 0 : Math.sqrt(index / (total - 1));
77405
- const angle = index * goldenAngle;
77406
- return {
77407
- x: .5 + radius * Math.cos(angle) * .44,
77408
- y: .5 + radius * Math.sin(angle) * .44
77409
- };
77410
- }
77411
- /** Group nodes into their communities, and remember which community each is in. */
77412
- function accumulateRegions(graph) {
77413
- const accumulators = /* @__PURE__ */ new Map();
77414
- const regionOfNode = /* @__PURE__ */ new Map();
77415
- for (const node of graph.nodes.values()) {
77416
- const community = node.community;
77417
- if (community === void 0) continue;
77418
- regionOfNode.set(node.id, community);
77419
- const existing = accumulators.get(community);
77420
- if (existing === void 0) {
77421
- accumulators.set(community, {
77422
- id: community,
77423
- label: node.community_name ?? `Region ${String(community)}`,
77424
- nodeCount: 1
77425
- });
77426
- continue;
77427
- }
77428
- existing.nodeCount += 1;
77429
- }
77430
- return {
77431
- ordered: [...accumulators.values()].toSorted((a, b) => b.nodeCount - a.nodeCount || a.id - b.id),
77432
- regionOfNode
77433
- };
77434
- }
77435
- /**
77436
- * Collapse node-level edges into weighted links between drawn regions.
77437
- *
77438
- * Undirected: "these two areas talk" is the question at this altitude, and
77439
- * drawing both arcs doubles the ink for no added meaning.
77440
- */
77441
- function aggregateRegionLinks(graph, regionOfNode, shownIds) {
77442
- const linkWeights = /* @__PURE__ */ new Map();
77443
- for (const links of graph.outbound.values()) for (const link of links) {
77444
- const from = regionOfNode.get(link.source);
77445
- const to = regionOfNode.get(link.target);
77446
- if (from === void 0 || to === void 0 || from === to) continue;
77447
- if (!shownIds.has(from) || !shownIds.has(to)) continue;
77448
- const key = `${String(Math.min(from, to))}:${String(Math.max(from, to))}`;
77449
- linkWeights.set(key, (linkWeights.get(key) ?? 0) + 1);
77450
- }
77451
- return [...linkWeights.entries()].map(([key, weight]) => {
77452
- const [source, target] = key.split(":");
77453
- return {
77454
- source: Number(source),
77455
- target: Number(target),
77456
- weight
77457
- };
77458
- });
77459
- }
77460
- /**
77461
- * The default view: the repository as named regions.
77462
- *
77463
- * Regions come from graphify's own community detection, and their names come
77464
- * from the community's hub node — so a region is labelled `AIGateway.ts` or
77465
- * `IStorage`, something a person recognises, rather than "Community 469".
77466
- */
77467
- function buildSummary(graph) {
77468
- const { ordered, regionOfNode } = accumulateRegions(graph);
77469
- const shown = ordered.slice(0, 120);
77470
- const shownIds = new Set(shown.map((region) => region.id));
77471
- const regions = shown.map((region, index) => {
77472
- const position = spiralPosition(index, shown.length);
77473
- return {
77474
- id: region.id,
77475
- label: region.label,
77476
- nodeCount: region.nodeCount,
77477
- x: position.x,
77478
- y: position.y
77479
- };
77480
- });
77481
- return {
77482
- repoLabel: graph.repoLabel,
77483
- builtAtCommit: graph.builtAtCommit,
77484
- nodeCount: graph.nodes.size,
77485
- edgeCount: graph.edgeCount,
77486
- extractedEdgeCount: graph.extractedEdgeCount,
77487
- inferredEdgeCount: graph.inferredEdgeCount,
77488
- regionCount: ordered.length,
77489
- regions,
77490
- links: aggregateRegionLinks(graph, regionOfNode, shownIds),
77491
- truncatedRegions: Math.max(0, ordered.length - shown.length)
77492
- };
77493
- }
77494
- function summariseNode(graph, node) {
77495
- return {
77496
- id: node.id,
77497
- label: node.label ?? node.id,
77498
- kind: node._callable === true ? "symbol" : "file",
77499
- sourceFile: node.source_file ?? null,
77500
- sourceLocation: node.source_location ?? null,
77501
- regionId: node.community ?? null,
77502
- regionLabel: node.community_name ?? null,
77503
- degree: graph.degree.get(node.id) ?? 0
77504
- };
77505
- }
77506
- function toEdgeView(link) {
77507
- const relation = link.relation ?? "";
77508
- if (!isKnownRelation(relation)) return null;
77509
- const confidence = link.confidence === "INFERRED" ? "INFERRED" : "EXTRACTED";
77510
- return {
77511
- source: link.source,
77512
- target: link.target,
77513
- relation,
77514
- edgeClass: CODE_GRAPH_RELATION_CLASS[relation],
77515
- confidence,
77516
- confidenceScore: link.confidence_score ?? 1
77517
- };
77518
- }
77519
- /**
77520
- * Pull one node's neighbours into the result; return how many it had to drop.
77521
- *
77522
- * Split out of `buildNeighborhood` because the two read differently: the caller
77523
- * owns *how far to walk*, this owns *what one step collects*. Together they sat
77524
- * well past the repo's cognitive-complexity gate.
77525
- */
77526
- /** Links touching a node, most-connected neighbour first. */
77527
- function rankNeighbourLinks(graph, current) {
77528
- return [...graph.outbound.get(current) ?? [], ...graph.inbound.get(current) ?? []].toSorted((a, b) => {
77529
- const aOther = a.source === current ? a.target : a.source;
77530
- const bOther = b.source === current ? b.target : b.source;
77531
- return (graph.degree.get(bOther) ?? 0) - (graph.degree.get(aOther) ?? 0);
77532
- });
77533
- }
77534
- /** Take a neighbour into the result. False means the budget is spent. */
77535
- function admitNeighbour(state, id, node) {
77536
- if (state.included.has(id)) return true;
77537
- if (state.included.size >= 150) return false;
77538
- state.included.set(id, node);
77539
- state.next.push(id);
77540
- return true;
77541
- }
77542
- /** Record an edge once, dropping any relation this build cannot classify. */
77543
- function recordEdge(state, link) {
77544
- const edgeKey = `${link.source}>${link.target}:${link.relation ?? ""}`;
77545
- if (state.seenEdges.has(edgeKey)) return;
77546
- const view = toEdgeView(link);
77547
- if (view === null) return;
77548
- state.seenEdges.add(edgeKey);
77549
- state.edges.push(view);
77550
- }
77551
- /**
77552
- * Pull one node's neighbours into the result; return how many it had to drop.
77553
- *
77554
- * Split out of `buildNeighborhood` because the two read differently: the caller
77555
- * owns *how far to walk*, this owns *what one step collects*.
77556
- */
77557
- function expandNode(graph, current, state) {
77558
- let omitted = 0;
77559
- for (const link of rankNeighbourLinks(graph, current)) {
77560
- const other = link.source === current ? link.target : link.source;
77561
- const otherNode = graph.nodes.get(other);
77562
- if (otherNode === void 0) continue;
77563
- if (!admitNeighbour(state, other, otherNode)) {
77564
- omitted += 1;
77565
- continue;
77566
- }
77567
- recordEdge(state, link);
77568
- }
77569
- return omitted;
77570
- }
77571
- /**
77572
- * One node and what surrounds it.
77573
- *
77574
- * Two caps, and they do different jobs. `CODE_GRAPH_MAX_NEIGHBORS` bounds the
77575
- * answer so the canvas stays drawable. `CODE_GRAPH_MAX_FANOUT` bounds the
77576
- * *traversal*: a hub is included as a neighbor but never expanded through, so
77577
- * one `logger.ts` in the second ring cannot drag the entire repository in
77578
- * behind it. Without the second cap the first one is reached instantly and the
77579
- * result is 150 arbitrary nodes rather than the 150 nearest ones.
77580
- */
77581
- function buildNeighborhood(graph, nodeId, requestedDepth) {
77582
- const root = graph.nodes.get(nodeId);
77583
- if (root === void 0) return null;
77584
- const depth = Math.min(Math.max(1, requestedDepth), 2);
77585
- const included = new Map([[root.id, root]]);
77586
- const seenEdges = /* @__PURE__ */ new Set();
77587
- const edges = [];
77588
- let omittedCount = 0;
77589
- let frontier = [root.id];
77590
- for (let level = 0; level < depth; level += 1) {
77591
- const next = [];
77592
- for (const current of frontier) {
77593
- const fanout = graph.degree.get(current) ?? 0;
77594
- if (current !== root.id && fanout > 200) continue;
77595
- omittedCount += expandNode(graph, current, {
77596
- included,
77597
- seenEdges,
77598
- edges,
77599
- next
77600
- });
77601
- }
77602
- frontier = next;
77603
- if (frontier.length === 0) break;
77604
- }
77605
- const nodes = [...included.values()].filter((node) => node.id !== root.id).map((node) => summariseNode(graph, node)).toSorted((a, b) => b.degree - a.degree || a.label.localeCompare(b.label));
77606
- return {
77607
- root: summariseNode(graph, root),
77608
- nodes,
77609
- edges: edges.filter((edge) => included.has(edge.source) && included.has(edge.target)),
77610
- depth,
77611
- truncated: omittedCount > 0,
77612
- omittedCount
77613
- };
77614
- }
77615
- /**
77616
- * Rank one node against a query: lower is better, negative means no match.
77617
- *
77618
- * A file-path hit ranks last because "the query appears somewhere in this path"
77619
- * is much weaker evidence than "this thing is called that".
77620
- */
77621
- function matchScore(node, query) {
77622
- const label = (node.label ?? node.id).toLowerCase();
77623
- if (label === query) return 0;
77624
- if (label.startsWith(query)) return 1;
77625
- if (label.includes(query)) return 2;
77626
- return (node.source_file ?? "").toLowerCase().includes(query) ? 3 : -1;
77627
- }
77628
- /**
77629
- * Find a node by name or path.
77630
- *
77631
- * Entry to this surface is search, not the canvas — you usually arrive already
77632
- * knowing what you are looking for, and clicking around 34,000 nodes to find it
77633
- * is not a workflow. Ranking is exact, then prefix, then substring, with degree
77634
- * breaking ties so the `logger.ts` everything imports outranks a test fixture
77635
- * that merely shares the word.
77636
- */
77637
- function searchNodes(graph, rawQuery, limit = 40) {
77638
- const query = rawQuery.trim().toLowerCase();
77639
- if (query === "") return {
77640
- nodes: [],
77641
- truncated: false
77642
- };
77643
- const scored = [];
77644
- for (const node of graph.nodes.values()) {
77645
- const score = matchScore(node, query);
77646
- if (score < 0) continue;
77647
- scored.push({
77648
- node,
77649
- score
77650
- });
77651
- }
77652
- const ranked = scored.toSorted((a, b) => a.score - b.score || (graph.degree.get(b.node.id) ?? 0) - (graph.degree.get(a.node.id) ?? 0) || (a.node.label ?? a.node.id).localeCompare(b.node.label ?? b.node.id));
77653
- const capped = ranked.slice(0, limit);
77654
- return {
77655
- nodes: capped.map((entry) => summariseNode(graph, entry.node)),
77656
- truncated: ranked.length > capped.length
77657
- };
77658
- }
77659
- //#endregion
77660
- //#region src/codeGraph/graphArtifact.ts
77661
- /**
77662
- * Reading `graphify-out/graph.json` off disk, once.
77663
- *
77664
- * The artifact is 26 MB here and 40 MB for CMMD's server tree, and parsing it
77665
- * costs roughly a second. Every panel open would pay that again without a cache,
77666
- * so one indexed graph is held per project and reused until the file changes.
77667
- *
77668
- * Kept free of Effect on purpose: the failure modes worth distinguishing are all
77669
- * filesystem-shaped, and a plain promise keeps this unit-testable against real
77670
- * fixtures without constructing a runtime. `ws.ts` wraps it at the boundary.
77671
- */
77672
- const cache = /* @__PURE__ */ new Map();
77673
- /** Git LFS writes a pointer file that is valid text and useless as a graph. */
77674
- const LFS_POINTER_PREFIX = "version https://git-lfs.github.com/spec/v1";
77675
- function codeGraphArtifactPath(cwd) {
77676
- return path.join(cwd, CODE_GRAPH_ARTIFACT_PATH);
77677
- }
77678
- function isRawGraph(value) {
77679
- if (typeof value !== "object" || value === null) return false;
77680
- const candidate = value;
77681
- return Array.isArray(candidate.nodes) && Array.isArray(candidate.links);
77682
- }
77683
- /**
77684
- * Load and index the graph for one project checkout.
77685
- *
77686
- * The LFS-pointer case is called out separately rather than folded into
77687
- * "malformed" because it is the single most likely failure on a fresh clone —
77688
- * the file is present, tracked, and 133 bytes of metadata. Telling someone their
77689
- * graph is corrupt when they simply have not run `git lfs pull` sends them to
77690
- * rebuild something that is fine.
77691
- */
77692
- async function loadIndexedGraph(cwd) {
77693
- const artifactPath = codeGraphArtifactPath(cwd);
77694
- let stats;
77695
- try {
77696
- stats = await stat(artifactPath);
77697
- } catch {
77698
- return {
77699
- ok: false,
77700
- failure: {
77701
- kind: "missing",
77702
- artifactPath
77703
- }
77704
- };
77705
- }
77706
- if (!stats.isFile()) return {
77707
- ok: false,
77708
- failure: {
77709
- kind: "missing",
77710
- artifactPath
77711
- }
77712
- };
77713
- const cached = cache.get(artifactPath);
77714
- if (cached !== void 0 && cached.mtimeMs === stats.mtimeMs && cached.size === stats.size) return {
77715
- ok: true,
77716
- graph: cached.graph
77717
- };
77718
- let contents;
77719
- try {
77720
- contents = await readFile$1(artifactPath, "utf8");
77721
- } catch (error) {
77722
- return {
77723
- ok: false,
77724
- failure: {
77725
- kind: "unreadable",
77726
- artifactPath,
77727
- detail: error instanceof Error ? error.message : String(error)
77728
- }
77729
- };
77730
- }
77731
- if (contents.startsWith(LFS_POINTER_PREFIX)) return {
77732
- ok: false,
77733
- failure: {
77734
- kind: "lfs-pointer",
77735
- artifactPath
77736
- }
77737
- };
77738
- let parsed;
77739
- try {
77740
- parsed = JSON.parse(contents);
77741
- } catch (error) {
77742
- return {
77743
- ok: false,
77744
- failure: {
77745
- kind: "malformed",
77746
- artifactPath,
77747
- detail: error instanceof Error ? error.message : String(error)
77748
- }
77749
- };
77750
- }
77751
- if (!isRawGraph(parsed)) return {
77752
- ok: false,
77753
- failure: {
77754
- kind: "malformed",
77755
- artifactPath,
77756
- detail: "Expected an object with `nodes` and `links` arrays."
77757
- }
77758
- };
77759
- const graph = indexGraph(parsed, path.basename(cwd));
77760
- cache.set(artifactPath, {
77761
- mtimeMs: stats.mtimeMs,
77762
- size: stats.size,
77763
- graph
77764
- });
77765
- return {
77766
- ok: true,
77767
- graph
77768
- };
77769
- }
77770
- //#endregion
77771
- //#region src/codeGraph/service.ts
77772
- /**
77773
- * The code-graph RPC surface, as Effects.
77774
- *
77775
- * A thin seam between `ws.ts` and the pure aggregator: load the artifact, turn
77776
- * a filesystem failure into the tagged error the client can act on, and slice.
77777
- *
77778
- * The failure mapping is the substance here. Each reason produces different
77779
- * advice — pull LFS, run the extractor, report a corrupt file — so collapsing
77780
- * them into one "graph unavailable" would send people to fix the wrong thing.
77781
- */
77782
- function toUnavailable(failure) {
77783
- switch (failure.kind) {
77784
- case "missing": return new CodeGraphUnavailableError({
77785
- reason: "missing",
77786
- message: `No code graph in this checkout. Run \`graphify update .\` to build ${failure.artifactPath}.`
77787
- });
77788
- case "lfs-pointer": return new CodeGraphUnavailableError({
77789
- reason: "lfs-pointer",
77790
- message: `The graph is a Git LFS pointer, not the graph itself. Run \`git lfs pull\` to fetch it.`
77791
- });
77792
- case "malformed": return new CodeGraphUnavailableError({
77793
- reason: "malformed",
77794
- message: `The graph file could not be parsed: ${failure.detail}`
77795
- });
77796
- case "unreadable": return new CodeGraphUnavailableError({
77797
- reason: "unreadable",
77798
- message: `The graph file could not be read: ${failure.detail}`
77799
- });
77800
- }
77801
- }
77802
- function withGraph(cwd, use) {
77803
- return flatMap(promise(() => loadIndexedGraph(cwd)), (result) => result.ok ? succeed(use(result.graph)) : fail(toUnavailable(result.failure)));
77804
- }
77805
- function readCodeGraphSummary(input) {
77806
- return withGraph(input.cwd, buildSummary);
77807
- }
77808
- function readCodeGraphNeighborhood(input) {
77809
- return flatMap(withGraph(input.cwd, (graph) => buildNeighborhood(graph, input.nodeId, input.depth ?? 1)), (neighborhood) => neighborhood === null ? fail(new CodeGraphNodeNotFoundError({ nodeId: input.nodeId })) : succeed(neighborhood));
77810
- }
77811
- function readCodeGraphSearch(input) {
77812
- return withGraph(input.cwd, (graph) => searchNodes(graph, input.query, input.limit ?? 40));
77813
- }
77814
- //#endregion
77815
77134
  //#region src/checkpointing/Services/CheckpointDiffQuery.ts
77816
77135
  /**
77817
77136
  * CheckpointDiffQuery - Service tag for checkpoint diff queries.
@@ -94162,7 +93481,7 @@ const launchDetached = (launch) => gen(function* () {
94162
93481
  });
94163
93482
  const OpenLive = effect(Open, gen(function* () {
94164
93483
  const open = yield* tryPromise({
94165
- try: () => import("./open-D8mGyWmt.mjs"),
93484
+ try: () => import("./open-FIgTDosf.mjs"),
94166
93485
  catch: (cause) => new OpenError$1({
94167
93486
  message: "failed to load browser opener",
94168
93487
  cause
@@ -107314,9 +106633,6 @@ const makeWsRpcLayer = (currentSessionId, currentUserId) => WsRpcGroup.toLayer(g
107314
106633
  }))), { "rpc.aggregate": "workspace" }),
107315
106634
  [WS_METHODS.serverDiscoverSourceControl]: () => observeRpcEffect(WS_METHODS.serverDiscoverSourceControl, discoverSourceControl, { "rpc.aggregate": "server" }),
107316
106635
  [WS_METHODS.serverReportClientActivity]: () => observeRpcEffect(WS_METHODS.serverReportClientActivity, void_$1, { "rpc.aggregate": "server" }),
107317
- [WS_METHODS.codeGraphSummary]: (input) => observeRpcEffect(WS_METHODS.codeGraphSummary, readCodeGraphSummary(input), { "rpc.aggregate": "codeGraph" }),
107318
- [WS_METHODS.codeGraphNeighborhood]: (input) => observeRpcEffect(WS_METHODS.codeGraphNeighborhood, readCodeGraphNeighborhood(input), { "rpc.aggregate": "codeGraph" }),
107319
- [WS_METHODS.codeGraphSearch]: (input) => observeRpcEffect(WS_METHODS.codeGraphSearch, readCodeGraphSearch(input), { "rpc.aggregate": "codeGraph" }),
107320
106636
  [WS_METHODS.projectsWriteFile]: (input) => observeRpcEffect(WS_METHODS.projectsWriteFile, workspaceFileSystem.writeFile(input).pipe(mapError((cause) => {
107321
106637
  return new ProjectWriteFileError({
107322
106638
  message: is$1(WorkspacePathOutsideRootError)(cause) ? "Workspace file path must stay within the project root." : "Failed to write workspace file",
@@ -191641,7 +190957,7 @@ var Vce = {
191641
190957
  function Ve() {
191642
190958
  return Vce;
191643
190959
  }
191644
- var Us = $U.homedir(), lk = $U.tmpdir(), { env: Vc } = process$1, Yce = (e) => {
190960
+ var Us = os.homedir(), lk = os.tmpdir(), { env: Vc } = process$1, Yce = (e) => {
191645
190961
  let t = path.join(Us, "Library");
191646
190962
  return {
191647
190963
  data: path.join(t, "Application Support", e),
@@ -201841,12 +201157,12 @@ function qZ(e, t) {
201841
201157
  }
201842
201158
  return n;
201843
201159
  }
201844
- var os$1 = "https://code.claude.com/docs/en", kKe = [
201160
+ var os$2 = "https://code.claude.com/docs/en", kKe = [
201845
201161
  {
201846
201162
  matches: (e) => e.path === "permissions.defaultMode" && e.code === "invalid_value",
201847
201163
  tip: {
201848
201164
  suggestion: "Valid modes: \"acceptEdits\" (ask before file changes), \"plan\" (analysis only), \"bypassPermissions\" (auto-accept all), or \"default\" (standard behavior)",
201849
- docLink: `${os$1}/iam#permission-modes`
201165
+ docLink: `${os$2}/iam#permission-modes`
201850
201166
  }
201851
201167
  },
201852
201168
  {
@@ -201861,7 +201177,7 @@ var os$1 = "https://code.claude.com/docs/en", kKe = [
201861
201177
  matches: (e) => e.path.startsWith("env.") && e.code === "invalid_type",
201862
201178
  tip: {
201863
201179
  suggestion: "Environment variables must be strings. Wrap numbers and booleans in quotes. Example: \"DEBUG\": \"true\", \"PORT\": \"3000\"",
201864
- docLink: `${os$1}/settings#environment-variables`
201180
+ docLink: `${os$2}/settings#environment-variables`
201865
201181
  }
201866
201182
  },
201867
201183
  {
@@ -201872,14 +201188,14 @@ var os$1 = "https://code.claude.com/docs/en", kKe = [
201872
201188
  matches: (e) => e.path.startsWith("hooks.") && e.code === "invalid_key",
201873
201189
  tip: {
201874
201190
  suggestion: "Not a recognized hook event. Common events: PreToolUse, PostToolUse, UserPromptSubmit, SessionStart, SessionEnd, Stop. Check spelling and capitalization.",
201875
- docLink: `${os$1}/hooks`
201191
+ docLink: `${os$2}/hooks`
201876
201192
  }
201877
201193
  },
201878
201194
  {
201879
201195
  matches: (e) => /\.hooks\.\d+\.command$/.test(e.path) && e.code === "invalid_type" && e.received === "undefined",
201880
201196
  tip: {
201881
201197
  suggestion: "Command hooks require `command`. For exec form (no shell), set `command` to the executable and `args` to its arguments: {\"type\": \"command\", \"command\": \"echo\", \"args\": [\"hi\"]}. For shell form, set `command` to the full shell string: {\"type\": \"command\", \"command\": \"echo hi\"}.",
201882
- docLink: `${os$1}/hooks#exec-form-and-shell-form`
201198
+ docLink: `${os$2}/hooks#exec-form-and-shell-form`
201883
201199
  }
201884
201200
  },
201885
201201
  {
@@ -201894,7 +201210,7 @@ var os$1 = "https://code.claude.com/docs/en", kKe = [
201894
201210
  matches: (e) => e.code === "unrecognized_keys",
201895
201211
  tip: {
201896
201212
  suggestion: "Check for typos or refer to the documentation for valid fields",
201897
- docLink: `${os$1}/settings`
201213
+ docLink: `${os$2}/settings`
201898
201214
  }
201899
201215
  },
201900
201216
  {
@@ -201909,13 +201225,13 @@ var os$1 = "https://code.claude.com/docs/en", kKe = [
201909
201225
  matches: (e) => e.path === "permissions.additionalDirectories" && e.code === "invalid_type",
201910
201226
  tip: {
201911
201227
  suggestion: "Must be an array of directory paths. Example: [\"~/projects\", \"/tmp/workspace\"]. You can also use --add-dir flag or /add-dir command",
201912
- docLink: `${os$1}/iam#working-directories`
201228
+ docLink: `${os$2}/iam#working-directories`
201913
201229
  }
201914
201230
  }
201915
201231
  ], AKe = {
201916
- permissions: `${os$1}/iam#configuring-permissions`,
201917
- env: `${os$1}/settings#environment-variables`,
201918
- hooks: `${os$1}/hooks`
201232
+ permissions: `${os$2}/iam#configuring-permissions`,
201233
+ env: `${os$2}/settings#environment-variables`,
201234
+ hooks: `${os$2}/hooks`
201919
201235
  };
201920
201236
  function GZ(e) {
201921
201237
  let t = kKe.find((r) => r.matches(e));
@@ -269225,7 +268541,7 @@ var import_multicast_dns = /* @__PURE__ */ __toESM((/* @__PURE__ */ __commonJSMi
269225
268541
  var dgram = __require("dgram");
269226
268542
  var thunky = require_thunky();
269227
268543
  var events = __require("events");
269228
- var os = __require("os");
268544
+ var os$1 = __require("os");
269229
268545
  var noop = function() {};
269230
268546
  module.exports = function(opts) {
269231
268547
  if (!opts) opts = {};
@@ -269356,14 +268672,14 @@ var import_multicast_dns = /* @__PURE__ */ __toESM((/* @__PURE__ */ __commonJSMi
269356
268672
  return that;
269357
268673
  };
269358
268674
  function defaultInterface() {
269359
- var networks = os.networkInterfaces();
268675
+ var networks = os$1.networkInterfaces();
269360
268676
  var names = Object.keys(networks);
269361
268677
  for (var i = 0; i < names.length; i++) {
269362
268678
  var net = networks[names[i]];
269363
268679
  for (var j = 0; j < net.length; j++) {
269364
268680
  var iface = net[j];
269365
268681
  if (isIPv4(iface.family) && !iface.internal) {
269366
- if (os.platform() === "darwin" && names[i] === "en0") return iface.address;
268682
+ if (os$1.platform() === "darwin" && names[i] === "en0") return iface.address;
269367
268683
  return "0.0.0.0";
269368
268684
  }
269369
268685
  }
@@ -269371,7 +268687,7 @@ var import_multicast_dns = /* @__PURE__ */ __toESM((/* @__PURE__ */ __commonJSMi
269371
268687
  return "127.0.0.1";
269372
268688
  }
269373
268689
  function allInterfaces() {
269374
- var networks = os.networkInterfaces();
268690
+ var networks = os$1.networkInterfaces();
269375
268691
  var names = Object.keys(networks);
269376
268692
  var res = [];
269377
268693
  for (var i = 0; i < names.length; i++) {
@@ -298327,7 +297643,7 @@ function resolveBuildCommitFromEnv(env) {
298327
297643
  * environment descriptor down instead of reporting an honest "unknown".
298328
297644
  */
298329
297645
  function readBakedBuildCommit() {
298330
- return "b06001f4e16f7a336e9108920f9250b366862f3d";
297646
+ return "60c000d9c894e2ef04f90b602ddc8eb49c84980a";
298331
297647
  }
298332
297648
  async function resolveServerBuildCommit(input) {
298333
297649
  if (isFullCommitSha(input.baked)) return input.baked;
@@ -322683,7 +321999,7 @@ const connectLoginCommand = make$34("login", {
322683
321999
  })).json();
322684
322000
  },
322685
322001
  openBrowser: async (url) => {
322686
- const open = (await import("./open-D8mGyWmt.mjs")).default;
322002
+ const open = (await import("./open-FIgTDosf.mjs")).default;
322687
322003
  await open(url);
322688
322004
  return true;
322689
322005
  },