@principal-ai/subsystems-react 0.26.0 → 0.26.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/subsystem/SubsystemAggregateGraph.d.ts.map +1 -1
- package/dist/subsystem/SubsystemAggregateGraph.js +3 -2
- package/dist/subsystem/SubsystemAggregateGraph.js.map +1 -1
- package/dist/subsystem/SubsystemComponentGraph.d.ts +8 -0
- package/dist/subsystem/SubsystemComponentGraph.d.ts.map +1 -1
- package/dist/subsystem/SubsystemComponentGraph.js +25 -4
- package/dist/subsystem/SubsystemComponentGraph.js.map +1 -1
- package/dist/subsystem/graphChrome.d.ts +27 -0
- package/dist/subsystem/graphChrome.d.ts.map +1 -0
- package/dist/subsystem/graphChrome.js +30 -0
- package/dist/subsystem/graphChrome.js.map +1 -0
- package/package.json +1 -1
- package/src/subsystem/SubsystemAggregateGraph.tsx +5 -2
- package/src/subsystem/SubsystemComponentGraph.tsx +29 -18
- package/src/subsystem/graphChrome.tsx +41 -0
- package/dist/stories/Subsystem/ComponentGraph/aggregateFixture.d.ts +0 -5
- package/dist/stories/Subsystem/ComponentGraph/aggregateFixture.d.ts.map +0 -1
- package/dist/stories/Subsystem/ComponentGraph/aggregateFixture.js +0 -4
- package/dist/stories/Subsystem/ComponentGraph/aggregateFixture.js.map +0 -1
- package/dist/stories/Subsystem/ComponentGraph/composedFixture.d.ts +0 -5
- package/dist/stories/Subsystem/ComponentGraph/composedFixture.d.ts.map +0 -1
- package/dist/stories/Subsystem/ComponentGraph/composedFixture.js +0 -4
- package/dist/stories/Subsystem/ComponentGraph/composedFixture.js.map +0 -1
- package/src/stories/Subsystem/ComponentGraph/AggregateGraph.stories.tsx +0 -61
- package/src/stories/Subsystem/ComponentGraph/ComposedGraph.stories.tsx +0 -73
- package/src/stories/Subsystem/ComponentGraph/aggregateFixture.ts +0 -8
- package/src/stories/Subsystem/ComponentGraph/composedFixture.ts +0 -9
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
// GENERATED from live store data — do not hand-edit. Legacy keys stripped.
|
|
2
|
-
// MODELS: sg-1789512356216-zbiy5x0wb,sg-1789249246380-7iscyspb1,sg-1789677925327-bhekgwkc4,sg-1788970320680-bcv3xkg96,sg-1789513798636-ld358u4pr,sg-1789075684426-hqu0p9jfc,sg-1789078130739-z7z1qvwf4,sg-1788913589907-ieokymqg9,sg-1788914761888-v0kch2fs1,sg-1789167817307-w3wtd7e47,sg-1789054599792-4avspr98v,sg-1789577690053-1mbsoli8a,sg-1789244409127-fc6kmjrkp,sg-1789515244955-up4vbkmuk,sg-1788974222416-tvd82jthf,sg-1789619568543-5uww1cd5z,sg-1788961422683-bxt28y6yc
|
|
3
|
-
import type { SubsystemComponent, SubsystemRelation, SubsystemWalkthrough } from "../../../subsystem/model";
|
|
4
|
-
|
|
5
|
-
export const composedComponents: SubsystemComponent[] = JSON.parse("[{\"name\":\"Gist\",\"construct\":\"function\",\"role\":\"entry\",\"file\":\"site/src/pages/Gist.tsx\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#site/src/pages/Gist.tsx\",\"symbol\":\"Gist\",\"purpose\":\"Consumer surface: open a public gist URL and render the portable model.\",\"process\":\"site/web\",\"layer\":0,\"alias\":\"site-gist-page\"},{\"name\":\"loadSubsystemModelFromGist\",\"construct\":\"function\",\"file\":\"site/src/lib/gist.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#site/src/lib/gist.ts\",\"symbol\":\"loadSubsystemModelFromGist\",\"purpose\":\"Fetch and parse a public gist into a portable document (site viewer today).\",\"process\":\"site/web\",\"layer\":1,\"alias\":\"gist-load\"},{\"name\":\"toPortableDocument\",\"construct\":\"function\",\"file\":\"site/src/lib/gist.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#site/src/lib/gist.ts\",\"symbol\":\"toPortableDocument\",\"purpose\":\"Keep only shareable fields — what a gist file must contain.\",\"process\":\"site/web\",\"layer\":2,\"alias\":\"to-portable\"},{\"name\":\"isSubsystemModelDocument\",\"construct\":\"function\",\"file\":\"packages/subsystems-core/src/types/subsystem-model.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-core/src/types/subsystem-model.ts\",\"symbol\":\"isSubsystemModelDocument\",\"purpose\":\"Shallow-guard title + components[] + edges[].\",\"process\":\"subsystems-core/types\",\"layer\":2,\"alias\":\"is-portable\"},{\"name\":\"SubsystemModelDocument\",\"construct\":\"interface\",\"file\":\"packages/subsystems-core/src/types/subsystem-model.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-core/src/types/subsystem-model.ts\",\"symbol\":\"SubsystemModelDocument\",\"purpose\":\"Shareable standard — no host paths, store ids, or gist provenance.\",\"process\":\"subsystems-core/types\",\"layer\":3,\"alias\":\"portable-doc\"},{\"name\":\"SubsystemModelHostBinding\",\"construct\":\"interface\",\"file\":\"packages/subsystems-core/src/types/subsystem-model.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-core/src/types/subsystem-model.ts\",\"symbol\":\"SubsystemModelHostBinding\",\"purpose\":\"Machine envelope layered onto a portable document for local Studio use.\",\"process\":\"subsystems-core/types\",\"layer\":3,\"alias\":\"host-binding\"},{\"name\":\"GitHub Gists API\",\"construct\":\"external\",\"role\":\"service\",\"file\":\"\",\"purl\":\"external:api.github.com/gists\",\"purpose\":\"Create or update a public gist that holds the portable JSON.\",\"process\":\"external/github\",\"layer\":2,\"declaration\":{\"kind\":\"external\",\"attributes\":[{\"key\":\"read\",\"value\":\"GET /gists/{id}\"},{\"key\":\"create\",\"value\":\"POST /gists\"},{\"key\":\"update\",\"value\":\"PATCH /gists/{id}\"}]},\"declarationProvenance\":\"authored\",\"alias\":\"github-gists-api\"},{\"name\":\"SubsystemComponentGraph\",\"construct\":\"function\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"symbol\":\"SubsystemComponentGraph\",\"purpose\":\"Shared graph viewer for site gist pages and Studio model tabs.\",\"process\":\"subsystems-react/ui\",\"layer\":1,\"alias\":\"react-graph\",\"role\":\"entry\",\"module\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"framework\":\"react\",\"stereotype\":\"component\",\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"props\",\"type\":\"SubsystemComponentGraphProps\"}],\"returnType\":\"JSX.Element\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\"},{\"name\":\"createAction\",\"construct\":\"function\",\"role\":\"entry\",\"file\":\"packages/principal-studio-cli/src/commands/subsystem-model.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/principal-studio-cli/src/commands/subsystem-model.ts\",\"symbol\":\"createAction\",\"purpose\":\"Author path: validate payload and persist a new local sg- id.\",\"process\":\"principal-studio-cli\",\"layer\":0,\"alias\":\"cli-create\"},{\"name\":\"createSubsystemModel\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"symbol\":\"createSubsystemModel\",\"purpose\":\"Mint sg- id and write the hydrated record into the disk store.\",\"process\":\"subsystems-studio/host\",\"layer\":1,\"alias\":\"studio-create\",\"role\":\"entry\",\"module\":\"packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"doc\",\"type\":\"SubsystemModelDocument & { title: string; description?: string; walkthroughs?: SubsystemWalkthrough[] }\"}],\"returnType\":\"Promise<StoredSubsystemModel>\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\"},{\"name\":\"updateSubsystemModel\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"symbol\":\"updateSubsystemModel\",\"purpose\":\"Patch a local record in place — used to stamp or refresh the host gist ref.\",\"process\":\"subsystems-studio/host\",\"layer\":1,\"alias\":\"studio-update\"},{\"name\":\"getSubsystemModel\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"symbol\":\"getSubsystemModel\",\"purpose\":\"Read one hydrated record from the disk store by sg- id.\",\"process\":\"subsystems-studio/host\",\"layer\":1,\"alias\":\"studio-get\",\"module\":\"packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"id\",\"type\":\"string\"}],\"returnType\":\"Promise<StoredSubsystemModel | null>\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\"},{\"name\":\"~/.principal/subsystem-models\",\"construct\":\"store\",\"file\":\"\",\"purl\":\"external:file:~/.principal/subsystem-models\",\"purpose\":\"Shared on-disk store (<id>.json + _index.json). Studio host and the CLI both read/write here — the directory is not owned by either process.\",\"process\":\"local/disk\",\"layer\":2,\"declaration\":{\"kind\":\"store\",\"attributes\":[{\"key\":\"root\",\"value\":\"~/.principal/subsystem-models\"},{\"key\":\"record\",\"value\":\"<id>.json\"},{\"key\":\"index\",\"value\":\"_index.json\"},{\"key\":\"writers\",\"value\":\"subsystems-studio host + principal-studio-cli\"}]},\"declarationProvenance\":\"authored\",\"alias\":\"model-disk-store\"},{\"name\":\"indexEntryFor\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"symbol\":\"indexEntryFor\",\"purpose\":\"Build the lightweight listing row written into _index.json.\",\"process\":\"subsystems-studio/host\",\"layer\":2,\"alias\":\"index-entry\"},{\"name\":\"SubsystemModelsView\",\"construct\":\"function\",\"role\":\"entry\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelsView.tsx\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/mainview/views/SubsystemModelsView.tsx\",\"symbol\":\"SubsystemModelsView\",\"purpose\":\"Studio list of local models — one place a Share as gist action can live.\",\"process\":\"subsystems-studio/renderer\",\"layer\":0,\"alias\":\"studio-list\",\"module\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelsView.tsx\",\"framework\":\"react\",\"stereotype\":\"component\",\"declaration\":{\"kind\":\"function\",\"parameters\":[],\"returnType\":\"JSX.Element\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\"},{\"name\":\"SubsystemModelView\",\"construct\":\"function\",\"role\":\"entry\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"symbol\":\"SubsystemModelView\",\"purpose\":\"Open model tab chrome — alternate home for a per-model Gist button.\",\"process\":\"subsystems-studio/renderer\",\"layer\":0,\"alias\":\"studio-model-view\",\"module\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"framework\":\"react\",\"stereotype\":\"component\",\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"tabId\",\"type\":\"string\"},{\"name\":\"graphId\",\"type\":\"string\"}],\"returnType\":\"JSX.Element\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\"},{\"name\":\"openSubsystemModelTab\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/index.ts\",\"symbol\":\"openSubsystemModelTab\",\"purpose\":\"Focus or create a subsystem-model tab for a stored sg- id.\",\"process\":\"subsystems-studio/host\",\"layer\":1,\"alias\":\"open-tab\"},{\"name\":\"StudioGistShare\",\"construct\":\"external\",\"role\":\"entry\",\"file\":\"\",\"purl\":\"external:proposed\",\"purpose\":\"Proposed Gist button: publish the local model as a gist, or update the linked one.\",\"process\":\"proposed/studio-gist\",\"layer\":0,\"declaration\":{\"kind\":\"external\",\"attributes\":[{\"key\":\"surface\",\"value\":\"SubsystemModelsView or SubsystemModelView\"},{\"key\":\"action\",\"value\":\"Share as gist / Update gist\"},{\"key\":\"auth\",\"value\":\"GitHub token required for write\"}]},\"declarationProvenance\":\"authored\",\"alias\":\"gist-share-ui\"},{\"name\":\"StoredGistRef\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external:proposed\",\"purpose\":\"Host-only gist id (+ fileName) on the stored record and index so share updates the same gist.\",\"process\":\"proposed/studio-gist\",\"layer\":2,\"declaration\":{\"kind\":\"external\",\"attributes\":[{\"key\":\"shape\",\"value\":\"gist?: { id, fileName? }\"},{\"key\":\"livesOn\",\"value\":\"StoredSubsystemModel + _index entry\"},{\"key\":\"notIn\",\"value\":\"portable SubsystemModelDocument\"}]},\"declarationProvenance\":\"authored\",\"alias\":\"gist-ref\"},{\"name\":\"handleSubsystemModelRequest\",\"construct\":\"function\",\"role\":\"entry\",\"file\":\"packages/subsystems-studio/src/bun/http-server.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/http-server.ts\",\"symbol\":\"handleSubsystemModelRequest\",\"purpose\":\"Accepts PUT /api/subsystem-model/:id and patches the stored graph.\",\"process\":\"subsystems-studio/host\",\"layer\":1,\"alias\":\"http-put\",\"module\":\"packages/subsystems-studio/src/bun/http-server.ts\",\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"req\",\"type\":\"Request\"},{\"name\":\"url\",\"type\":\"URL\"}],\"returnType\":\"Promise<Response | null>\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\"},{\"name\":\"emitSubsystemModelChange\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"symbol\":\"emitSubsystemModelChange\",\"purpose\":\"Fan a graphId change into the registered host listener.\",\"process\":\"subsystems-studio/host\",\"layer\":2,\"alias\":\"emit\"},{\"name\":\"broadcastSubsystemModelChanged\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/index.ts\",\"symbol\":\"broadcastSubsystemModelChanged\",\"purpose\":\"Push subsystemModelChanged to the renderer over Electrobun RPC.\",\"process\":\"subsystems-studio/host\",\"layer\":3,\"alias\":\"broadcast\"},{\"name\":\"subsystemModelChangeSubscribers\",\"construct\":\"store\",\"file\":\"packages/subsystems-studio/src/mainview/rpc.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/mainview/rpc.ts\",\"symbol\":\"subsystemModelChangeSubscribers\",\"purpose\":\"Retained Set of renderer callbacks for subsystemModelChanged pushes.\",\"process\":\"subsystems-studio/renderer\",\"layer\":4,\"alias\":\"rpc-fanout\"},{\"name\":\"Inner\",\"construct\":\"function\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"symbol\":\"Inner\",\"purpose\":\"Owns two-pass ELK layout and layoutReady.\\nLanded: after Pass 1, kick Pass 2 from built — do not wait on remount.\",\"process\":\"subsystems-react\",\"layer\":6,\"alias\":\"graph-inner\"},{\"name\":\"subsystemGraphLayoutKey\",\"construct\":\"function\",\"file\":\"packages/subsystems-react/src/subsystem/model.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react/src/subsystem/model.ts\",\"symbol\":\"subsystemGraphLayoutKey\",\"purpose\":\"Hash layout-affecting fields so Pass 1 re-runs on content updates.\",\"process\":\"subsystems-react\",\"layer\":6,\"alias\":\"layout-key\"},{\"name\":\"measuredDimsRef\",\"construct\":\"store\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"symbol\":\"measuredDimsRef\",\"purpose\":\"Leaf node width/height bag.\\nLanded: prune stale ids on Pass 1; do not wipe the whole Map.\",\"process\":\"subsystems-react\",\"layer\":7,\"declaration\":{\"kind\":\"store\",\"properties\":[{\"name\":\"current\",\"type\":\"Map<string, { width: number; height: number }>\"}]},\"declarationProvenance\":\"authored\",\"alias\":\"measured-dims\"},{\"name\":\"buildSubsystemGraph\",\"construct\":\"function\",\"file\":\"packages/subsystems-react/src/subsystem/model.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react/src/subsystem/model.ts\",\"symbol\":\"buildSubsystemGraph\",\"purpose\":\"Run ELK for Pass 1 (estimate) and Pass 2 (measured sizes).\",\"process\":\"subsystems-react\",\"layer\":7,\"alias\":\"build-graph\",\"module\":\"packages/subsystems-react/src/subsystem/model.ts\",\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"doc\",\"type\":\"SubsystemModelDocument\"},{\"name\":\"opts\",\"type\":\"object\"}],\"returnType\":\"Promise<{ nodes; edges; regions }>\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\"},{\"name\":\"baseNodesKey\",\"construct\":\"function\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"symbol\":\"baseNodesKey\",\"purpose\":\"Remount ReactFlow only when node/edge id sets change.\\nKeep id-only — do not key on layoutKey (async Pass 1 race).\",\"process\":\"subsystems-react\",\"layer\":7,\"alias\":\"remount-key\"},{\"name\":\"triggerPass2\",\"construct\":\"function\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"symbol\":\"triggerPass2\",\"purpose\":\"Sets layoutReady true after measured ELK.\\nLanded: also invoked from a built effect after Pass 1, not only dimensions.\",\"process\":\"subsystems-react\",\"layer\":7,\"alias\":\"trigger-pass2\"},{\"name\":\"GraphLayoutCover\",\"construct\":\"function\",\"file\":\"packages/subsystems-react/src/subsystem/GraphLayoutCover.tsx\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react/src/subsystem/GraphLayoutCover.tsx\",\"symbol\":\"GraphLayoutCover\",\"purpose\":\"Shows Laying out graph until revealed flips true, then fades out.\",\"process\":\"subsystems-react\",\"layer\":8,\"alias\":\"layout-cover\"},{\"name\":\"AppHeader\",\"construct\":\"function\",\"role\":\"entry\",\"file\":\"packages/subsystems-studio/src/mainview/components/AppHeader.tsx\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/mainview/components/AppHeader.tsx\",\"symbol\":\"AppHeader\",\"purpose\":\"Poll the host for OpenCode v2 server health and open the live-sessions chip.\",\"process\":\"subsystems-studio/renderer\",\"layer\":0,\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"libraryActive\",\"type\":\"boolean\"}],\"returnType\":\"JSX.Element\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"app-header\"},{\"name\":\"ServerSessionsModal\",\"construct\":\"function\",\"role\":\"entry\",\"file\":\"packages/subsystems-studio/src/mainview/components/ServerSessionsModal.tsx\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/mainview/components/ServerSessionsModal.tsx\",\"symbol\":\"ServerSessionsModal\",\"purpose\":\"Poll recent OpenCode server sessions and merge live SSE last-event updates.\",\"process\":\"subsystems-studio/renderer\",\"layer\":0,\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"onClose\",\"type\":\"() => void\"}],\"returnType\":\"JSX.Element\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"server-sessions-modal\"},{\"name\":\"AgentSessionsOverviewView\",\"construct\":\"function\",\"role\":\"entry\",\"file\":\"packages/subsystems-studio/src/mainview/views/AgentSessions.tsx\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/mainview/views/AgentSessions.tsx\",\"symbol\":\"AgentSessionsOverviewView\",\"purpose\":\"Load historical agent sessions and kick off concept analysis for OpenCode rows.\",\"process\":\"subsystems-studio/renderer\",\"layer\":0,\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"active\",\"type\":\"boolean\"}],\"returnType\":\"JSX.Element\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"agent-sessions-overview\"},{\"name\":\"resolveOpencodeConnection\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/server-sessions.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/server-sessions.ts\",\"symbol\":\"resolveOpencodeConnection\",\"purpose\":\"Read service.json or server.json (or env overrides) to locate the running OpenCode v2 HTTP server.\",\"process\":\"subsystems-studio/host\",\"layer\":1,\"declaration\":{\"kind\":\"function\",\"parameters\":[],\"returnType\":\"OpencodeConnection | null\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"resolve-connection\"},{\"name\":\"probeOpencodeServer\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/server-sessions.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/server-sessions.ts\",\"symbol\":\"probeOpencodeServer\",\"purpose\":\"GET /api/health with Basic auth and report whether the OpenCode v2 server is healthy.\",\"process\":\"subsystems-studio/host\",\"layer\":1,\"declaration\":{\"kind\":\"function\",\"parameters\":[],\"returnType\":\"Promise<OpencodeServerStatus>\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"probe-server\"},{\"name\":\"listRecentServerSessions\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/server-sessions.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/server-sessions.ts\",\"symbol\":\"listRecentServerSessions\",\"purpose\":\"Merge /api/session, /api/session/active, and the live watch into recent ServerSessionRow rows.\",\"process\":\"subsystems-studio/host\",\"layer\":1,\"declaration\":{\"kind\":\"function\",\"parameters\":[],\"returnType\":\"Promise<{ ok: boolean; running: boolean; sessions: ServerSessionRow[] }>\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"list-server-sessions\"},{\"name\":\"setServerEventWatch\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/server-sessions.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/server-sessions.ts\",\"symbol\":\"setServerEventWatch\",\"purpose\":\"Start or stop the single /api/event SSE subscription that feeds live last-event state.\",\"process\":\"subsystems-studio/host\",\"layer\":1,\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"active\",\"type\":\"boolean\"},{\"name\":\"listener\",\"type\":\"(sessions: ServerSessionRow[]) => void\"}],\"returnType\":\"void\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"set-event-watch\"},{\"name\":\"buildSessionIndex\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/session-pipeline.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/session-pipeline.ts\",\"symbol\":\"buildSessionIndex\",\"purpose\":\"Scan opencode.db for windowed session summaries, parent/child task groups, and hasMore.\",\"process\":\"subsystems-studio/host\",\"layer\":1,\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"days\",\"type\":\"number\"}],\"returnType\":\"Promise<{ groups: SessionGroup[]; standalone: SessionSummary[]; hasMore?: boolean }>\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"build-session-index\"},{\"name\":\"processSessionEvents\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/session-pipeline.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/session-pipeline.ts\",\"symbol\":\"processSessionEvents\",\"purpose\":\"Load one session's opencode sqlite rows, convert to universal events, normalize, and accumulate.\",\"process\":\"subsystems-studio/host\",\"layer\":1,\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"sessionId\",\"type\":\"string\"},{\"name\":\"opts\",\"type\":\"{ includeRaw?: boolean; useCache?: boolean }\"}],\"returnType\":\"Promise<BuiltSessionEvents>\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"process-session-events\"},{\"name\":\"opencodeRowsToUniversalEvents\",\"construct\":\"function\",\"file\":\"packages/subsystems-core/src/opencode/pipeline.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-core/src/opencode/pipeline.ts\",\"symbol\":\"opencodeRowsToUniversalEvents\",\"purpose\":\"Decode raw OpenCode event DB rows into UniversalAgentSessionEvent envelopes.\",\"process\":\"subsystems-core\",\"layer\":2,\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"rows\",\"type\":\"OpenCodeEventRow[]\"}],\"returnType\":\"UniversalAgentSessionEvent[]\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"opencode-rows-to-universal\"},{\"name\":\"analyzeSessionInBackground\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/index.ts\",\"symbol\":\"analyzeSessionInBackground\",\"purpose\":\"Load session events, segment beats, build the extractor brief, and run OpenCode concept extraction.\",\"process\":\"subsystems-studio/host\",\"layer\":1,\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"opts\",\"type\":\"{ sessionId: string; title?: string; agent?: string }\"}],\"returnType\":\"void\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"analyze-session-bg\"},{\"name\":\"analyzeBeats\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/beat-analysis.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/beat-analysis.ts\",\"symbol\":\"analyzeBeats\",\"purpose\":\"Segment a session timeline into host-computed beats for the extractor brief.\",\"process\":\"subsystems-studio/host\",\"layer\":2,\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"sessionId\",\"type\":\"string\"},{\"name\":\"events\",\"type\":\"SessionEventRow[]\"}],\"returnType\":\"BeatAnalysis\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"analyze-beats\"},{\"name\":\"runOpenCodeExtraction\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/extraction.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/extraction.ts\",\"symbol\":\"runOpenCodeExtraction\",\"purpose\":\"Spawn opencode run with the concept-extractor agent and parse arc-summary JSON from the stream.\",\"process\":\"subsystems-studio/host\",\"layer\":2,\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"opts\",\"type\":\"{ primaryRepoRoot?: string; task: string }\"}],\"returnType\":\"Promise<ExtractionResult>\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"run-opencode-extraction\"},{\"name\":\"OpenCode v2 server\",\"construct\":\"external\",\"role\":\"service\",\"file\":\"\",\"purl\":\"external\",\"purpose\":\"Live OpenCode instance server exposing /api/health, /api/session, and /api/event.\",\"process\":\"opencode\",\"layer\":3,\"declaration\":{\"kind\":\"external\",\"attributes\":[{\"key\":\"endpoints\",\"value\":\"/api/health, /api/session, /api/session/active, /api/event\"},{\"key\":\"discovery\",\"value\":\"~/.local/state/opencode/service.json|server.json\"}]},\"declarationProvenance\":\"authored\",\"alias\":\"opencode-v2-server\"},{\"name\":\"OpenCode CLI\",\"construct\":\"external\",\"role\":\"service\",\"file\":\"\",\"purl\":\"external\",\"purpose\":\"Local opencode binary used for concept-extractor runs and the durable opencode.db store.\",\"process\":\"opencode\",\"layer\":3,\"declaration\":{\"kind\":\"external\",\"attributes\":[{\"key\":\"bin\",\"value\":\"OPENCODE_BIN / ~/.opencode/bin/opencode\"},{\"key\":\"db\",\"value\":\"~/.local/share/opencode/opencode.db\"},{\"key\":\"agent\",\"value\":\"concept-extractor\"}]},\"declarationProvenance\":\"authored\",\"alias\":\"opencode-cli\"},{\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/mainview/auditSubsystemModelFlow.ts\",\"layer\":2,\"name\":\"graphifyTargets\",\"process\":\"subsystems-studio/renderer\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/mainview/auditSubsystemModelFlow.ts\",\"purpose\":\"Collects unique component purls that need a graphify cache.\",\"symbol\":\"graphifyTargets\",\"alias\":\"graphify-targets\"},{\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/mainview/auditSubsystemModelFlow.ts\",\"layer\":2,\"name\":\"waitForGraphifyEnsure\",\"process\":\"subsystems-studio/renderer\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/mainview/auditSubsystemModelFlow.ts\",\"purpose\":\"Subscribes to graphifyChanged pushes while a cache build runs.\",\"symbol\":\"waitForGraphifyEnsure\",\"alias\":\"wait-graphify\"},{\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/graphify-store.ts\",\"layer\":3,\"name\":\"ensureGraphifyGraph\",\"process\":\"subsystems-studio/host\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/graphify-store.ts\",\"purpose\":\"Ensures a graphify graph.json cache exists for a purl at HEAD.\",\"symbol\":\"ensureGraphifyGraph\",\"alias\":\"ensure-graphify\"},{\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"layer\":3,\"name\":\"auditSubsystemModel\",\"process\":\"subsystems-studio/host\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"purpose\":\"Runs the dry-run deterministic audit across every component.\",\"symbol\":\"auditSubsystemModel\",\"alias\":\"audit-model\",\"role\":\"entry\",\"module\":\"packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"graphId\",\"type\":\"string\"}],\"returnType\":\"Promise<{ ok: true; report: SubsystemModelAuditReport; fingerprint: string } | { ok: false; error: string }>\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\"},{\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"layer\":4,\"name\":\"verifyModelFiles\",\"process\":\"subsystems-studio/host\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"purpose\":\"Checks files exist and symbols are declared for all components.\",\"symbol\":\"verifyModelFiles\",\"alias\":\"verify-files\",\"module\":\"packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"doc\",\"type\":\"SubsystemModelDocument & { walkthroughs?: SubsystemWalkthrough[] }\"}],\"returnType\":\"Promise<SubsystemModelVerification>\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\"},{\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"layer\":4,\"name\":\"verifySubsystemComponent\",\"process\":\"subsystems-studio/host\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"purpose\":\"Verifies one component against disk plus the graphify anchor.\",\"symbol\":\"verifySubsystemComponent\",\"alias\":\"verify-component\",\"module\":\"packages/subsystems-studio/src/bun/verify-subsystem-component.ts\"},{\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"layer\":5,\"name\":\"fileDeclaresSymbol\",\"process\":\"subsystems-studio/host\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"purpose\":\"Tests whether file contents declare a claimed symbol.\",\"symbol\":\"fileDeclaresSymbol\",\"alias\":\"declares-symbol\",\"module\":\"packages/subsystems-studio/src/bun/subsystem-model-store.ts\"},{\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/mainview/components/AuditResultsModal.tsx\",\"layer\":2,\"name\":\"AuditResultsModal\",\"process\":\"subsystems-studio/renderer\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/mainview/components/AuditResultsModal.tsx\",\"purpose\":\"Shows graphify progress then audit checks and findings.\",\"symbol\":\"AuditResultsModal\",\"alias\":\"audit-modal\"},{\"name\":\"createRegularAuditScheduler\",\"construct\":\"function\",\"role\":\"entry\",\"process\":\"subsystems-studio/host\",\"module\":\"packages/subsystems-studio/src/bun/regular-audit.ts\",\"file\":\"packages/subsystems-studio/src/bun/regular-audit.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/regular-audit.ts\",\"symbol\":\"createRegularAuditScheduler\",\"layer\":3,\"purpose\":\"Runs the dry-run audit over every stored model on a timeout chain while Studio is open.\",\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"deps\",\"type\":\"RegularAuditDeps\"}],\"returnType\":\"RegularAuditScheduler\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"regular-audit-scheduler\"},{\"name\":\"reauditSubsystemModelQuietly\",\"construct\":\"function\",\"process\":\"subsystems-studio/host\",\"module\":\"packages/subsystems-studio/src/bun/index.ts\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/index.ts\",\"symbol\":\"reauditSubsystemModelQuietly\",\"layer\":4,\"purpose\":\"Quietly re-audits one model and broadcasts that its audit changed.\",\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"graphId\",\"type\":\"string\"}],\"returnType\":\"Promise<void>\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"regular-audit-run\"},{\"name\":\"broadcastRegularAuditChanged\",\"construct\":\"function\",\"process\":\"subsystems-studio/host\",\"module\":\"packages/subsystems-studio/src/bun/index.ts\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/index.ts\",\"symbol\":\"broadcastRegularAuditChanged\",\"layer\":4,\"purpose\":\"Pushes the scheduler's live status to the renderer over RPC.\",\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"payload\",\"type\":\"StudioMessages[\\\"regularAuditChanged\\\"]\"}],\"returnType\":\"void\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"regular-audit-status\"},{\"name\":\"regularAuditChangeSubscribers\",\"construct\":\"store\",\"process\":\"subsystems-studio/renderer\",\"module\":\"packages/subsystems-studio/src/mainview/rpc.ts\",\"file\":\"packages/subsystems-studio/src/mainview/rpc.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/mainview/rpc.ts\",\"symbol\":\"regularAuditChangeSubscribers\",\"layer\":2,\"purpose\":\"Holds renderer callbacks registered for regular-audit status pushes.\",\"alias\":\"regular-audit-subscribers\"},{\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"layer\":3,\"name\":\"touchSubsystemModelOpened\",\"process\":\"subsystems-studio/host\",\"purpose\":\"Stamps lastOpenedAt with rewrite suppress window.\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"symbol\":\"touchSubsystemModelOpened\",\"alias\":\"open-stamp\"},{\"construct\":\"function\",\"file\":\"packages/subsystems-react/src/utils/elkLayout.ts\",\"layer\":5,\"name\":\"computeElkLayout\",\"process\":\"subsystems-studio/renderer\",\"purpose\":\"Computes orthogonal ELK layout on the main thread.\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react/src/utils/elkLayout.ts\",\"symbol\":\"computeElkLayout\",\"alias\":\"elk\",\"module\":\"packages/subsystems-react/src/utils/elkLayout.ts\",\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"nodes\",\"type\":\"Node[]\"},{\"name\":\"edges\",\"type\":\"Edge[]\"},{\"name\":\"options\",\"type\":\"ElkLayoutOptions\"}],\"returnType\":\"Promise<ElkLayoutResult>\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\"},{\"name\":\"App\",\"construct\":\"function\",\"role\":\"entry\",\"file\":\"packages/subsystems-studio/src/mainview/App.tsx\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/mainview/App.tsx\",\"symbol\":\"App\",\"purpose\":\"Switches active tab on tabsChanged without waiting on host.\",\"process\":\"subsystems-studio/renderer\",\"layer\":2,\"alias\":\"app-shell\",\"module\":\"packages/subsystems-studio/src/mainview/App.tsx\",\"framework\":\"react\",\"stereotype\":\"component\"},{\"name\":\"CenteredMessage\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/mainview/ui.tsx\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/mainview/ui.tsx\",\"symbol\":\"CenteredMessage\",\"purpose\":\"Renders loading and not-found placeholder while graph loads.\",\"process\":\"subsystems-studio/renderer\",\"layer\":3,\"alias\":\"empty-state\"},{\"name\":\"tabs\",\"construct\":\"store\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/index.ts\",\"symbol\":\"tabs\",\"purpose\":\"Holds open tab states keyed by id.\",\"process\":\"subsystems-studio/host\",\"layer\":2,\"alias\":\"tab-registry\",\"module\":\"packages/subsystems-studio/src/bun/index.ts\"},{\"name\":\"MaintainModelPickerModal\",\"construct\":\"function\",\"role\":\"entry\",\"file\":\"packages/subsystems-studio/src/mainview/components/MaintainModelPickerModal.tsx\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/mainview/components/MaintainModelPickerModal.tsx\",\"symbol\":\"MaintainModelPickerModal\",\"purpose\":\"Lets the user pick a free OpenCode model and start a Maintain run over Electrobun RPC.\",\"process\":\"subsystems-studio/renderer\",\"layer\":0,\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"graphId\",\"type\":\"string\"},{\"name\":\"mode\",\"type\":\"\\\"issues\\\" | \\\"gaps\\\"\"},{\"name\":\"onStarted\",\"type\":\"(info) => void\"}],\"returnType\":\"JSX.Element\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"maintain-picker\"},{\"name\":\"maintainSubsystemModelInBackground\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/index.ts\",\"symbol\":\"maintainSubsystemModelInBackground\",\"purpose\":\"Returns immediately from RPC, tracks in-flight graphs, and broadcasts Maintain lifecycle to the renderer.\",\"process\":\"subsystems-studio/host\",\"layer\":1,\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"graphId\",\"type\":\"string\"},{\"name\":\"opts\",\"type\":\"{ model?: string }\"}],\"returnType\":\"void\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"maintain-background\"},{\"name\":\"maintainSubsystemModel\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/maintain-model.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/maintain-model.ts\",\"symbol\":\"maintainSubsystemModel\",\"purpose\":\"Ensures OpenCode V2 runtime and Maintain agents, audits the model, routes by verdict, builds the brief, then runs the chosen agent.\",\"process\":\"subsystems-studio/host\",\"layer\":2,\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"graphId\",\"type\":\"string\"},{\"name\":\"opts\",\"type\":\"{ model?: string }\"}],\"returnType\":\"Promise<MaintainModelResult>\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"maintain-orchestrator\"},{\"name\":\"runMaintainAgent\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/maintain-model.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/maintain-model.ts\",\"symbol\":\"runMaintainAgent\",\"purpose\":\"After Studio has ensured the V2 runtime, create/prompt a session and subscribe to SSE. Today this still spawns opencode run.\",\"process\":\"subsystems-studio/host\",\"layer\":3,\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"agent\",\"type\":\"MaintainAgentId\"},{\"name\":\"task\",\"type\":\"string\"},{\"name\":\"model\",\"type\":\"string\"}],\"returnType\":\"Promise<{ ok: boolean; summary?: string; error?: string }>\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"run-maintain-agent\"},{\"name\":\"OpenCodeV2Service\",\"construct\":\"external\",\"role\":\"service\",\"file\":\"\",\"purl\":\"external:opencode/v2-service\",\"purpose\":\"Shared OpenCode 2 background server. Studio starts it via Service.ensure after the opencode2 binary is present and up to date.\",\"process\":\"opencode/v2\",\"layer\":4,\"declaration\":{\"kind\":\"external\",\"attributes\":[{\"key\":\"package\",\"value\":\"@opencode/client@beta\"},{\"key\":\"ensure\",\"value\":\"Service.ensure()\"},{\"key\":\"events\",\"value\":\"GET /api/event (SSE)\"},{\"key\":\"prompt\",\"value\":\"session.create + session.prompt\"}]},\"declarationProvenance\":\"authored\",\"alias\":\"opencode-v2-service\"},{\"name\":\"MaintainAgent\",\"construct\":\"external\",\"role\":\"service\",\"file\":\"\",\"purl\":\"external:opencode/maintain-agent\",\"purpose\":\"issue-fixer or gap-filler agent that investigates audit findings and POSTs correction proposals to Studio HTTP.\",\"process\":\"opencode/v2\",\"layer\":5,\"declaration\":{\"kind\":\"external\",\"attributes\":[{\"key\":\"agents\",\"value\":\"issue-fixer | gap-filler\"},{\"key\":\"edit\",\"value\":\"deny\"},{\"key\":\"proposeVia\",\"value\":\"curl Studio :3045\"}]},\"declarationProvenance\":\"authored\",\"alias\":\"maintain-agent\"},{\"name\":\"createSubsystemModelProposal\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/proposal-store.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/proposal-store.ts\",\"symbol\":\"createSubsystemModelProposal\",\"purpose\":\"Persists a pending human-confirmable proposal with rationale, changes, and preview.\",\"process\":\"subsystems-studio/host\",\"layer\":4,\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"input\",\"type\":\"{ graphId; rationale; changes; author? }\"}],\"returnType\":\"Promise<{ ok: true; proposal } | { ok: false; error }>\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"create-proposal\",\"role\":\"entry\",\"module\":\"packages/subsystems-studio/src/bun/proposal-store.ts\"},{\"name\":\"resolveOpencode2Bin\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/opencode-v2.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/opencode-v2.ts\",\"symbol\":\"resolveOpencode2Bin\",\"purpose\":\"Resolve the opencode2 binary from OPENCODE2_BIN, PATH, or ~/.opencode/bin.\",\"process\":\"subsystems-studio/host\",\"layer\":3,\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"bin\",\"type\":\"string?\"}],\"returnType\":\"string | null\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"opencode-bin\"},{\"name\":\"OpenCodeV2Lifecycle\",\"construct\":\"external\",\"role\":\"service\",\"file\":\"\",\"purl\":\"external:studio/opencode-v2-lifecycle\",\"purpose\":\"Studio-managed OpenCode V2 lifecycle. First slice: debug tab detect/install/update via getOpencodeV2Status + installOpencodeV2; Service.ensure comes next.\",\"process\":\"subsystems-studio/host\",\"layer\":3,\"declaration\":{\"kind\":\"external\",\"attributes\":[{\"key\":\"detect\",\"value\":\"which opencode2 / OPENCODE2_BIN / version\"},{\"key\":\"install\",\"value\":\"npm i -g @opencode-ai/cli@beta or v2 install script\"},{\"key\":\"update\",\"value\":\"compare installed vs npm beta; upgrade when behind\"},{\"key\":\"ensure\",\"value\":\"Service.ensure({ command: [bin, 'serve', '--service'] })\"},{\"key\":\"pattern\",\"value\":\"mirrors studio-version.ts detect + update\"}]},\"declarationProvenance\":\"authored\",\"alias\":\"opencode-v2-lifecycle\"},{\"name\":\"OpenCodeCliNpm\",\"construct\":\"external\",\"role\":\"service\",\"file\":\"\",\"purl\":\"external:npm/@opencode-ai/cli@beta\",\"purpose\":\"npm beta distribution of opencode2 that Studio installs or updates when the binary is missing or behind.\",\"process\":\"opencode/v2\",\"layer\":4,\"declaration\":{\"kind\":\"external\",\"attributes\":[{\"key\":\"package\",\"value\":\"@opencode-ai/cli@beta\"},{\"key\":\"bin\",\"value\":\"opencode2\"},{\"key\":\"alt\",\"value\":\"curl -fsSL https://opencode.ai/v2/install | bash\"}]},\"declarationProvenance\":\"authored\",\"alias\":\"opencode-cli-npm\"},{\"name\":\"OpencodeV2DebugView\",\"construct\":\"function\",\"role\":\"entry\",\"file\":\"packages/subsystems-studio/src/mainview/views/OpencodeV2DebugView.tsx\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/mainview/views/OpencodeV2DebugView.tsx\",\"symbol\":\"OpencodeV2DebugView\",\"purpose\":\"Debug tab that shows whether opencode2 is installed and can install or update the beta CLI.\",\"process\":\"subsystems-studio/renderer\",\"layer\":0,\"declaration\":{\"kind\":\"function\",\"parameters\":[],\"returnType\":\"JSX.Element\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"opencode-v2-debug-view\"},{\"name\":\"getOpencodeV2Status\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/opencode-v2.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/opencode-v2.ts\",\"symbol\":\"getOpencodeV2Status\",\"purpose\":\"Detect whether opencode2 is on PATH or under OPENCODE2_BIN and report install metadata.\",\"process\":\"subsystems-studio/host\",\"layer\":3,\"declaration\":{\"kind\":\"function\",\"parameters\":[],\"returnType\":\"OpencodeV2Status\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"get-opencode-v2-status\"},{\"name\":\"installOpencodeV2\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/opencode-v2.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/opencode-v2.ts\",\"symbol\":\"installOpencodeV2\",\"purpose\":\"Install @opencode-ai/cli@beta globally when opencode2 is missing.\",\"process\":\"subsystems-studio/host\",\"layer\":3,\"declaration\":{\"kind\":\"function\",\"parameters\":[],\"returnType\":\"Promise<InstallOpencodeV2Result>\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"install-opencode-v2\"},{\"name\":\"StudioMessageSubscriber\",\"construct\":\"type_alias\",\"proposed\":true,\"file\":\"packages/subsystems-studio/src/mainview/rpc.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/mainview/rpc.ts\",\"symbol\":\"StudioMessageSubscriber\",\"purpose\":\"Parametrized callback contract — (payload: StudioMessages[K]) => void — that every subscriber Set instantiates. Migration preview: extracting the inline Set generics into this named alias so the contract is a verifiable type_alias instead of store claims.\",\"process\":\"subsystems-studio/renderer\",\"layer\":1,\"declarationProvenance\":\"authored\",\"declaration\":{\"kind\":\"type\",\"properties\":[],\"usedBy\":[],\"implementors\":[]},\"alias\":\"studio-message-subscriber\"},{\"name\":\"renderStaticView\",\"construct\":\"function\",\"role\":\"entry\",\"file\":\"packages/subsystems-studio/src/mainview/App.tsx\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/mainview/App.tsx\",\"symbol\":\"renderStaticView\",\"purpose\":\"Mount Maintenance Sessions as AgentSessionsOverviewView with scope maintain.\",\"process\":\"subsystems-studio/renderer\",\"layer\":0,\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"tabId\",\"type\":\"string\"},{\"name\":\"active\",\"type\":\"boolean\"}],\"returnType\":\"ReactNode | null\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"render-static-view\"},{\"name\":\"buildAgentSessionsView\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/mainview/views/AgentSessions.tsx\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/mainview/views/AgentSessions.tsx\",\"symbol\":\"buildAgentSessionsView\",\"purpose\":\"Turn processed SessionEventRow timelines into panel AgentSessionView rows.\",\"process\":\"subsystems-studio/renderer\",\"layer\":2,\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"opts\",\"type\":\"object\"}],\"returnType\":\"AgentSessionsView | null\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"build-agent-sessions-view\"},{\"name\":\"listMaintainSessions\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/maintain-sessions.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/maintain-sessions.ts\",\"symbol\":\"listMaintainSessions\",\"purpose\":\"Discover Maintain runs from session_v2 (and legacy session) by agent or Maintain title.\",\"process\":\"subsystems-studio/host\",\"layer\":2,\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"opts\",\"type\":\"{ days?: number; limit?: number }\"}],\"returnType\":\"Promise<{ sessions: SessionSummary[]; hasMore: boolean }>\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"list-maintain-sessions\"},{\"name\":\"getAgentSessionsOverview\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/index.ts\",\"symbol\":\"getAgentSessionsOverview\",\"purpose\":\"Host RPC that lists Maintain sessions then processes each id into a timeline snapshot.\",\"process\":\"subsystems-studio/host\",\"layer\":2,\"declarationProvenance\":\"authored\",\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"days\",\"type\":\"number?\"},{\"name\":\"scope\",\"type\":\"\\\"agents\\\" | \\\"maintain\\\"?\"}],\"returnType\":\"Promise<OverviewResponse>\",\"callers\":[],\"callees\":[]},\"alias\":\"rpc-overview\"},{\"name\":\"runOpencodeV2AgentSession\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/opencode-v2-live.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/opencode-v2-live.ts\",\"symbol\":\"runOpencodeV2AgentSession\",\"purpose\":\"Create and prompt a Maintain session on the running opencode2 HTTP service.\",\"process\":\"subsystems-studio/host\",\"layer\":1,\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"opts\",\"type\":\"RunOpencodeV2AgentSessionOpts\"}],\"returnType\":\"Promise<{ ok: boolean; sessionId?: string }>\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"run-opencode-v2-session\"},{\"name\":\"opencode2 serve\",\"construct\":\"external\",\"role\":\"service\",\"file\":\"\",\"purl\":\"external:opencode2\",\"purpose\":\"Running OpenCode V2 HTTP service that owns session create/prompt and SQLite writes.\",\"process\":\"opencode2/service\",\"layer\":5,\"declaration\":{\"kind\":\"external\",\"attributes\":[{\"key\":\"url\",\"value\":\"service.json → localhost\"},{\"key\":\"db\",\"value\":\"~/.local/share/opencode/opencode.db\"}]},\"declarationProvenance\":\"authored\",\"alias\":\"opencode2-service\"},{\"name\":\"resolveOpencodeSessionKind\",\"construct\":\"function\",\"proposed\":true,\"file\":\"packages/subsystems-studio/src/bun/opencode-v2-messages.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/opencode-v2-messages.ts\",\"symbol\":\"resolveOpencodeSessionKind\",\"purpose\":\"Classify an OpenCode id as v2 (session_v2 row) or v1 (session row) before choosing a transcript reader.\",\"process\":\"subsystems-studio/host\",\"layer\":2,\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"sessionId\",\"type\":\"string\"}],\"returnType\":\"\\\"v2\\\" | \\\"v1\\\" | null\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"resolve-kind\"},{\"name\":\"sessionMessagesToUniversalEvents\",\"construct\":\"function\",\"proposed\":true,\"file\":\"packages/subsystems-studio/src/bun/opencode-v2-messages.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/opencode-v2-messages.ts\",\"symbol\":\"sessionMessagesToUniversalEvents\",\"purpose\":\"Map V2 session_message user/assistant parts into UniversalAgentSessionEvent.\",\"process\":\"subsystems-studio/host\",\"layer\":3,\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"sessionId\",\"type\":\"string\"},{\"name\":\"messages\",\"type\":\"SessionMessageRow[]\"}],\"returnType\":\"UniversalAgentSessionEvent[]\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"session-messages-to-universal\"},{\"name\":\"accumulateEvents\",\"construct\":\"function\",\"file\":\"packages/subsystems-core/src/opencode/pipeline.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-core/src/opencode/pipeline.ts\",\"symbol\":\"accumulateEvents\",\"purpose\":\"Turn normalized universal events into panel AgentSessionEvent timeline rows.\",\"process\":\"subsystems-studio/host\",\"layer\":4,\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"normalized\",\"type\":\"RepoNormalizedUniversalAgentSessionEvent[]\"},{\"name\":\"sessionTitle\",\"type\":\"string\"}],\"returnType\":\"AccumulatedEntry[]\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"accumulate-events\"},{\"name\":\"session (opencode.db)\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external:opencode.db/session\",\"purpose\":\"OpenCode V1 session metadata table — accessed when resolving kind v1 and listing legacy Maintain rows.\",\"process\":\"opencode/sqlite\",\"layer\":5,\"role\":\"service\",\"declaration\":{\"kind\":\"external\",\"attributes\":[{\"key\":\"db\",\"value\":\"~/.local/share/opencode/opencode.db\"},{\"key\":\"table\",\"value\":\"session\"},{\"key\":\"access\",\"value\":\"sqlite read from Studio host\"}]},\"declarationProvenance\":\"authored\",\"alias\":\"store-session\"},{\"name\":\"session_v2 (opencode.db)\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external:opencode.db/session-v2\",\"purpose\":\"OpenCode V2 session metadata table — accessed by listMaintainSessions and kind resolution.\",\"process\":\"opencode/sqlite\",\"layer\":5,\"role\":\"service\",\"declaration\":{\"kind\":\"external\",\"attributes\":[{\"key\":\"db\",\"value\":\"~/.local/share/opencode/opencode.db\"},{\"key\":\"table\",\"value\":\"session-v2\"},{\"key\":\"access\",\"value\":\"sqlite read from Studio host\"}]},\"declarationProvenance\":\"authored\",\"alias\":\"store-session-v2\"},{\"name\":\"event (opencode.db)\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external:opencode.db/event\",\"purpose\":\"OpenCode V1 event stream table — accessed by processSessionEvents for v1 timelines.\",\"process\":\"opencode/sqlite\",\"layer\":5,\"role\":\"service\",\"declaration\":{\"kind\":\"external\",\"attributes\":[{\"key\":\"db\",\"value\":\"~/.local/share/opencode/opencode.db\"},{\"key\":\"table\",\"value\":\"event\"},{\"key\":\"access\",\"value\":\"sqlite read from Studio host\"}]},\"declarationProvenance\":\"authored\",\"alias\":\"store-event\"},{\"name\":\"session_message (opencode.db)\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external:opencode.db/session-message\",\"purpose\":\"OpenCode V2 message transcript table — planned access target for v2 timelines.\",\"process\":\"opencode/sqlite\",\"layer\":5,\"role\":\"service\",\"declaration\":{\"kind\":\"external\",\"attributes\":[{\"key\":\"db\",\"value\":\"~/.local/share/opencode/opencode.db\"},{\"key\":\"table\",\"value\":\"session-message\"},{\"key\":\"access\",\"value\":\"sqlite read from Studio host\"}]},\"declarationProvenance\":\"authored\",\"alias\":\"store-session-message\"},{\"name\":\"SubsystemComponent\",\"construct\":\"interface\",\"role\":\"entry\",\"file\":\"packages/subsystems-core/src/types/subsystem-model.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-core/src/types/subsystem-model.ts\",\"symbol\":\"SubsystemComponent\",\"purpose\":\"Own the portable schema contract, including authored declaration shape and provenance.\",\"process\":\"subsystems-core\",\"layer\":1,\"declaration\":{\"kind\":\"type\",\"properties\":[{\"name\":\"declaration\",\"type\":\"SubsystemConstructDeclaration?\"},{\"name\":\"declarationProvenance\",\"type\":\"SubsystemDeclarationProvenance?\"},{\"name\":\"declarationRef\",\"type\":\"SubsystemDeclarationRef?\"}],\"usedBy\":[],\"implementors\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"core-component\"},{\"name\":\"SubsystemConstructDeclaration\",\"construct\":\"type_alias\",\"file\":\"packages/subsystems-core/src/types/subsystem-model.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-core/src/types/subsystem-model.ts\",\"symbol\":\"SubsystemConstructDeclaration\",\"purpose\":\"Discriminated declaration union (params, members, type buckets) that agents and the CLI are told to author.\",\"process\":\"subsystems-core\",\"layer\":1,\"declaration\":{\"kind\":\"type\",\"unionOf\":[\"SubsystemClassDeclaration\",\"SubsystemFunctionDeclaration\",\"SubsystemMethodDeclaration\",\"SubsystemTypeDeclaration\",\"SubsystemModuleDeclaration\",\"SubsystemExternalDeclaration\",\"SubsystemStoreDeclaration\",\"SubsystemCustomEntityDeclaration\"],\"properties\":[],\"usedBy\":[],\"implementors\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"core-declaration\"},{\"name\":\"SubsystemComponent\",\"construct\":\"interface\",\"file\":\"packages/subsystems-react/src/subsystem/model.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react/src/subsystem/model.ts\",\"symbol\":\"SubsystemComponent\",\"purpose\":\"Mirror the node in the react package, still carrying the vestigial detail drill-down fields the renderer consumes.\",\"process\":\"subsystems-react\",\"layer\":2,\"declaration\":{\"kind\":\"type\",\"properties\":[{\"name\":\"detail\",\"type\":\"GraphifyComponentDetail?\"},{\"name\":\"detailProvenance\",\"type\":\"'verified' | 'authored'?\"},{\"name\":\"tokens\",\"type\":\"SubsystemDeclToken[]?\"},{\"name\":\"declarationRef\",\"type\":\"SubsystemDeclarationRef?\"}],\"usedBy\":[],\"implementors\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"react-component\"},{\"name\":\"GraphifyComponentDetail\",\"construct\":\"type_alias\",\"file\":\"packages/subsystems-react/src/graphify/consolidated.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react/src/graphify/consolidated.ts\",\"symbol\":\"GraphifyComponentDetail\",\"purpose\":\"Parallel kind-discriminated payload that covers the same ground as schema declaration inside the react/graphify layer.\",\"process\":\"subsystems-react\",\"layer\":2,\"declaration\":{\"kind\":\"type\",\"unionOf\":[\"GraphifyClassDetail\",\"GraphifyFunctionDetail\",\"GraphifyMethodDetail\",\"GraphifyTypeDetail\",\"GraphifyModuleDetail\",\"GraphifyExternalDetail\",\"GraphifyCustomEntityDetail\",\"GraphifyStoreDetail\"],\"properties\":[],\"usedBy\":[],\"implementors\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"graphify-detail\"},{\"name\":\"normalizeDetailProvenance\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"symbol\":\"normalizeDetailProvenance\",\"purpose\":\"Backfill detail provenance and per-kind arrays so the store stays synced with the vestigial detail schema.\",\"process\":\"subsystems-studio/host\",\"layer\":2,\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"components\",\"type\":\"unknown\"}],\"returnType\":\"void\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"normalize-detail\"},{\"name\":\"buildDetailFromAdoptedSignature\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"symbol\":\"buildDetailFromAdoptedSignature\",\"purpose\":\"Map graphify verified parameter and return bags into a detail payload during audit adopt-signature fixes.\",\"process\":\"subsystems-studio/host\",\"layer\":2,\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"component\",\"type\":\"SubsystemComponent\"},{\"name\":\"parameterTypes\",\"type\":\"string[]\"},{\"name\":\"returnTypes\",\"type\":\"string[]\"}],\"returnType\":\"NonNullable<SubsystemComponent['detail']>\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"adopt-detail\"},{\"name\":\"generateDeclarationString\",\"construct\":\"function\",\"file\":\"packages/subsystems-react/src/subsystem/formatDeclaration.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react/src/subsystem/formatDeclaration.ts\",\"symbol\":\"generateDeclarationString\",\"purpose\":\"Turn the click-panel source string from component.detail only — missing detail yields construct defaults like type X = unknown.\",\"process\":\"subsystems-react\",\"layer\":3,\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"component\",\"type\":\"SubsystemComponent\"}],\"returnType\":\"string\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"generate-decl-string\"},{\"name\":\"tokenizeComponent\",\"construct\":\"function\",\"file\":\"packages/subsystems-react/src/subsystem/tokenizeComponent.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react/src/subsystem/tokenizeComponent.ts\",\"symbol\":\"tokenizeComponent\",\"purpose\":\"Prefer wire tokens, otherwise generate, Prettier-format, and tokenize the declaration string for the panel.\",\"process\":\"subsystems-react\",\"layer\":3,\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"component\",\"type\":\"SubsystemComponent\"},{\"name\":\"printWidth\",\"type\":\"number\"},{\"name\":\"themeName\",\"type\":\"PierreSyntaxThemeName\"}],\"returnType\":\"Promise<SubsystemDeclToken[]>\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"tokenize-component\"},{\"name\":\"ComponentDeclaration\",\"construct\":\"function\",\"file\":\"packages/subsystems-react/src/subsystem/ComponentDeclaration.tsx\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react/src/subsystem/ComponentDeclaration.tsx\",\"symbol\":\"ComponentDeclaration\",\"purpose\":\"Render the click panel by tokenizing the selected component and painting declaration lines.\",\"process\":\"subsystems-react\",\"layer\":4,\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"props\",\"type\":\"ComponentDeclarationProps\"}],\"returnType\":\"JSX.Element\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"component-declaration\"},{\"name\":\"convertSubsystemToNodes\",\"construct\":\"function\",\"symbol\":\"convertSubsystemToNodes\",\"file\":\"packages/subsystems-react/src/subsystem/model.ts\",\"module\":\"packages/subsystems-react/src/subsystem/model.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react\",\"purpose\":\"Stamps leaf parentId — module wins over process when both are set.\",\"layer\":3,\"alias\":\"to-nodes\"},{\"name\":\"getSubsystemRegions\",\"construct\":\"function\",\"symbol\":\"getSubsystemRegions\",\"file\":\"packages/subsystems-react/src/subsystem/model.ts\",\"module\":\"packages/subsystems-react/src/subsystem/model.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react\",\"purpose\":\"Collects multi-member process boundary regions.\",\"layer\":3,\"alias\":\"process-regions\"},{\"name\":\"getSubsystemModuleRegions\",\"construct\":\"function\",\"symbol\":\"getSubsystemModuleRegions\",\"file\":\"packages/subsystems-react/src/subsystem/model.ts\",\"module\":\"packages/subsystems-react/src/subsystem/model.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react\",\"purpose\":\"Collects multi-member module boundary regions.\",\"layer\":3,\"alias\":\"module-regions\"},{\"name\":\"boundaryGroupNodeId\",\"construct\":\"function\",\"symbol\":\"boundaryGroupNodeId\",\"file\":\"packages/subsystems-react/src/subsystem/model.ts\",\"module\":\"packages/subsystems-react/src/subsystem/model.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react\",\"purpose\":\"Maps a region to process:… or module:… RF/ELK group id.\",\"layer\":4,\"alias\":\"boundary-id\"},{\"name\":\"moduleGroupNodeId\",\"construct\":\"function\",\"symbol\":\"moduleGroupNodeId\",\"file\":\"packages/subsystems-react/src/subsystem/model.ts\",\"module\":\"packages/subsystems-react/src/subsystem/model.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react\",\"purpose\":\"Stable RF id for a module frame.\",\"layer\":4,\"alias\":\"module-id\"},{\"name\":\"processGroupNodeId\",\"construct\":\"function\",\"symbol\":\"processGroupNodeId\",\"file\":\"packages/subsystems-react/src/subsystem/model.ts\",\"module\":\"packages/subsystems-react/src/subsystem/model.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react\",\"purpose\":\"Stable RF id for a process frame.\",\"layer\":4,\"alias\":\"process-id\"},{\"name\":\"SubsystemGroupNode\",\"construct\":\"function\",\"symbol\":\"SubsystemGroupNode\",\"framework\":\"react\",\"stereotype\":\"component\",\"file\":\"packages/subsystems-react/src/subsystem/nodes.tsx\",\"module\":\"packages/subsystems-react/src/subsystem/nodes.tsx\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react\",\"purpose\":\"Draws the dashed process/module frame from region data.\",\"layer\":5,\"alias\":\"group-node\"},{\"name\":\"SubsystemProcessRegion\",\"construct\":\"type_alias\",\"symbol\":\"SubsystemProcessRegion\",\"file\":\"packages/subsystems-react/src/subsystem/model.ts\",\"module\":\"packages/subsystems-react/src/subsystem/model.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react\",\"purpose\":\"Boundary region payload — kind process|module plus memberIds.\",\"layer\":4,\"declaration\":{\"kind\":\"type\",\"properties\":[{\"name\":\"kind\",\"type\":\"'process' | 'module'\"},{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"label\",\"type\":\"string\"},{\"name\":\"memberIds\",\"type\":\"string[]\"}],\"usedBy\":[],\"implementors\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"region-type\"},{\"name\":\"nestCompoundGroups\",\"construct\":\"function\",\"symbol\":\"nestCompoundGroups\",\"proposed\":true,\"file\":\"packages/subsystems-react/src/utils/elkLayout.ts\",\"module\":\"packages/subsystems-react/src/utils/elkLayout.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react\",\"purpose\":\"Proposed — build process→module→leaf ELK children and recursive groupBounds.\",\"layer\":3,\"alias\":\"nest-groups\"},{\"name\":\"buildBoundaryLayoutGroups\",\"construct\":\"function\",\"symbol\":\"buildBoundaryLayoutGroups\",\"file\":\"packages/subsystems-react/src/subsystem/model.ts\",\"module\":\"packages/subsystems-react/src/subsystem/model.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react\",\"purpose\":\"Builds process→module→leaf group defs with parentId nesting.\",\"layer\":3,\"alias\":\"layout-groups\"},{\"name\":\"auditReportToIssues\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/mainview/subsystemIssues.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/mainview/subsystemIssues.ts\",\"symbol\":\"auditReportToIssues\",\"purpose\":\"Maps report findings to presentation issues with resolved target labels.\",\"process\":\"subsystems-studio/renderer\",\"alias\":\"map-issues\"},{\"name\":\"auditReportToVerification\",\"construct\":\"function\",\"proposed\":true,\"file\":\"packages/subsystems-studio/src/mainview/subsystemIssues.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/mainview/subsystemIssues.ts\",\"symbol\":\"auditReportToVerification\",\"purpose\":\"Planned: maps per-component checks to the five-rung verification ladder (file to signature).\",\"process\":\"subsystems-studio/renderer\",\"alias\":\"map-verification\"},{\"name\":\"runSubsystemModelAuditFlow\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/mainview/auditSubsystemModelFlow.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/mainview/auditSubsystemModelFlow.ts\",\"symbol\":\"runSubsystemModelAuditFlow\",\"purpose\":\"Ensures graphify caches, runs the audit, and drives the report modal.\",\"process\":\"subsystems-studio/renderer\",\"alias\":\"audit-flow\"},{\"name\":\"SubsystemComponentNode\",\"construct\":\"function\",\"framework\":\"react\",\"stereotype\":\"component\",\"file\":\"packages/subsystems-react/src/subsystem/nodes.tsx\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react/src/subsystem/nodes.tsx\",\"symbol\":\"SubsystemComponentNode\",\"purpose\":\"Renders a node: construct border, badges, verification bar, and hover issue badge.\",\"process\":\"subsystems-studio/renderer\",\"alias\":\"node\"},{\"name\":\"SubsystemDiagnosticToggle\",\"construct\":\"function\",\"framework\":\"react\",\"stereotype\":\"component\",\"file\":\"packages/subsystems-react/src/subsystem/DiagnosticToggle.tsx\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react/src/subsystem/DiagnosticToggle.tsx\",\"symbol\":\"SubsystemDiagnosticToggle\",\"purpose\":\"Header chip: status color and the diagnostic-list toggle.\",\"process\":\"subsystems-studio/renderer\",\"alias\":\"chip\"},{\"name\":\"SubsystemIssueList\",\"construct\":\"function\",\"framework\":\"react\",\"stereotype\":\"component\",\"file\":\"packages/subsystems-react/src/subsystem/IssueList.tsx\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react/src/subsystem/IssueList.tsx\",\"symbol\":\"SubsystemIssueList\",\"purpose\":\"Sidebar diagnostics list, grouped by verification layer.\",\"process\":\"subsystems-studio/renderer\",\"alias\":\"issue-list\"},{\"name\":\"saveSubsystemModelAudit\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/audit-report-store.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/audit-report-store.ts\",\"symbol\":\"saveSubsystemModelAudit\",\"purpose\":\"Persists the dry-run report under ~/.principal/subsystem-model-audits.\",\"process\":\"subsystems-studio/host\",\"alias\":\"report-save\"},{\"name\":\"loadSubsystemModelAudit\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/audit-report-store.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/audit-report-store.ts\",\"symbol\":\"loadSubsystemModelAudit\",\"purpose\":\"Loads the last saved report for a model.\",\"process\":\"subsystems-studio/host\",\"alias\":\"report-load\"},{\"name\":\"resolveRepoRootForComponent\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"module\":\"packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"symbol\":\"resolveRepoRootForComponent\",\"purpose\":\"Deterministic — purl to local repo root; a null root is reported unresolved.\",\"process\":\"subsystems-studio/host\",\"alias\":\"resolve-root\",\"layer\":4,\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"purl\",\"type\":\"string | undefined\"}],\"returnType\":\"string | undefined\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\"},{\"name\":\"auditTopologyRelations\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/topology-audit.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/topology-audit.ts\",\"symbol\":\"auditTopologyRelations\",\"purpose\":\"Orchestrates — relations[] endpoints (deterministic) plus soft corroboration (heuristic).\",\"process\":\"subsystems-studio/host\",\"alias\":\"topology\"},{\"name\":\"auditBoundaryFields\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/boundary-audit.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/boundary-audit.ts\",\"symbol\":\"auditBoundaryFields\",\"purpose\":\"Orchestrates — module/file membership and process nesting.\",\"process\":\"subsystems-studio/host\",\"alias\":\"boundary\"},{\"name\":\"resolveComponentAnchor\",\"construct\":\"function\",\"file\":\"packages/subsystems-react/src/graphify/anchor.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react/src/graphify/anchor.ts\",\"symbol\":\"resolveComponentAnchor\",\"purpose\":\"Deterministic given graphify (coarse) — file+symbol to node: exact, file-only, ambiguous, or missing.\",\"process\":\"subsystems-studio/host\",\"alias\":\"anchor\"},{\"name\":\"moduleAgreesWithFile\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/boundary-audit.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/boundary-audit.ts\",\"symbol\":\"moduleAgreesWithFile\",\"purpose\":\"Heuristic — module equals the file or is a directory prefix; gap (info) when it is not.\",\"process\":\"subsystems-studio/host\",\"alias\":\"module-agrees\"},{\"name\":\"compareSignatures\",\"construct\":\"function\",\"file\":\"packages/subsystems-react/src/graphify/signature.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react/src/graphify/signature.ts\",\"symbol\":\"compareSignatures\",\"purpose\":\"Heuristic — authored named type bags vs graphify type edges; skips primitives; unconfirmed when edges are thin.\",\"process\":\"subsystems-studio/host\",\"alias\":\"compare-signatures\"},{\"name\":\"inferConstructFromGraphify\",\"construct\":\"function\",\"file\":\"packages/subsystems-react/src/graphify/construct.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react/src/graphify/construct.ts\",\"symbol\":\"inferConstructFromGraphify\",\"purpose\":\"Heuristic — infers the construct kind from graphify structure; cannot resolve interface/type_alias/enum to unknown.\",\"process\":\"subsystems-studio/host\",\"alias\":\"infer-construct\"},{\"name\":\"constructsMatch\",\"construct\":\"function\",\"file\":\"packages/subsystems-react/src/graphify/construct.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react/src/graphify/construct.ts\",\"symbol\":\"constructsMatch\",\"purpose\":\"Deterministic — compares the claimed construct against the inferred one (error on mismatch).\",\"process\":\"subsystems-studio/host\",\"alias\":\"constructs-match\"},{\"name\":\"graphifyHasRelationBetween\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/topology-audit.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/topology-audit.ts\",\"symbol\":\"graphifyHasRelationBetween\",\"purpose\":\"Heuristic — soft corroboration that graphify has the relation; absence is unconfirmed (info).\",\"process\":\"subsystems-studio/host\",\"alias\":\"topo-relation\"},{\"name\":\"graphifyHasRelationTowardHints\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/topology-audit.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/topology-audit.ts\",\"symbol\":\"graphifyHasRelationTowardHints\",\"purpose\":\"Heuristic — soft label match toward an unanchored/external target; absence is unconfirmed.\",\"process\":\"subsystems-studio/host\",\"alias\":\"topo-hints\"},{\"name\":\"FileDrawer\",\"construct\":\"function\",\"framework\":\"react\",\"stereotype\":\"component\",\"file\":\"packages/subsystems-react/src/subsystem/FileDrawer.tsx\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react/src/subsystem/FileDrawer.tsx\",\"symbol\":\"FileDrawer\",\"purpose\":\"Bottom panel that animates open and hosts the injected file or walkthrough viewer.\",\"process\":\"principal-studio/renderer\",\"alias\":\"file-drawer\"},{\"name\":\"PierreFileView\",\"construct\":\"function\",\"framework\":\"react\",\"stereotype\":\"component\",\"file\":\"packages/subsystems-react/src/pierre/PierreFileView.tsx\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react/src/pierre/PierreFileView.tsx\",\"symbol\":\"PierreFileView\",\"purpose\":\"Fetches a full file and renders it through Pierre once the highlighter is warm.\",\"process\":\"principal-studio/renderer\",\"alias\":\"pierre-file-view\"},{\"name\":\"PierreSnippetView\",\"construct\":\"function\",\"framework\":\"react\",\"stereotype\":\"component\",\"file\":\"packages/subsystems-react/src/pierre/PierreSnippetView.tsx\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react/src/pierre/PierreSnippetView.tsx\",\"symbol\":\"PierreSnippetView\",\"purpose\":\"Renders a focused line-range snippet with context for declaration links.\",\"process\":\"principal-studio/renderer\",\"alias\":\"pierre-snippet-view\"},{\"name\":\"readFile\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"symbol\":\"readFile\",\"purpose\":\"RPC closure that fetches repo-relative file content for the graph.\",\"process\":\"principal-studio/renderer\",\"module\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"alias\":\"read-file\"},{\"name\":\"preloadHighlighter\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external\",\"symbol\":\"preloadHighlighter\",\"purpose\":\"Loads and attaches the shared Shiki grammar for a file's language before it renders.\",\"process\":\"principal-studio/renderer\",\"alias\":\"preload-highlighter\"},{\"name\":\"File\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external\",\"symbol\":\"File\",\"purpose\":\"Pierre React component that tokenizes and paints code on the main thread.\",\"process\":\"principal-studio/renderer\",\"alias\":\"pierre-file-component\"},{\"name\":\"resolveSandboxed\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/index.ts\",\"symbol\":\"resolveSandboxed\",\"purpose\":\"Resolves a repo-relative path under the graph's root and rejects traversal.\",\"process\":\"principal-studio/host\",\"alias\":\"resolve-sandboxed\"},{\"name\":\"fs.readFile\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external\",\"purpose\":\"Node fs promise read used by the host to load graph JSON and file content.\",\"process\":\"principal-studio/host\",\"alias\":\"node-fs\"},{\"name\":\"SharedHighlighter\",\"construct\":\"store\",\"file\":\"packages/subsystems-react/node_modules/@pierre/diffs/dist/highlighter/shared_highlighter.js\",\"purl\":\"external\",\"symbol\":\"highlighter\",\"purpose\":\"Caches loaded Shiki grammars and themes for the renderer lifetime, so each language loads once.\",\"process\":\"principal-studio/renderer\",\"declaration\":{\"kind\":\"store\",\"properties\":[{\"name\":\"highlighter\",\"type\":\"Highlighter | Promise<Highlighter> | undefined\"}],\"storage\":\"memory\"},\"declarationProvenance\":\"authored\",\"alias\":\"highlighter-store\"},{\"name\":\"ApplicationMenu\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external\",\"role\":\"entry\",\"purpose\":\"macOS application menu; its File > Close Tab item binds Command+W to the closeActiveTab action.\",\"layer\":0,\"alias\":\"app-menu\"},{\"name\":\"closeTabById\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/index.ts\",\"symbol\":\"closeTabById\",\"purpose\":\"Host choke point every close path funnels through: refuses permanent tabs, deletes the tab record, re-picks a fallback suggestion, and re-broadcasts the strip.\",\"process\":\"subsystems-studio/host\",\"module\":\"packages/subsystems-studio/src/bun/index.ts\",\"layer\":1,\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"id\",\"type\":\"string\"}],\"returnType\":\"{ ok: boolean; error?: string }\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"close-tab\"},{\"name\":\"isPermanentTabId\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/index.ts\",\"symbol\":\"isPermanentTabId\",\"purpose\":\"True for the fixed tabs (Trails, Subsystems, Agent Sessions, …) so a close can never dismiss them.\",\"process\":\"subsystems-studio/host\",\"module\":\"packages/subsystems-studio/src/bun/index.ts\",\"layer\":2,\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"id\",\"type\":\"string\"}],\"returnType\":\"boolean\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"is-permanent\"},{\"name\":\"broadcastTabsChanged\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/index.ts\",\"symbol\":\"broadcastTabsChanged\",\"purpose\":\"Sends the tabsChanged notification (with an optional focus hint) to the renderer over RPC.\",\"process\":\"subsystems-studio/host\",\"module\":\"packages/subsystems-studio/src/bun/index.ts\",\"layer\":2,\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"focusTabId\",\"type\":\"string\"}],\"returnType\":\"void\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"broadcast-tabs\"},{\"name\":\"TabStrip\",\"construct\":\"function\",\"framework\":\"react\",\"stereotype\":\"component\",\"file\":\"packages/subsystems-studio/src/mainview/components/TabStrip.tsx\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/mainview/components/TabStrip.tsx\",\"symbol\":\"TabStrip\",\"purpose\":\"Draws the tab row and each non-permanent tab's × close affordance.\",\"process\":\"subsystems-studio/renderer\",\"module\":\"packages/subsystems-studio/src/mainview/components/TabStrip.tsx\",\"layer\":1,\"alias\":\"tab-strip\"},{\"name\":\"electrobun\",\"construct\":\"store\",\"file\":\"packages/subsystems-studio/src/mainview/rpc.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/mainview/rpc.ts\",\"symbol\":\"electrobun\",\"purpose\":\"Renderer-side RPC bridge singleton; sends host requests (listTabs, closeTab, setActiveTab) and receives tabsChanged.\",\"process\":\"subsystems-studio/renderer\",\"module\":\"packages/subsystems-studio/src/mainview/rpc.ts\",\"layer\":1,\"alias\":\"rpc-bridge\"},{\"name\":\"reloadSubscribers\",\"construct\":\"store\",\"file\":\"packages/subsystems-studio/src/mainview/rpc.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/mainview/rpc.ts\",\"symbol\":\"reloadSubscribers\",\"purpose\":\"Set of tab-refresh callbacks; the tabsChanged handler invokes each so the shell re-fetches its list.\",\"process\":\"subsystems-studio/renderer\",\"module\":\"packages/subsystems-studio/src/mainview/rpc.ts\",\"layer\":2,\"alias\":\"reload-subs\"},{\"name\":\"StudioRequests\",\"construct\":\"interface\",\"file\":\"packages/subsystems-studio/src/shared/contract.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/shared/contract.ts\",\"symbol\":\"StudioRequests\",\"purpose\":\"Renderer→host request contract; declares listTabs, getTab, setActiveTab, and closeTab.\",\"process\":\"subsystems-studio/shared\",\"module\":\"packages/subsystems-studio/src/shared/contract.ts\",\"layer\":3,\"alias\":\"studio-requests\"},{\"name\":\"StudioMessages\",\"construct\":\"interface\",\"file\":\"packages/subsystems-studio/src/shared/contract.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/shared/contract.ts\",\"symbol\":\"StudioMessages\",\"purpose\":\"Host→renderer notification contract; declares the tabsChanged message the strip refresh rides on.\",\"process\":\"subsystems-studio/shared\",\"module\":\"packages/subsystems-studio/src/shared/contract.ts\",\"layer\":3,\"alias\":\"studio-messages\"},{\"name\":\"findSubsystemModelProblems\",\"construct\":\"function\",\"role\":\"entry\",\"file\":\"packages/subsystems-studio/src/bun/subsystem-model-validation.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/subsystem-model-validation.ts\",\"symbol\":\"findSubsystemModelProblems\",\"purpose\":\"Rejects a create/update payload before anything is stored.\",\"process\":\"subsystems-studio/host\",\"layer\":1,\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"input\",\"type\":\"Record<string, unknown>\"}],\"returnType\":\"string[]\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"input-validation\"},{\"name\":\"validateSubsystemModelCrossField\",\"construct\":\"function\",\"file\":\"packages/subsystems-core/src/validation.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-core/src/validation.ts\",\"symbol\":\"validateSubsystemModelCrossField\",\"purpose\":\"Checks the rules the JSON schema cannot express (unique ids, endpoint refs, module implies file).\",\"process\":\"subsystems-core\",\"layer\":2,\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"doc\",\"type\":\"SubsystemModelDocument\"}],\"returnType\":\"SubsystemValidationProblem[]\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"cross-field-rules\"},{\"name\":\"registerSuppliedRoots\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/http-server.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/http-server.ts\",\"symbol\":\"registerSuppliedRoots\",\"purpose\":\"Learns roots shipped with a payload into Alexandria instead of storing them.\",\"process\":\"subsystems-studio/host\",\"module\":\"packages/subsystems-studio/src/bun/http-server.ts\",\"layer\":2,\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"body\",\"type\":\"Record<string, unknown>\"}],\"returnType\":\"void\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"register-roots\"},{\"name\":\"registerProjectInAlexandria\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/alexandria.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/alexandria.ts\",\"symbol\":\"registerProjectInAlexandria\",\"purpose\":\"Records a repo path and remote in the Alexandria registry, idempotently.\",\"process\":\"subsystems-studio/host\",\"module\":\"packages/subsystems-studio/src/bun/alexandria.ts\",\"layer\":3,\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"gitRoot\",\"type\":\"string\"},{\"name\":\"remoteUrl\",\"type\":\"string\"}],\"returnType\":\"void\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"alexandria-register\"},{\"name\":\"listSubsystemModels\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"symbol\":\"listSubsystemModels\",\"purpose\":\"Returns the lightweight index entry for every stored model.\",\"process\":\"subsystems-studio/host\",\"module\":\"packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"layer\":3,\"declaration\":{\"kind\":\"function\",\"parameters\":[],\"returnType\":\"Promise<SubsystemModelIndexEntry[]>\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"store-list\"},{\"name\":\"resolveRepoRootForPurl\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/graphify-store.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/graphify-store.ts\",\"symbol\":\"resolveRepoRootForPurl\",\"purpose\":\"Resolves a repo purl to a checkout for graphify cache keying.\",\"process\":\"subsystems-studio/host\",\"module\":\"packages/subsystems-studio/src/bun/graphify-store.ts\",\"layer\":4,\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"purl\",\"type\":\"string\"}],\"returnType\":\"string | null\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"resolve-purl-root\"},{\"name\":\"resolveRepoRootFromAlexandria\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/alexandria.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/alexandria.ts\",\"symbol\":\"resolveRepoRootFromAlexandria\",\"purpose\":\"Maps owner and name to a registered checkout by matching remotes.\",\"process\":\"subsystems-studio/host\",\"module\":\"packages/subsystems-studio/src/bun/alexandria.ts\",\"layer\":5,\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"owner\",\"type\":\"string\"},{\"name\":\"name\",\"type\":\"string\"}],\"returnType\":\"string | null\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"alexandria-resolve\"},{\"name\":\"Alexandria project registry\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external\",\"purpose\":\"The on-disk system of record mapping repo remotes to local checkouts.\",\"process\":\"alexandria\",\"layer\":6,\"alias\":\"registry-file\"},{\"name\":\"githubReposFromComponents\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/index.ts\",\"symbol\":\"githubReposFromComponents\",\"purpose\":\"Derives a model's repos from its component purls for the listing.\",\"process\":\"subsystems-studio/host\",\"layer\":3,\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"components\",\"type\":\"ReadonlyArray<{ purl?: string }>\"}],\"returnType\":\"Array<{ owner: string; name: string }>\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"repo-derivation\"},{\"name\":\"collectReposFromGraphs\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelsView.tsx\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/mainview/views/SubsystemModelsView.tsx\",\"symbol\":\"collectReposFromGraphs\",\"purpose\":\"Groups visible models into repo cards from their derived repos.\",\"process\":\"principal-studio/renderer\",\"layer\":4,\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"graphs\",\"type\":\"SubsystemModelSummary[]\"},{\"name\":\"graphifyRepos\",\"type\":\"GraphifyRepoEntry[] | null\"},{\"name\":\"recentIds\",\"type\":\"ReadonlySet<string> | null\"}],\"returnType\":\"SubsystemRepoCard[]\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"model-listing\"},{\"name\":\"assessSubsystemGraphifyReadiness\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/graphify-store.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/graphify-store.ts\",\"symbol\":\"assessSubsystemGraphifyReadiness\",\"purpose\":\"Reports whether each component purl has a current graphify cache slot.\",\"process\":\"subsystems-studio/host\",\"module\":\"packages/subsystems-studio/src/bun/graphify-store.ts\",\"layer\":3,\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"graph\",\"type\":\"{ components: Array<{ purl?: string }> }\"},{\"name\":\"buildingPurls\",\"type\":\"ReadonlySet<string>\"},{\"name\":\"storeRoot\",\"type\":\"string\"}],\"returnType\":\"SubsystemGraphifyReadiness\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"audit-readiness\"},{\"name\":\"acceptSubsystemModelProposal\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/proposal-store.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/proposal-store.ts\",\"symbol\":\"acceptSubsystemModelProposal\",\"purpose\":\"Applies an accepted proposal's changes to the model — rewriting components/relations by their ids.\",\"process\":\"subsystems-studio/host\",\"module\":\"packages/subsystems-studio/src/bun/proposal-store.ts\",\"layer\":2,\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"graphId\",\"type\":\"string\"},{\"name\":\"proposalId\",\"type\":\"string\"}],\"returnType\":\"Promise<{ ok: boolean; error?: string }>\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"proposal-accept\"},{\"name\":\"applySubsystemModelAuditFix\",\"construct\":\"function\",\"role\":\"entry\",\"file\":\"packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"symbol\":\"applySubsystemModelAuditFix\",\"purpose\":\"Adopts a graphify signature/file/declaration-ref fix onto one componentId (or every component).\",\"process\":\"subsystems-studio/host\",\"module\":\"packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"layer\":1,\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"opts\",\"type\":\"{ graphId: string; fixId: \\\"adopt_graphify_signature\\\" | \\\"adopt_graphify_file\\\" | \\\"adopt_graphify_declaration_ref\\\"; componentId?: string }\"}],\"returnType\":\"Promise<{ ok: boolean; applied?: number; report?: SubsystemModelAuditReport }>\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"fix-adopt\"},{\"name\":\"principalMetaForComponent\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/mainview/excalidraw/subsystemToExcalidraw.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/mainview/excalidraw/subsystemToExcalidraw.ts\",\"symbol\":\"principalMetaForComponent\",\"purpose\":\"Stamps a component's id onto its Excalidraw element so the scene can be read back verbatim.\",\"process\":\"principal-studio/renderer\",\"module\":\"packages/subsystems-studio/src/mainview/excalidraw/subsystemToExcalidraw.ts\",\"layer\":4,\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"c\",\"type\":\"SubsystemComponent\"}],\"returnType\":\"PrincipalComponentMeta\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"excalidraw-scene-build\"},{\"name\":\"excalidrawSceneToSubsystemModel\",\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/mainview/excalidraw/excalidrawToSubsystem.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/mainview/excalidraw/excalidrawToSubsystem.ts\",\"symbol\":\"excalidrawSceneToSubsystemModel\",\"purpose\":\"Rebuilds a model document from an edited scene, reading component ids from element metadata.\",\"process\":\"principal-studio/renderer\",\"module\":\"packages/subsystems-studio/src/mainview/excalidraw/excalidrawToSubsystem.ts\",\"layer\":4,\"declaration\":{\"kind\":\"function\",\"parameters\":[{\"name\":\"scene\",\"type\":\"ExcalidrawLikeScene\"}],\"returnType\":\"RebuiltSubsystemModel\",\"callers\":[],\"callees\":[]},\"declarationProvenance\":\"authored\",\"alias\":\"excalidraw-model-rebuild\"},{\"name\":\"mergeSubsystemModels\",\"construct\":\"function\",\"proposed\":true,\"role\":\"entry\",\"file\":\"packages/subsystems-studio/src/bun/merge-submodel-models.ts\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/merge-submodel-models.ts\",\"symbol\":\"mergeSubsystemModels\",\"purpose\":\"Composes every model touching one repo-key into a single graph. Code + proposed-with-intent join on (purlRepoKey, file, symbol-or-None); external/custom_entity join on exact (purl, normalized name) with purl != 'external' (bare externals stay model-scoped); alias-text/name-only matching is rejected (false friends in the data). Each model's edges resolve in its own alias-space; unified nodes carry the union of aliases. Attribute divergences (purpose variants, process vocabulary drift, construct disagreements) are grouped as conflicts, never normalized — an agent pass fixes source models consistent via proposals. Keys must be consistent and unique, not perfect.\",\"process\":\"subsystems-studio/host\",\"module\":\"packages/subsystems-studio/src/bun/merge-submodel-models.ts\",\"layer\":0,\"alias\":\"merge-models\"},{\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"module\":\"packages/subsystems-studio/src/bun/index.ts\",\"name\":\"listSubsystemModels RPC handler\",\"process\":\"subsystems-studio/host\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/index.ts\",\"purpose\":\"Enriches index entries into list summaries with repos, graphify and audit.\",\"alias\":\"list-rpc\"},{\"construct\":\"interface\",\"file\":\"packages/subsystems-studio/src/shared/contract.ts\",\"module\":\"packages/subsystems-studio/src/shared/contract.ts\",\"name\":\"SubsystemModelSummary\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/shared/contract.ts\",\"purpose\":\"Lists counts, repos and audit state without component files.\",\"symbol\":\"SubsystemModelSummary\",\"alias\":\"summary\"},{\"construct\":\"function\",\"file\":\"packages/subsystems-react/src/subsystem/paths.ts\",\"module\":\"packages/subsystems-react/src/subsystem/paths.ts\",\"name\":\"buildRepoGroups\",\"process\":\"subsystems-studio/renderer\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react/src/subsystem/paths.ts\",\"purpose\":\"Groups component file and purl pairs by repo for per-repo trees.\",\"symbol\":\"buildRepoGroups\",\"alias\":\"repo-groups\"},{\"construct\":\"function\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemFileTree.tsx\",\"framework\":\"react\",\"module\":\"packages/subsystems-react/src/subsystem/SubsystemFileTree.tsx\",\"name\":\"SubsystemFileTree\",\"process\":\"subsystems-studio/renderer\",\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react/src/subsystem/SubsystemFileTree.tsx\",\"purpose\":\"Renders one collapsible sidebar file tree from repo-root-relative paths.\",\"stereotype\":\"component\",\"symbol\":\"SubsystemFileTree\",\"alias\":\"file-tree\"},{\"construct\":\"function\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelsView.tsx\",\"framework\":\"react\",\"module\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelsView.tsx\",\"name\":\"SubsystemFilePanel\",\"process\":\"subsystems-studio/renderer\",\"proposed\":true,\"purl\":\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/mainview/views/SubsystemModelsView.tsx\",\"purpose\":\"Shows file trees for the selected subsystem on the left of the list.\\nAlternative without per-selection fetch: add files to SubsystemModelSummary.\",\"stereotype\":\"component\",\"alias\":\"file-panel\"}]");
|
|
6
|
-
|
|
7
|
-
export const composedRelations: SubsystemRelation[] = JSON.parse("[{\"id\":\"guard-reads-portable\",\"from\":\"is-portable\",\"to\":\"portable-doc\",\"relationType\":\"references\",\"refs\":[\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-core/src/types/subsystem-model.ts\"]},{\"id\":\"host-extends-portable\",\"from\":\"host-binding\",\"to\":\"portable-doc\",\"relationType\":\"references\",\"refs\":[\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-core/src/types/subsystem-model.ts\"]},{\"id\":\"ref-extends-host\",\"from\":\"gist-ref\",\"to\":\"host-binding\",\"relationType\":\"extends\",\"refs\":[\"external:proposed\"]},{\"id\":\"process-misses-session-message\",\"from\":\"process-session-events\",\"to\":\"run-opencode-v2-session\",\"relationType\":\"references\",\"refs\":[\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/session-pipeline.ts\"]},{\"id\":\"core-owns-declaration\",\"from\":\"core-component\",\"to\":\"core-declaration\",\"relationType\":\"references\",\"refs\":[\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-core/src/types/subsystem-model.ts\"]},{\"id\":\"react-owns-detail\",\"from\":\"react-component\",\"to\":\"graphify-detail\",\"relationType\":\"references\",\"refs\":[\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react/src/subsystem/model.ts\"]},{\"id\":\"schema-vs-react-parallel\",\"from\":\"core-component\",\"to\":\"react-component\",\"relationType\":\"references\",\"refs\":[\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-core/src/types/subsystem-model.ts\"]},{\"id\":\"declaration-mirrors-detail\",\"from\":\"core-declaration\",\"to\":\"graphify-detail\",\"relationType\":\"references\",\"refs\":[\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react/src/graphify/consolidated.ts\"]},{\"id\":\"declaration-not-read\",\"from\":\"generate-decl-string\",\"to\":\"core-declaration\",\"relationType\":\"references\",\"refs\":[\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react/src/subsystem/formatDeclaration.ts\"]},{\"id\":\"proposed-replaces-generate\",\"from\":\"generate-decl-string\",\"to\":\"generate-decl-string\",\"relationType\":\"references\",\"refs\":[\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react/src/subsystem/formatDeclaration.ts\"]},{\"id\":\"graph-imports-build\",\"from\":\"react-graph\",\"to\":\"build-graph\",\"relationType\":\"imports\"},{\"id\":\"graph-imports-group-node\",\"from\":\"react-graph\",\"to\":\"group-node\",\"relationType\":\"imports\"},{\"id\":\"build-imports-elk\",\"from\":\"build-graph\",\"to\":\"elk\",\"relationType\":\"imports\"},{\"id\":\"regions-ref-type\",\"from\":\"process-regions\",\"to\":\"region-type\",\"relationType\":\"references\"},{\"id\":\"module-regions-ref-type\",\"from\":\"module-regions\",\"to\":\"region-type\",\"relationType\":\"references\"},{\"id\":\"boundary-uses-module-id\",\"from\":\"boundary-id\",\"to\":\"module-id\",\"relationType\":\"references\"},{\"id\":\"boundary-uses-process-id\",\"from\":\"boundary-id\",\"to\":\"process-id\",\"relationType\":\"references\"},{\"id\":\"elk-to-nest\",\"from\":\"elk\",\"to\":\"nest-groups\",\"relationType\":\"references\"},{\"id\":\"graph-imports-build__dup1\",\"from\":\"react-graph\",\"to\":\"build-graph\",\"relationType\":\"imports\"},{\"id\":\"graph-imports-group\",\"from\":\"react-graph\",\"to\":\"group-node\",\"relationType\":\"imports\"},{\"id\":\"build-imports-elk__dup1\",\"from\":\"build-graph\",\"to\":\"elk\",\"relationType\":\"imports\"},{\"id\":\"layout-uses-process\",\"from\":\"layout-groups\",\"to\":\"process-regions\",\"relationType\":\"references\"},{\"id\":\"layout-uses-module\",\"from\":\"layout-groups\",\"to\":\"module-regions\",\"relationType\":\"references\"},{\"id\":\"r-view-graph\",\"from\":\"studio-model-view\",\"to\":\"react-graph\",\"relationType\":\"imports\"},{\"id\":\"r-view-issues\",\"from\":\"studio-model-view\",\"to\":\"map-issues\",\"relationType\":\"imports\"},{\"id\":\"r-view-verification\",\"from\":\"studio-model-view\",\"to\":\"map-verification\",\"relationType\":\"imports\"},{\"id\":\"r-view-flow\",\"from\":\"studio-model-view\",\"to\":\"audit-flow\",\"relationType\":\"imports\"},{\"id\":\"r-graph-node\",\"from\":\"react-graph\",\"to\":\"node\",\"relationType\":\"imports\"},{\"id\":\"r-graph-chip\",\"from\":\"react-graph\",\"to\":\"chip\",\"relationType\":\"imports\"},{\"id\":\"r-graph-list\",\"from\":\"react-graph\",\"to\":\"issue-list\",\"relationType\":\"imports\"},{\"id\":\"r-audit-save\",\"from\":\"audit-model\",\"to\":\"report-save\",\"relationType\":\"imports\"},{\"id\":\"r-create-verify\",\"from\":\"studio-create\",\"to\":\"verify-files\",\"relationType\":\"imports\"},{\"id\":\"r-verify-root\",\"from\":\"verify-files\",\"to\":\"resolve-root\",\"relationType\":\"imports\"},{\"id\":\"r-audit-component\",\"from\":\"audit-model\",\"to\":\"verify-component\",\"relationType\":\"imports\"},{\"id\":\"r-component-anchor\",\"from\":\"verify-component\",\"to\":\"anchor\",\"relationType\":\"imports\"},{\"id\":\"r-audit-topology\",\"from\":\"audit-model\",\"to\":\"topology\",\"relationType\":\"imports\"},{\"id\":\"r-audit-boundary\",\"from\":\"audit-model\",\"to\":\"boundary\",\"relationType\":\"imports\"},{\"id\":\"r-comp-infer\",\"from\":\"verify-component\",\"to\":\"infer-construct\",\"relationType\":\"imports\"},{\"id\":\"r-comp-constructs\",\"from\":\"verify-component\",\"to\":\"constructs-match\",\"relationType\":\"imports\"},{\"id\":\"r-comp-signatures\",\"from\":\"verify-component\",\"to\":\"compare-signatures\",\"relationType\":\"imports\"},{\"id\":\"smv-imports-graph\",\"from\":\"studio-model-view\",\"to\":\"react-graph\",\"relationType\":\"imports\",\"refs\":[\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\"]},{\"id\":\"smv-imports-file-view\",\"from\":\"studio-model-view\",\"to\":\"pierre-file-view\",\"relationType\":\"imports\",\"refs\":[\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react/src/pierre/PierreFileView.tsx\"]},{\"id\":\"smv-imports-snippet-view\",\"from\":\"studio-model-view\",\"to\":\"pierre-snippet-view\",\"relationType\":\"imports\",\"refs\":[\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react/src/pierre/PierreSnippetView.tsx\"]},{\"id\":\"graph-imports-drawer\",\"from\":\"react-graph\",\"to\":\"file-drawer\",\"relationType\":\"imports\",\"refs\":[\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\"]},{\"id\":\"file-view-imports-highlighter\",\"from\":\"pierre-file-view\",\"to\":\"preload-highlighter\",\"relationType\":\"imports\"},{\"id\":\"file-view-imports-file\",\"from\":\"pierre-file-view\",\"to\":\"pierre-file-component\",\"relationType\":\"imports\"},{\"id\":\"get-model-imports-fs\",\"from\":\"studio-get\",\"to\":\"node-fs\",\"relationType\":\"imports\"},{\"id\":\"app-renders-strip\",\"from\":\"app-shell\",\"to\":\"tab-strip\",\"relationType\":\"references\",\"refs\":[\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/mainview/App.tsx\"]},{\"id\":\"app-uses-requests\",\"from\":\"app-shell\",\"to\":\"studio-requests\",\"relationType\":\"references\"},{\"id\":\"bridge-uses-requests\",\"from\":\"rpc-bridge\",\"to\":\"studio-requests\",\"relationType\":\"references\"},{\"id\":\"bridge-uses-messages\",\"from\":\"rpc-bridge\",\"to\":\"studio-messages\",\"relationType\":\"references\"},{\"id\":\"broadcast-uses-messages\",\"from\":\"broadcast-tabs\",\"to\":\"studio-messages\",\"relationType\":\"references\"},{\"id\":\"route-to-validation\",\"from\":\"http-put\",\"to\":\"input-validation\",\"relationType\":\"imports\",\"refs\":[\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/http-server.ts\"]},{\"id\":\"route-to-store-create\",\"from\":\"http-put\",\"to\":\"studio-create\",\"relationType\":\"imports\",\"refs\":[\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/http-server.ts\"]},{\"id\":\"route-to-alexandria-register\",\"from\":\"http-put\",\"to\":\"alexandria-register\",\"relationType\":\"imports\",\"refs\":[\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/http-server.ts\"]},{\"id\":\"validation-to-cross-field\",\"from\":\"input-validation\",\"to\":\"cross-field-rules\",\"relationType\":\"imports\",\"refs\":[\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/subsystem-model-validation.ts\"]},{\"id\":\"register-roots-to-alexandria\",\"from\":\"register-roots\",\"to\":\"alexandria-register\",\"relationType\":\"imports\",\"refs\":[\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/http-server.ts\"]},{\"id\":\"resolve-root-to-alexandria\",\"from\":\"resolve-root\",\"to\":\"alexandria-resolve\",\"relationType\":\"imports\",\"refs\":[\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/subsystem-model-store.ts\"]},{\"id\":\"resolve-purl-root-to-alexandria\",\"from\":\"resolve-purl-root\",\"to\":\"alexandria-resolve\",\"relationType\":\"imports\",\"refs\":[\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/graphify-store.ts\"]},{\"id\":\"listing-to-derivation\",\"from\":\"model-listing\",\"to\":\"repo-derivation\",\"relationType\":\"references\",\"refs\":[\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/mainview/views/SubsystemModelsView.tsx\"]},{\"id\":\"audit-readiness-to-purl-root\",\"from\":\"audit-readiness\",\"to\":\"resolve-purl-root\",\"relationType\":\"references\",\"refs\":[\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/graphify-store.ts\"]},{\"id\":\"merge-reads-store\",\"from\":\"merge-models\",\"to\":\"studio-get\",\"relationType\":\"references\",\"refs\":[\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/merge-submodel-models.ts\"]},{\"id\":\"rebuild-imports-meta\",\"from\":\"excalidraw-model-rebuild\",\"to\":\"excalidraw-scene-build\",\"relationType\":\"imports\",\"refs\":[\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/mainview/excalidraw/excalidrawToSubsystem.ts\"]},{\"id\":\"fix-adopt-reads-store\",\"from\":\"fix-adopt\",\"to\":\"studio-get\",\"relationType\":\"imports\",\"refs\":[\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/verify-subsystem-component.ts\"]},{\"id\":\"proposal-create-reads-store\",\"from\":\"create-proposal\",\"to\":\"studio-get\",\"relationType\":\"imports\",\"refs\":[\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/proposal-store.ts\"]},{\"from\":\"react-graph\",\"id\":\"detail-uses-repos\",\"relationType\":\"references\",\"to\":\"repo-groups\"},{\"from\":\"react-graph\",\"id\":\"detail-uses-tree\",\"relationType\":\"references\",\"to\":\"file-tree\"},{\"from\":\"file-panel\",\"id\":\"panel-mounts-in-list\",\"relationType\":\"references\",\"to\":\"studio-list\"},{\"from\":\"file-panel\",\"id\":\"panel-uses-repos\",\"relationType\":\"references\",\"to\":\"repo-groups\"},{\"from\":\"file-panel\",\"id\":\"panel-uses-tree\",\"relationType\":\"references\",\"to\":\"file-tree\"},{\"from\":\"list-rpc\",\"id\":\"rpc-reads-index\",\"relationType\":\"references\",\"to\":\"store-list\"},{\"from\":\"studio-list\",\"id\":\"view-renders-summary\",\"relationType\":\"references\",\"to\":\"summary\"}]");
|
|
8
|
-
|
|
9
|
-
export const composedWalkthroughs: SubsystemWalkthrough[] = JSON.parse("[{\"id\":\"tl-site-view-gist\",\"title\":\"Someone opens the shared gist on the site\",\"steps\":[{\"from\":\"site-gist-page\",\"to\":\"gist-load\",\"mechanism\":\"calls\",\"file\":\"site/src/pages/Gist.tsx\",\"line\":67,\"symbol\":\"Gist.load\",\"annotation\":\"Consumer lands on /gist?gist=... — the end of a Studio share.\"},{\"from\":\"gist-load\",\"to\":\"github-gists-api\",\"mechanism\":\"calls\",\"file\":\"site/src/lib/gist.ts\",\"line\":94,\"symbol\":\"loadSubsystemModelFromGist\",\"annotation\":\"Read the public gist JSON (no Studio disk involved).\"},{\"from\":\"gist-load\",\"to\":\"to-portable\",\"mechanism\":\"calls\",\"file\":\"site/src/lib/gist.ts\",\"line\":154,\"symbol\":\"loadSubsystemModelFromGist\",\"annotation\":\"Only portable fields are shown — host gist refs never travel in the file.\"},{\"from\":\"site-gist-page\",\"to\":\"react-graph\",\"mechanism\":\"uses\",\"file\":\"site/src/pages/Gist.tsx\",\"line\":184,\"symbol\":\"Gist\",\"annotation\":\"Render the shared model in the browser.\"}]},{\"id\":\"tl-persist-local-store\",\"title\":\"Persist a local model to ~/.principal/subsystem-models\",\"steps\":[{\"from\":\"cli-create\",\"to\":\"studio-create\",\"mechanism\":\"calls\",\"file\":\"packages/principal-studio-cli/src/commands/subsystem-model.ts\",\"line\":186,\"symbol\":\"createAction\",\"annotation\":\"CLI/agent create path — always a new local sg- id today.\"},{\"from\":\"studio-create\",\"to\":\"model-disk-store\",\"mechanism\":\"writes\",\"file\":\"packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"line\":929,\"symbol\":\"createSubsystemModel\",\"annotation\":\"Host create writes a record into the shared ~/.principal/subsystem-models directory (CLI can write the same store).\"},{\"from\":\"studio-create\",\"to\":\"index-entry\",\"mechanism\":\"writes\",\"file\":\"packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"line\":951,\"symbol\":\"createSubsystemModel\",\"annotation\":\"Mirror listing fields into _index.json.\"},{\"from\":\"cli-create\",\"to\":\"open-tab\",\"mechanism\":\"calls\",\"file\":\"packages/principal-studio-cli/src/commands/subsystem-model.ts\",\"line\":205,\"symbol\":\"createAction\",\"annotation\":\"Open the local model in Studio.\"}]},{\"id\":\"tl-proposed-share-gist\",\"title\":\"Proposed: share local model as gist (create or update)\",\"steps\":[{\"from\":\"gist-share-ui\",\"to\":\"studio-get\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"line\":919,\"symbol\":\"getSubsystemModel\",\"annotation\":\"Load the hydrated local record from the disk store.\"},{\"from\":\"gist-share-ui\",\"to\":\"to-portable\",\"mechanism\":\"calls\",\"file\":\"site/src/lib/gist.ts\",\"line\":161,\"symbol\":\"toPortableDocument\",\"annotation\":\"Strip host fields so the gist file is portable-only.\"},{\"from\":\"index-entry\",\"to\":\"gist-ref\",\"mechanism\":\"reads\",\"file\":\"packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"line\":849,\"symbol\":\"indexEntryFor\",\"annotation\":\"Index/host gist ref decides PATCH existing gist vs POST a new one.\"},{\"from\":\"gist-share-ui\",\"to\":\"github-gists-api\",\"mechanism\":\"calls\",\"file\":\"site/src/lib/gist.ts\",\"line\":94,\"symbol\":\"loadSubsystemModelFromGist\",\"annotation\":\"POST /gists (first share) or PATCH /gists/{id} (subsequent) — token required.\"},{\"from\":\"gist-share-ui\",\"to\":\"studio-update\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"line\":957,\"symbol\":\"updateSubsystemModel\",\"annotation\":\"Stamp gist.id on the local record + index so the next share updates in place.\"}]},{\"id\":\"tl-first-open-ok\",\"title\":\"First open — cover lifts\",\"steps\":[{\"from\":\"studio-model-view\",\"to\":\"graph-inner\",\"mechanism\":\"uses\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"line\":258,\"symbol\":\"SubsystemModelView\",\"annotation\":\"Mount SubsystemComponentGraph for a freshly loaded graph.\"},{\"from\":\"graph-inner\",\"to\":\"layout-key\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"line\":383,\"symbol\":\"Inner\",\"annotation\":\"Compute layoutKey from components and edges.\"},{\"from\":\"graph-inner\",\"to\":\"build-graph\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"line\":407,\"symbol\":\"Inner\",\"annotation\":\"Pass 1: buildSubsystemGraph without measured sizes.\"},{\"from\":\"graph-inner\",\"to\":\"remount-key\",\"mechanism\":\"uses\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"line\":1484,\"symbol\":\"Inner\",\"annotation\":\"Fresh mount: ReactFlow key is new, so nodes remount and measure.\"},{\"from\":\"measured-dims\",\"to\":\"trigger-pass2\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"line\":754,\"symbol\":\"Inner\",\"annotation\":\"dimensions changes fill measuredDimsRef.\"},{\"from\":\"graph-inner\",\"to\":\"trigger-pass2\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"line\":762,\"symbol\":\"Inner\",\"annotation\":\"queueMicrotask triggers Pass 2 from onNodesChange.\"},{\"from\":\"trigger-pass2\",\"to\":\"build-graph\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"line\":454,\"symbol\":\"triggerPass2\",\"annotation\":\"Pass 2 re-runs buildSubsystemGraph with measured widths.\"},{\"from\":\"graph-inner\",\"to\":\"layout-cover\",\"mechanism\":\"uses\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"line\":1694,\"symbol\":\"Inner\",\"annotation\":\"layoutReady true reveals GraphLayoutCover.\"}]},{\"id\":\"tl-update-stuck\",\"title\":\"Bug (before fix) — update stuck on cover\",\"steps\":[{\"from\":\"http-put\",\"to\":\"studio-update\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/http-server.ts\",\"line\":324,\"symbol\":\"handleSubsystemModelRequest\",\"annotation\":\"Agent PUT patches the open graph.\"},{\"from\":\"studio-update\",\"to\":\"emit\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"line\":995,\"symbol\":\"updateSubsystemModel\",\"annotation\":\"Persist then emit reason updated.\"},{\"from\":\"broadcast\",\"to\":\"rpc-fanout\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":2007,\"symbol\":\"broadcastSubsystemModelChanged\",\"annotation\":\"Send subsystemModelChanged into the renderer.\"},{\"from\":\"rpc-fanout\",\"to\":\"studio-model-view\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-studio/src/mainview/rpc.ts\",\"line\":95,\"symbol\":\"subsystemModelChangeSubscribers\",\"annotation\":\"Fan the push out to every subscribed tab.\"},{\"from\":\"studio-model-view\",\"to\":\"graph-inner\",\"mechanism\":\"uses\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"line\":258,\"symbol\":\"SubsystemModelView\",\"annotation\":\"Same Inner instance gets new components/edges props.\"},{\"from\":\"graph-inner\",\"to\":\"measured-dims\",\"mechanism\":\"writes\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"line\":416,\"symbol\":\"Inner\",\"annotation\":\"Before: wiped measuredDimsRef; now only deletes removed leaf ids.\"},{\"from\":\"graph-inner\",\"to\":\"build-graph\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"line\":407,\"symbol\":\"Inner\",\"annotation\":\"Pass 1 rebuilds then setLayoutReady(false) drops the cover.\"},{\"from\":\"graph-inner\",\"to\":\"layout-cover\",\"mechanism\":\"uses\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"line\":1694,\"symbol\":\"Inner\",\"annotation\":\"GraphLayoutCover stays up while layoutReady is false.\"},{\"from\":\"graph-inner\",\"to\":\"remount-key\",\"mechanism\":\"uses\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"line\":1484,\"symbol\":\"Inner\",\"annotation\":\"Same ids → ReactFlow key unchanged → no remount.\"},{\"from\":\"graph-inner\",\"to\":\"trigger-pass2\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"line\":762,\"symbol\":\"Inner\",\"annotation\":\"Before: only dimensions path — no events → stuck forever.\"}]},{\"id\":\"tl-proposed-fix\",\"title\":\"Fix — reuse dims + kick Pass 2\",\"steps\":[{\"from\":\"http-put\",\"to\":\"studio-update\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/http-server.ts\",\"line\":324,\"symbol\":\"handleSubsystemModelRequest\",\"annotation\":\"Same live PUT into an open tab.\"},{\"from\":\"rpc-fanout\",\"to\":\"studio-model-view\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"line\":69,\"symbol\":\"SubsystemModelView\",\"annotation\":\"Tab reloads; Inner stays mounted.\"},{\"from\":\"graph-inner\",\"to\":\"layout-key\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"line\":383,\"symbol\":\"Inner\",\"annotation\":\"layoutKey changes; Pass 1 effect re-runs.\"},{\"from\":\"graph-inner\",\"to\":\"measured-dims\",\"mechanism\":\"writes\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"line\":416,\"symbol\":\"Inner\",\"annotation\":\"Prune stale ids only — keep prior leaf measurements.\"},{\"from\":\"graph-inner\",\"to\":\"build-graph\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"line\":407,\"symbol\":\"Inner\",\"annotation\":\"Pass 1 still estimates; cover drops via setLayoutReady(false).\"},{\"from\":\"graph-inner\",\"to\":\"trigger-pass2\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"line\":477,\"symbol\":\"Inner\",\"annotation\":\"built effect queueMicrotasks triggerPass2 after Pass 1.\"},{\"from\":\"trigger-pass2\",\"to\":\"measured-dims\",\"mechanism\":\"reads\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"line\":436,\"symbol\":\"triggerPass2\",\"annotation\":\"Pass 2 reads retained measuredDimsRef — no remount needed.\"},{\"from\":\"trigger-pass2\",\"to\":\"build-graph\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"line\":454,\"symbol\":\"triggerPass2\",\"annotation\":\"Measured ELK; .catch reveals on error.\"},{\"from\":\"graph-inner\",\"to\":\"remount-key\",\"mechanism\":\"uses\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"line\":1484,\"symbol\":\"Inner\",\"annotation\":\"ReactFlow still keyed on id sets only.\"},{\"from\":\"graph-inner\",\"to\":\"layout-cover\",\"mechanism\":\"uses\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"line\":1694,\"symbol\":\"Inner\",\"annotation\":\"layoutReady true — cover fades; graph shows again.\"}]},{\"id\":\"tl-probe-status\",\"title\":\"Probe OpenCode server status\",\"steps\":[{\"from\":\"app-header\",\"to\":\"probe-server\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":1406,\"symbol\":\"probeOpencodeServer\",\"annotation\":\"RPC getOpencodeServerStatus delegates to probeOpencodeServer.\"},{\"from\":\"probe-server\",\"to\":\"resolve-connection\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/server-sessions.ts\",\"line\":104,\"symbol\":\"probeOpencodeServer\",\"annotation\":\"Resolve the on-disk registration before probing health.\"},{\"from\":\"probe-server\",\"to\":\"opencode-v2-server\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/server-sessions.ts\",\"line\":108,\"symbol\":\"probeOpencodeServer\",\"annotation\":\"Basic-auth GET /api/health against the live OpenCode server.\"}]},{\"id\":\"tl-watch-live-sessions\",\"title\":\"Watch live OpenCode sessions\",\"steps\":[{\"from\":\"server-sessions-modal\",\"to\":\"set-event-watch\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/components/ServerSessionsModal.tsx\",\"line\":102,\"symbol\":\"ServerSessionsModal\",\"annotation\":\"Enable the host SSE watch when the modal mounts.\"},{\"from\":\"server-sessions-modal\",\"to\":\"list-server-sessions\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":1407,\"symbol\":\"listRecentServerSessions\",\"annotation\":\"RPC getServerSessions delegates to listRecentServerSessions.\"},{\"from\":\"list-server-sessions\",\"to\":\"opencode-v2-server\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/server-sessions.ts\",\"line\":182,\"symbol\":\"listRecentServerSessions\",\"annotation\":\"Build Basic-auth headers before fetching session list and active set.\"},{\"from\":\"set-event-watch\",\"to\":\"opencode-v2-server\",\"mechanism\":\"watches\",\"file\":\"packages/subsystems-studio/src/bun/server-sessions.ts\",\"line\":302,\"symbol\":\"startWatch\",\"annotation\":\"Open the /api/event SSE stream with the same Basic-auth headers.\"}]},{\"id\":\"tl-load-historical\",\"title\":\"Load historical OpenCode session events\",\"steps\":[{\"from\":\"agent-sessions-overview\",\"to\":\"build-session-index\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":1286,\"symbol\":\"buildSessionIndex\",\"annotation\":\"listSessions RPC builds the recent-window index from opencode.db.\"},{\"from\":\"build-session-index\",\"to\":\"opencode-cli\",\"mechanism\":\"reads\",\"file\":\"packages/subsystems-studio/src/bun/session-pipeline.ts\",\"line\":801,\"symbol\":\"buildSessionIndex\",\"annotation\":\"Resolve the OpenCode data-dir sqlite path for the index scan.\"},{\"from\":\"process-session-events\",\"to\":\"opencode-cli\",\"mechanism\":\"reads\",\"file\":\"packages/subsystems-studio/src/bun/session-pipeline.ts\",\"line\":1270,\"symbol\":\"processSessionEvents\",\"annotation\":\"Cache-key the OpenCode session before reading its sqlite event rows.\"},{\"from\":\"process-session-events\",\"to\":\"opencode-rows-to-universal\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/session-pipeline.ts\",\"line\":1310,\"symbol\":\"processSessionEvents\",\"annotation\":\"Convert raw OpenCode rows into universal events before normalize/accumulate.\"}]},{\"id\":\"tl-extract-concepts\",\"title\":\"Extract concepts via opencode run\",\"steps\":[{\"from\":\"agent-sessions-overview\",\"to\":\"analyze-session-bg\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":1961,\"symbol\":\"analyzeSessionInBackground\",\"annotation\":\"analyzeSession RPC starts background extraction for a new analysis id.\"},{\"from\":\"analyze-session-bg\",\"to\":\"process-session-events\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":2151,\"symbol\":\"analyzeSessionInBackground\",\"annotation\":\"Background job loads the session timeline then segments beats.\"},{\"from\":\"analyze-session-bg\",\"to\":\"analyze-beats\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":2166,\"symbol\":\"analyzeSessionInBackground\",\"annotation\":\"Segment the timeline into host-computed beats for the brief.\"},{\"from\":\"analyze-session-bg\",\"to\":\"run-opencode-extraction\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":2177,\"symbol\":\"analyzeSessionInBackground\",\"annotation\":\"Hand the brief to runOpenCodeExtraction in the background.\"},{\"from\":\"run-opencode-extraction\",\"to\":\"opencode-cli\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/extraction.ts\",\"line\":263,\"symbol\":\"runOpenCodeExtraction\",\"annotation\":\"Spawn OPENCODE_BIN run --agent concept-extractor and parse the JSON stream.\"}]},{\"id\":\"tl-run-audit\",\"title\":\"Run a dry-run audit from the Audit button\",\"steps\":[{\"from\":\"studio-model-view\",\"to\":\"graphify-targets\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"line\":347,\"symbol\":\"SubsystemModelView\",\"annotation\":\"Collect unique component purls that need a graphify cache, skipping externals.\"},{\"from\":\"studio-model-view\",\"to\":\"wait-graphify\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"line\":364,\"symbol\":\"SubsystemModelView\",\"annotation\":\"Subscribe to graphifyChanged pushes while a background build runs.\"},{\"from\":\"studio-model-view\",\"to\":\"ensure-graphify\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"line\":374,\"symbol\":\"SubsystemModelView\",\"annotation\":\"Ensure the graphify cache over RPC and wait when the status is building.\"},{\"from\":\"studio-model-view\",\"to\":\"audit-model\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"line\":443,\"symbol\":\"SubsystemModelView\",\"annotation\":\"Invoke the host dry-run audit once caches are ready.\"},{\"from\":\"audit-model\",\"to\":\"audit-modal\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"line\":452,\"symbol\":\"SubsystemModelView\",\"annotation\":\"Deliver the report into the modal done phase without mutating the graph.\"}]},{\"id\":\"tl-host-checks\",\"title\":\"Deterministic checks inside the host audit\",\"steps\":[{\"from\":\"audit-model\",\"to\":\"verify-files\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"line\":598,\"symbol\":\"auditSubsystemModel\",\"annotation\":\"Check every file exists and every claimed symbol is declared.\"},{\"from\":\"audit-model\",\"to\":\"verify-component\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"line\":667,\"symbol\":\"auditSubsystemModel\",\"annotation\":\"Verify each source component dry-run against the graphify cache.\"},{\"from\":\"verify-component\",\"to\":\"declares-symbol\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"line\":227,\"symbol\":\"verifySubsystemComponent\",\"annotation\":\"Test the claimed symbol declaration against file contents.\"}]},{\"id\":\"wt-regular-audit\",\"title\":\"Background regular audit pass\",\"steps\":[{\"from\":\"regular-audit-scheduler\",\"to\":\"regular-audit-run\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":2683,\"symbol\":\"auditOne\",\"annotation\":\"Hand the next stored model to the quiet re-audit once the timer fires.\"},{\"from\":\"regular-audit-run\",\"to\":\"audit-model\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":2662,\"symbol\":\"reauditSubsystemModelQuietly\",\"annotation\":\"Re-run the deterministic dry-run audit for the model.\"},{\"from\":\"audit-model\",\"to\":\"regular-audit-run\",\"mechanism\":\"produces\",\"file\":\"packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"line\":871,\"symbol\":\"auditSubsystemModel\",\"annotation\":\"Produce the fresh report the quiet pass persists.\"},{\"from\":\"regular-audit-scheduler\",\"to\":\"regular-audit-status\",\"mechanism\":\"produces\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":2686,\"symbol\":\"broadcastRegularAuditChanged\",\"annotation\":\"Emit scheduler status on every enable, tick and pass finish.\"},{\"from\":\"regular-audit-status\",\"to\":\"regular-audit-subscribers\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-studio/src/mainview/rpc.ts\",\"line\":151,\"symbol\":\"broadcastRegularAuditChanged\",\"annotation\":\"Fan the pushed status out to every registered renderer callback.\"},{\"from\":\"regular-audit-subscribers\",\"to\":\"studio-list\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelsView.tsx\",\"line\":645,\"symbol\":\"regularAuditChangeSubscribers\",\"annotation\":\"Re-render the model list countdown and running badge.\"}]},{\"id\":\"tl-click-load\",\"title\":\"Click subsystem, tab already open (fast path)\",\"steps\":[{\"from\":\"studio-list\",\"to\":\"open-tab\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelsView.tsx\",\"line\":981,\"symbol\":\"onOpen\",\"annotation\":\"Row click fires openSubsystemModel RPC; host takes the zero-IO focus path.\"},{\"from\":\"open-tab\",\"to\":\"studio-model-view\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":1018,\"symbol\":\"openSubsystemModelTab\",\"annotation\":\"Host broadcasts focus before any disk IO so the tab switches instantly.\"},{\"from\":\"open-tab\",\"to\":\"open-stamp\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":1019,\"symbol\":\"openSubsystemModelTab\",\"annotation\":\"Background fire-and-forget: stamp lastOpenedAt after broadcast.\"},{\"from\":\"open-stamp\",\"to\":\"studio-get\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"line\":829,\"symbol\":\"touchSubsystemModelOpened\",\"annotation\":\"Stamp path re-reads the graph file, then writes record plus index.\"},{\"from\":\"studio-model-view\",\"to\":\"studio-get\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"line\":79,\"symbol\":\"SubsystemModelView\",\"annotation\":\"Remount fetches the full graph over the bridge.\"},{\"from\":\"studio-model-view\",\"to\":\"react-graph\",\"mechanism\":\"uses\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"line\":377,\"symbol\":\"SubsystemModelView\",\"annotation\":\"Detail mounts the React Flow graph with full components and edges.\"},{\"from\":\"react-graph\",\"to\":\"build-graph\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"line\":537,\"symbol\":\"SubsystemComponentGraph\",\"annotation\":\"Graph runs pass 1 ELK layout with estimated node sizes.\"},{\"from\":\"build-graph\",\"to\":\"elk\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-react/src/subsystem/model.ts\",\"line\":1408,\"symbol\":\"buildSubsystemGraph\",\"annotation\":\"Builder runs orthogonal ELK on the main thread.\"},{\"from\":\"react-graph\",\"to\":\"layout-cover\",\"mechanism\":\"uses\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"line\":2122,\"symbol\":\"SubsystemComponentGraph\",\"annotation\":\"Cover stays opaque 650ms after layout ready plus 200ms fade.\"}]},{\"id\":\"tl-optimistic-open\",\"title\":\"First open with empty state (implemented)\",\"steps\":[{\"from\":\"studio-list\",\"to\":\"open-tab\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelsView.tsx\",\"line\":981,\"symbol\":\"onOpen\",\"annotation\":\"Row click fires RPC; host resolves title from the small index file.\"},{\"from\":\"open-tab\",\"to\":\"tab-registry\",\"mechanism\":\"writes\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":1051,\"symbol\":\"openSubsystemModelTab\",\"annotation\":\"Host creates tab from index title, no full graph read.\"},{\"from\":\"open-tab\",\"to\":\"app-shell\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":1054,\"symbol\":\"openSubsystemModelTab\",\"annotation\":\"Host broadcasts focus immediately; stamp moves to background.\"},{\"from\":\"app-shell\",\"to\":\"studio-model-view\",\"mechanism\":\"uses\",\"file\":\"packages/subsystems-studio/src/mainview/App.tsx\",\"line\":303,\"symbol\":\"App\",\"annotation\":\"Renderer switches tab and mounts detail view without waiting.\"},{\"from\":\"studio-model-view\",\"to\":\"empty-state\",\"mechanism\":\"uses\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"line\":361,\"symbol\":\"SubsystemModelView\",\"annotation\":\"Detail shows Loading placeholder while graph fetches.\"},{\"from\":\"studio-model-view\",\"to\":\"studio-get\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"line\":79,\"symbol\":\"SubsystemModelView\",\"annotation\":\"Detail fetches full graph in background and fills in on arrival.\"},{\"from\":\"open-tab\",\"to\":\"open-stamp\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":1057,\"symbol\":\"openSubsystemModelTab\",\"annotation\":\"Background fire-and-forget: stamp lastOpenedAt after broadcast.\"},{\"from\":\"studio-model-view\",\"to\":\"react-graph\",\"mechanism\":\"uses\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"line\":377,\"symbol\":\"SubsystemModelView\",\"annotation\":\"Once loaded, detail mounts graph canvas; tab already visible.\"}]},{\"id\":\"tl-debug-install\",\"title\":\"Debug tab detects and installs OpenCode V2\",\"steps\":[{\"from\":\"opencode-v2-debug-view\",\"to\":\"get-opencode-v2-status\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/views/OpencodeV2DebugView.tsx\",\"line\":22,\"symbol\":\"OpencodeV2DebugView\",\"annotation\":\"Tab loads status over RPC getOpencodeV2Status.\"},{\"from\":\"get-opencode-v2-status\",\"to\":\"opencode-bin\",\"mechanism\":\"reads\",\"file\":\"packages/subsystems-studio/src/bun/opencode-v2.ts\",\"line\":24,\"symbol\":\"resolveOpencode2Bin\",\"annotation\":\"Detect opencode2 via OPENCODE2_BIN, PATH, or ~/.opencode/bin.\"},{\"from\":\"opencode-v2-debug-view\",\"to\":\"install-opencode-v2\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/views/OpencodeV2DebugView.tsx\",\"line\":66,\"symbol\":\"OpencodeV2DebugView\",\"annotation\":\"Install button kicks installOpencodeV2 in the background.\"},{\"from\":\"install-opencode-v2\",\"to\":\"opencode-cli-npm\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/opencode-v2.ts\",\"line\":147,\"symbol\":\"installOpencodeV2\",\"annotation\":\"Runs npm install -g @opencode-ai/cli@beta when the binary is missing.\"}]},{\"id\":\"tl-ensure-opencode-v2\",\"title\":\"Studio ensures OpenCode V2 runtime\",\"steps\":[{\"from\":\"maintain-orchestrator\",\"to\":\"opencode-v2-lifecycle\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/maintain-model.ts\",\"line\":734,\"symbol\":\"maintainSubsystemModel\",\"annotation\":\"Maintain entry calls Studio's OpenCode V2 lifecycle ensure (parallel to ensureMaintainAgentsInstalled).\"},{\"from\":\"opencode-v2-lifecycle\",\"to\":\"opencode-bin\",\"mechanism\":\"reads\",\"file\":\"packages/subsystems-studio/src/bun/opencode-v2.ts\",\"line\":24,\"symbol\":\"resolveOpencode2Bin\",\"annotation\":\"Detect whether opencode2 exists and read its version.\"},{\"from\":\"opencode-v2-lifecycle\",\"to\":\"opencode-cli-npm\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/opencode-v2.ts\",\"line\":24,\"symbol\":\"resolveOpencode2Bin\",\"annotation\":\"If missing or behind, Studio installs/updates @opencode-ai/cli@beta (mirrors studio-version detect+update).\"},{\"from\":\"opencode-v2-lifecycle\",\"to\":\"opencode-v2-service\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/maintain-model.ts\",\"line\":650,\"symbol\":\"runMaintainAgent\",\"annotation\":\"Service.ensure([opencode2, serve, --service]) starts or reuses the shared V2 background server.\"}]},{\"id\":\"tl-start-maintain-via-v2\",\"title\":\"Start Maintain via OpenCode V2\",\"steps\":[{\"from\":\"maintain-picker\",\"to\":\"maintain-background\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/components/MaintainModelPickerModal.tsx\",\"line\":89,\"symbol\":\"MaintainModelPickerModal\",\"annotation\":\"RPC maintainSubsystemModel kicks the host; UI returns as soon as the run is accepted.\"},{\"from\":\"maintain-background\",\"to\":\"maintain-orchestrator\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":2328,\"symbol\":\"maintainSubsystemModelInBackground\",\"annotation\":\"Background task calls the Maintain orchestrator after broadcasting status running.\"},{\"from\":\"maintain-orchestrator\",\"to\":\"opencode-v2-lifecycle\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/maintain-model.ts\",\"line\":730,\"symbol\":\"maintainSubsystemModel\",\"annotation\":\"Before audit/run, Studio ensures OpenCode V2 is detected, installed/updated, and the service is up.\"},{\"from\":\"opencode-v2-lifecycle\",\"to\":\"opencode-bin\",\"mechanism\":\"reads\",\"file\":\"packages/subsystems-studio/src/bun/opencode-v2.ts\",\"line\":24,\"symbol\":\"resolveOpencode2Bin\",\"annotation\":\"Detect opencode2 via OPENCODE2_BIN / PATH (today this constant points at V1 opencode).\"},{\"from\":\"opencode-v2-lifecycle\",\"to\":\"opencode-cli-npm\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/opencode-v2.ts\",\"line\":24,\"symbol\":\"resolveOpencode2Bin\",\"annotation\":\"If missing or behind beta, Studio installs/updates @opencode-ai/cli@beta (same idea as studio-version update).\"},{\"from\":\"opencode-v2-lifecycle\",\"to\":\"opencode-v2-service\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/maintain-model.ts\",\"line\":650,\"symbol\":\"runMaintainAgent\",\"annotation\":\"Service.ensure([opencode2, serve, --service]) starts or reuses the shared V2 background server.\"},{\"from\":\"maintain-orchestrator\",\"to\":\"run-maintain-agent\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/maintain-model.ts\",\"line\":769,\"symbol\":\"maintainSubsystemModel\",\"annotation\":\"After runtime is ready, hand off the brief to the agent runner seam.\"},{\"from\":\"run-maintain-agent\",\"to\":\"opencode-v2-service\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/maintain-model.ts\",\"line\":651,\"symbol\":\"runMaintainAgent\",\"annotation\":\"Create session + prompt on the ensured V2 service (replaces Bun.spawn opencode run).\"},{\"from\":\"opencode-v2-service\",\"to\":\"maintain-agent\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-studio/src/bun/maintain-model.ts\",\"line\":650,\"symbol\":\"runMaintainAgent\",\"annotation\":\"V2 server loads issue-fixer or gap-filler and runs the brief as a session prompt.\"}]},{\"id\":\"tl-live-progress-sse\",\"title\":\"Live progress over V2 SSE\",\"steps\":[{\"from\":\"run-maintain-agent\",\"to\":\"opencode-v2-service\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/maintain-model.ts\",\"line\":651,\"symbol\":\"runMaintainAgent\",\"annotation\":\"Same seam also opens client.event.subscribe() scoped to the Maintain session.\"},{\"from\":\"opencode-v2-service\",\"to\":\"maintain-background\",\"mechanism\":\"produces\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":2319,\"symbol\":\"maintainSubsystemModelInBackground\",\"annotation\":\"Proposed: forward message/part/tool events into Maintain broadcasts instead of waiting for process exit.\"},{\"from\":\"maintain-background\",\"to\":\"studio-message-subscriber\",\"mechanism\":\"produces\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":2325,\"symbol\":\"maintainSubsystemModelInBackground\",\"annotation\":\"Host pushes subsystemModelMaintainChanged. StudioMessageSubscriber now types the payload; renderer subscription sites are the fan-out.\"}]},{\"id\":\"tl-agent-proposes\",\"title\":\"Agent proposes via Studio HTTP\",\"steps\":[{\"from\":\"maintain-agent\",\"to\":\"http-put\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/http-server.ts\",\"line\":354,\"symbol\":\"handleSubsystemModelRequest\",\"annotation\":\"Agent curls POST /api/subsystem-model/:id/proposals using Access commands from the brief.\"},{\"from\":\"http-put\",\"to\":\"create-proposal\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/http-server.ts\",\"line\":354,\"symbol\":\"handleSubsystemModelRequest\",\"annotation\":\"HTTP handler validates body and creates a pending proposal in the proposal store.\"},{\"from\":\"http-put\",\"to\":\"studio-message-subscriber\",\"mechanism\":\"produces\",\"file\":\"packages/subsystems-studio/src/mainview/rpc.ts\",\"line\":71,\"symbol\":\"subsystemModelProposalsChangeSubscribers\",\"annotation\":\"HTTP onProposalsChanged dispatch lands on the contract type node — the fan-out bag is plumbing under the refactor.\"}]},{\"id\":\"tl-list-maintain\",\"title\":\"List Maintenance Sessions\",\"steps\":[{\"from\":\"render-static-view\",\"to\":\"agent-sessions-overview\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/App.tsx\",\"line\":119,\"symbol\":\"renderStaticView\",\"annotation\":\"Maintenance Sessions tab mounts the shared overview with scope=maintain.\"},{\"from\":\"agent-sessions-overview\",\"to\":\"list-maintain-sessions\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/views/AgentSessions.tsx\",\"line\":360,\"symbol\":\"AgentSessionsOverviewView\",\"annotation\":\"Renderer RPC listMaintainSessions for the day window.\"},{\"from\":\"list-maintain-sessions\",\"to\":\"list-maintain-sessions\",\"mechanism\":\"reads\",\"file\":\"packages/subsystems-studio/src/bun/maintain-sessions.ts\",\"line\":161,\"symbol\":\"listMaintainSessions\",\"annotation\":\"Read session_v2 rows where agent is issue-fixer/gap-filler or title starts with Maintain.\"}]},{\"id\":\"tl-load-timeline-gap\",\"title\":\"Load timeline (empty for V2 Maintain)\",\"steps\":[{\"from\":\"agent-sessions-overview\",\"to\":\"rpc-overview\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/views/AgentSessions.tsx\",\"line\":411,\"symbol\":\"AgentSessionsOverviewView\",\"annotation\":\"Seed the panel via getAgentSessionsOverview({ scope: maintain }).\"},{\"from\":\"rpc-overview\",\"to\":\"list-maintain-sessions\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":1805,\"symbol\":\"getAgentSessionsOverview\",\"annotation\":\"Host lists Maintain session ids from session_v2.\"},{\"from\":\"rpc-overview\",\"to\":\"process-session-events\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":179,\"symbol\":\"buildSessionEvents\",\"annotation\":\"buildSessionEvents delegates to processSessionEvents for each Maintain id.\"},{\"from\":\"process-session-events\",\"to\":\"process-session-events\",\"mechanism\":\"reads\",\"file\":\"packages/subsystems-studio/src/bun/session-pipeline.ts\",\"line\":1292,\"symbol\":\"processSessionEvents\",\"annotation\":\"SELECT FROM event — V2 Maintain sessions have 0 rows here; transcripts are in session_message instead.\"},{\"from\":\"agent-sessions-overview\",\"to\":\"build-agent-sessions-view\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/views/AgentSessions.tsx\",\"line\":439,\"symbol\":\"buildAgentSessionsView\",\"annotation\":\"Empty events → buildAgentSessionsView returns null → drawer shows no timeline.\"}]},{\"id\":\"tl-create-maintain\",\"title\":\"Create a Maintain run\",\"steps\":[{\"from\":\"run-opencode-v2-session\",\"to\":\"opencode2-service\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/opencode-v2-live.ts\",\"line\":291,\"symbol\":\"runOpencodeV2AgentSession\",\"annotation\":\"Create+prompt against the running opencode2 HTTP service.\"},{\"from\":\"run-opencode-v2-session\",\"to\":\"list-maintain-sessions\",\"mechanism\":\"writes\",\"file\":\"packages/subsystems-studio/src/bun/opencode-v2-live.ts\",\"line\":291,\"symbol\":\"runOpencodeV2AgentSession\",\"annotation\":\"Service persists session_v2 metadata (title Maintain — …, agent) that the tab lists.\"},{\"from\":\"run-opencode-v2-session\",\"to\":\"run-opencode-v2-session\",\"mechanism\":\"writes\",\"file\":\"packages/subsystems-studio/src/bun/opencode-v2-live.ts\",\"line\":291,\"symbol\":\"runOpencodeV2AgentSession\",\"annotation\":\"Turns land in session_message — not the event table processSessionEvents reads.\"}]},{\"id\":\"tl-maintain-list\",\"title\":\"List Maintenance Sessions\",\"steps\":[{\"from\":\"agent-sessions-overview\",\"to\":\"list-maintain-sessions\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/views/AgentSessions.tsx\",\"line\":360,\"symbol\":\"AgentSessionsOverviewView\",\"annotation\":\"scope=maintain calls listMaintainSessions for the day window.\"},{\"from\":\"list-maintain-sessions\",\"to\":\"store-session-v2\",\"mechanism\":\"reads\",\"file\":\"packages/subsystems-studio/src/bun/maintain-sessions.ts\",\"line\":161,\"symbol\":\"listMaintainSessions\",\"annotation\":\"SELECT from session_v2 where agent is issue-fixer/gap-filler or title is Maintain — …\"}]},{\"id\":\"tl-v1-timeline\",\"title\":\"V1 timeline (event table)\",\"steps\":[{\"from\":\"agent-sessions-overview\",\"to\":\"process-session-events\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/views/AgentSessions.tsx\",\"line\":411,\"symbol\":\"AgentSessionsOverviewView\",\"annotation\":\"Overview loads processed timelines via getAgentSessionsOverview → processSessionEvents.\"},{\"from\":\"process-session-events\",\"to\":\"resolve-kind\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/session-pipeline.ts\",\"line\":1200,\"symbol\":\"processSessionEvents\",\"annotation\":\"Planned: resolveOpencodeSessionKind before choosing a reader (v1 for session-table ids).\"},{\"from\":\"resolve-kind\",\"to\":\"store-session\",\"mechanism\":\"reads\",\"file\":\"packages/subsystems-studio/src/bun/session-pipeline.ts\",\"line\":1200,\"symbol\":\"processSessionEvents\",\"annotation\":\"V1 identity: row exists in session (e.g. version 1.18.30).\"},{\"from\":\"process-session-events\",\"to\":\"store-event\",\"mechanism\":\"reads\",\"file\":\"packages/subsystems-studio/src/bun/session-pipeline.ts\",\"line\":1292,\"symbol\":\"processSessionEvents\",\"annotation\":\"SELECT FROM event WHERE aggregate_id = ? — today's OpenCode path.\"},{\"from\":\"process-session-events\",\"to\":\"opencode-rows-to-universal\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/session-pipeline.ts\",\"line\":1318,\"symbol\":\"opencodeRowsToUniversalEvents\",\"annotation\":\"Map event rows to UniversalAgentSessionEvent.\"},{\"from\":\"opencode-rows-to-universal\",\"to\":\"accumulate-events\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-studio/src/bun/session-pipeline.ts\",\"line\":1336,\"symbol\":\"accumulateEvents\",\"annotation\":\"Accumulate into SessionEventRow for the panel.\"}]},{\"id\":\"tl-v2-timeline\",\"title\":\"V2 timeline (session_message)\",\"steps\":[{\"from\":\"agent-sessions-overview\",\"to\":\"process-session-events\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/views/AgentSessions.tsx\",\"line\":411,\"symbol\":\"AgentSessionsOverviewView\",\"annotation\":\"Same overview load path; kind routing chooses the V2 reader.\"},{\"from\":\"process-session-events\",\"to\":\"resolve-kind\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/session-pipeline.ts\",\"line\":1200,\"symbol\":\"processSessionEvents\",\"annotation\":\"Planned: session_v2 row → kind v2 (e.g. Maintain — … beta sessions).\"},{\"from\":\"resolve-kind\",\"to\":\"store-session-v2\",\"mechanism\":\"reads\",\"file\":\"packages/subsystems-studio/src/bun/maintain-sessions.ts\",\"line\":161,\"symbol\":\"listMaintainSessions\",\"annotation\":\"V2 identity signal is the session_v2 metadata row (same table listing uses).\"},{\"from\":\"process-session-events\",\"to\":\"store-session-message\",\"mechanism\":\"reads\",\"file\":\"packages/subsystems-studio/src/bun/session-pipeline.ts\",\"line\":1200,\"symbol\":\"processSessionEvents\",\"annotation\":\"Planned: read session_message instead of event for v2 ids.\"},{\"from\":\"process-session-events\",\"to\":\"session-messages-to-universal\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/session-pipeline.ts\",\"line\":1200,\"symbol\":\"processSessionEvents\",\"annotation\":\"Planned: sessionMessagesToUniversalEvents maps user/tool/text parts.\"},{\"from\":\"session-messages-to-universal\",\"to\":\"accumulate-events\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-core/src/opencode/pipeline.ts\",\"line\":85,\"symbol\":\"accumulateEvents\",\"annotation\":\"Same accumulate path as V1 — panel format stays shared.\"}]},{\"id\":\"tl-authored-renders-unknown\",\"title\":\"Authored declaration → panel shows = unknown\",\"steps\":[{\"from\":\"react-graph\",\"to\":\"component-declaration\",\"mechanism\":\"uses\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"line\":1776,\"symbol\":\"SubsystemComponentGraph\",\"annotation\":\"Selected node opens ComponentDeclaration with the raw component.\"},{\"from\":\"component-declaration\",\"to\":\"tokenize-component\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-react/src/subsystem/ComponentDeclaration.tsx\",\"line\":565,\"symbol\":\"ComponentDeclaration\",\"annotation\":\"Panel tokenizes from the component, never remapping declaration.\"},{\"from\":\"tokenize-component\",\"to\":\"generate-decl-string\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-react/src/subsystem/tokenizeComponent.ts\",\"line\":66,\"symbol\":\"tokenizeComponent\",\"annotation\":\"Without wire tokens, generate a TypeScript declaration string.\"},{\"from\":\"generate-decl-string\",\"to\":\"react-component\",\"mechanism\":\"reads\",\"file\":\"packages/subsystems-react/src/subsystem/formatDeclaration.ts\",\"line\":19,\"symbol\":\"generateDeclarationString\",\"annotation\":\"Reads component.detail only — authored schema declaration is invisible.\"}]},{\"id\":\"tl-verified-detail-works\",\"title\":\"Verified graphify capture → detail → panel\",\"steps\":[{\"from\":\"adopt-detail\",\"to\":\"react-component\",\"mechanism\":\"writes\",\"file\":\"packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"line\":1428,\"symbol\":\"buildDetailFromAdoptedSignature\",\"annotation\":\"Audit adopt-signature writes verified detail onto the component.\"},{\"from\":\"normalize-detail\",\"to\":\"react-component\",\"mechanism\":\"writes\",\"file\":\"packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"line\":486,\"symbol\":\"normalizeDetailProvenance\",\"annotation\":\"Store defaults provenance and backfills required detail arrays.\"},{\"from\":\"generate-decl-string\",\"to\":\"react-component\",\"mechanism\":\"reads\",\"file\":\"packages/subsystems-react/src/subsystem/formatDeclaration.ts\",\"line\":19,\"symbol\":\"generateDeclarationString\",\"annotation\":\"Same renderer path — now detail is populated so the signature shows.\"},{\"from\":\"tokenize-component\",\"to\":\"generate-decl-string\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-react/src/subsystem/tokenizeComponent.ts\",\"line\":66,\"symbol\":\"tokenizeComponent\",\"annotation\":\"Format and tokenize the populated declaration string.\"},{\"from\":\"component-declaration\",\"to\":\"tokenize-component\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-react/src/subsystem/ComponentDeclaration.tsx\",\"line\":565,\"symbol\":\"ComponentDeclaration\",\"annotation\":\"Click panel paints the verified signature.\"}]},{\"id\":\"tl-proposed-single-source\",\"title\":\"Proposed: panel reads schema declaration\",\"steps\":[{\"from\":\"generate-decl-string\",\"to\":\"core-declaration\",\"mechanism\":\"reads\",\"file\":\"packages/subsystems-core/src/types/subsystem-model.ts\",\"line\":224,\"symbol\":\"SubsystemConstructDeclaration\",\"annotation\":\"Repoint generateDeclarationString at this union (and migrate capture into it).\"}]},{\"id\":\"wt-frame-today\",\"title\":\"Frame a document (today)\",\"steps\":[{\"from\":\"react-graph\",\"to\":\"build-graph\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"line\":424,\"symbol\":\"SubsystemComponentGraph\",\"annotation\":\"Document change triggers buildSubsystemGraph.\"},{\"from\":\"build-graph\",\"to\":\"to-nodes\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-react/src/subsystem/model.ts\",\"line\":936,\"symbol\":\"buildSubsystemGraph\",\"annotation\":\"Leaves first — convertSubsystemToNodes stamps parentId.\"},{\"from\":\"to-nodes\",\"to\":\"module-id\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-react/src/subsystem/model.ts\",\"line\":834,\"symbol\":\"convertSubsystemToNodes\",\"annotation\":\"If module is set, parentId is module:… — process is ignored for the leaf.\"},{\"from\":\"build-graph\",\"to\":\"process-regions\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-react/src/subsystem/model.ts\",\"line\":942,\"symbol\":\"buildSubsystemGraph\",\"annotation\":\"Collect process regions (multi-member only after filter).\"},{\"from\":\"build-graph\",\"to\":\"module-regions\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-react/src/subsystem/model.ts\",\"line\":943,\"symbol\":\"buildSubsystemGraph\",\"annotation\":\"Collect module regions — flat list merged with process regions.\"},{\"from\":\"build-graph\",\"to\":\"boundary-id\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-react/src/subsystem/model.ts\",\"line\":1019,\"symbol\":\"buildSubsystemGraph\",\"annotation\":\"Each region becomes a flat ELK group id via boundaryGroupNodeId.\"},{\"from\":\"build-graph\",\"to\":\"elk\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-react/src/subsystem/model.ts\",\"line\":1009,\"symbol\":\"buildSubsystemGraph\",\"annotation\":\"computeElkLayout gets a flat groups[] — one parent level only.\"},{\"from\":\"react-graph\",\"to\":\"group-node\",\"mechanism\":\"uses\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"line\":178,\"symbol\":\"SubsystemComponentGraph\",\"annotation\":\"RF registers SubsystemGroupNode for type subsystem-group.\"}]},{\"id\":\"wt-nesting-gap\",\"title\":\"Where nesting would land\",\"steps\":[{\"from\":\"to-nodes\",\"to\":\"process-id\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-react/src/subsystem/model.ts\",\"line\":836,\"symbol\":\"convertSubsystemToNodes\",\"annotation\":\"Today process parentId only applies when module is absent. Nesting needs module group parentId = process:….\"},{\"from\":\"elk\",\"to\":\"nest-groups\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-react/src/utils/elkLayout.ts\",\"line\":535,\"symbol\":\"computeElkLayout\",\"annotation\":\"elkParents are siblings under root. Nesting would push module parents into process children and recurse groupBounds.\"},{\"from\":\"elk\",\"to\":\"elk\",\"mechanism\":\"uses\",\"file\":\"packages/subsystems-react/src/utils/elkLayout.ts\",\"line\":550,\"symbol\":\"computeElkLayout\",\"annotation\":\"INCLUDE_CHILDREN already on — ELK can nest; our groupDefs builder cannot yet.\"}]},{\"id\":\"wt-nest\",\"title\":\"Nest process → module → export\",\"steps\":[{\"from\":\"react-graph\",\"to\":\"build-graph\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"line\":424,\"symbol\":\"SubsystemComponentGraph\",\"annotation\":\"Document change triggers buildSubsystemGraph.\"},{\"from\":\"build-graph\",\"to\":\"to-nodes\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-react/src/subsystem/model.ts\",\"line\":1002,\"symbol\":\"buildSubsystemGraph\",\"annotation\":\"Leaves first — convertSubsystemToNodes stamps module/process parentId.\"},{\"from\":\"build-graph\",\"to\":\"layout-groups\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-react/src/subsystem/model.ts\",\"line\":1005,\"symbol\":\"buildSubsystemGraph\",\"annotation\":\"buildBoundaryLayoutGroups nests module groups under shared process.\"},{\"from\":\"layout-groups\",\"to\":\"module-regions\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-react/src/subsystem/model.ts\",\"line\":533,\"symbol\":\"buildBoundaryLayoutGroups\",\"annotation\":\"Multi-member modules become frames; parentId set when process is unanimous.\"},{\"from\":\"build-graph\",\"to\":\"elk\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-react/src/subsystem/model.ts\",\"line\":1081,\"symbol\":\"buildSubsystemGraph\",\"annotation\":\"computeElkLayout gets nested groups[] with parentId.\"},{\"from\":\"react-graph\",\"to\":\"group-node\",\"mechanism\":\"uses\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"line\":178,\"symbol\":\"SubsystemComponentGraph\",\"annotation\":\"RF registers SubsystemGroupNode for type subsystem-group.\"}]},{\"id\":\"wt-paint\",\"title\":\"Paint the diagnostics\",\"steps\":[{\"from\":\"studio-model-view\",\"to\":\"report-load\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":2030,\"symbol\":\"loadSubsystemModelAudit\",\"annotation\":\"The getSubsystemModelAudit RPC is served here by reading the saved report.\"},{\"from\":\"studio-model-view\",\"to\":\"map-issues\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"line\":318,\"symbol\":\"auditReportToIssues\",\"annotation\":\"Map the report's findings to presentation issues.\"},{\"from\":\"studio-model-view\",\"to\":\"react-graph\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"line\":377,\"symbol\":\"SubsystemComponentGraph\",\"annotation\":\"Pass issues, diagnostic status, and (planned) verification into the graph.\"},{\"from\":\"react-graph\",\"to\":\"node\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"line\":226,\"symbol\":\"nodeTypes\",\"annotation\":\"Each node's data carries the verification ladder and hover issue.\"},{\"from\":\"react-graph\",\"to\":\"chip\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"line\":1547,\"symbol\":\"SubsystemDiagnosticToggle\",\"annotation\":\"The title row renders the status chip.\"},{\"from\":\"react-graph\",\"to\":\"issue-list\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"line\":1614,\"symbol\":\"SubsystemIssueList\",\"annotation\":\"The sidebar bottom panel renders the grouped issue list.\"}]},{\"id\":\"wt-run\",\"title\":\"Run the audit\",\"steps\":[{\"from\":\"studio-model-view\",\"to\":\"audit-flow\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"line\":294,\"symbol\":\"runSubsystemModelAuditFlow\",\"annotation\":\"Chip click with no or stale report runs the audit flow.\"},{\"from\":\"audit-flow\",\"to\":\"audit-model\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/auditSubsystemModelFlow.ts\",\"line\":271,\"symbol\":\"auditSubsystemModel\",\"annotation\":\"Run the host audit over the RPC bridge.\"},{\"from\":\"audit-model\",\"to\":\"report-save\",\"mechanism\":\"writes\",\"file\":\"packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"line\":1333,\"symbol\":\"saveSubsystemModelAudit\",\"annotation\":\"Persist the fresh report so the view can fetch it.\"}]},{\"id\":\"wt-write\",\"title\":\"Write-time verification (create/update)\",\"steps\":[{\"from\":\"studio-create\",\"to\":\"verify-files\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"line\":991,\"symbol\":\"verifyModelFiles\",\"annotation\":\"Create runs the write-time pass and stores the result on the record.\"},{\"from\":\"verify-files\",\"to\":\"resolve-root\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"line\":670,\"symbol\":\"resolveRepoRootForComponent\",\"annotation\":\"Each component's file is resolved against its local repo root and checked on disk.\"}]},{\"id\":\"wt-audit\",\"title\":\"Audit (dry-run, graphify-backed)\",\"steps\":[{\"from\":\"audit-model\",\"to\":\"verify-component\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"line\":950,\"symbol\":\"verifySubsystemComponent\",\"annotation\":\"Per component, run the graphify-backed verification in dry-run mode.\"},{\"from\":\"verify-component\",\"to\":\"anchor\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"line\":429,\"symbol\":\"resolveComponentAnchor\",\"annotation\":\"Anchor file+symbol onto a graphify definition node before construct/signature checks.\"},{\"from\":\"audit-model\",\"to\":\"topology\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"line\":1233,\"symbol\":\"auditTopologyRelations\",\"annotation\":\"Layer 2: relations[] endpoints + soft corroboration.\"},{\"from\":\"audit-model\",\"to\":\"boundary\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"line\":1263,\"symbol\":\"auditBoundaryFields\",\"annotation\":\"Layer 3: module/file membership + process nesting.\"},{\"from\":\"verify-component\",\"to\":\"infer-construct\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"line\":530,\"symbol\":\"inferConstructFromGraphify\",\"annotation\":\"Infer the construct kind from the anchored node (heuristic hint).\"},{\"from\":\"verify-component\",\"to\":\"constructs-match\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"line\":581,\"symbol\":\"constructsMatch\",\"annotation\":\"Compare the claimed construct against the inferred one.\"},{\"from\":\"verify-component\",\"to\":\"compare-signatures\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"line\":649,\"symbol\":\"compareSignatures\",\"annotation\":\"Compare authored named types against graphify signature edges.\"},{\"from\":\"topology\",\"to\":\"topo-relation\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/topology-audit.ts\",\"line\":453,\"symbol\":\"graphifyHasRelationBetween\",\"annotation\":\"Soft corroboration: does graphify have this relation?\"},{\"from\":\"topology\",\"to\":\"topo-hints\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/topology-audit.ts\",\"line\":464,\"symbol\":\"graphifyHasRelationTowardHints\",\"annotation\":\"Soft label match when the target has no exact anchor.\"},{\"from\":\"boundary\",\"to\":\"module-agrees\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/boundary-audit.ts\",\"line\":144,\"symbol\":\"moduleAgreesWithFile\",\"annotation\":\"Is the module the file or a directory prefix of it?\"}]},{\"id\":\"wt-open-file\",\"title\":\"Open a file in the graph\",\"steps\":[{\"from\":\"studio-model-view\",\"to\":\"react-graph\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"line\":377,\"symbol\":\"SubsystemModelView\",\"annotation\":\"Host injects the path-keyed file viewer and readFile closure into the graph.\"},{\"from\":\"react-graph\",\"to\":\"file-drawer\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"line\":2049,\"symbol\":\"SubsystemComponentGraph\",\"annotation\":\"A click sets the drawer target, opens the bottom drawer, and re-tags every node for file spotlight.\"},{\"from\":\"studio-model-view\",\"to\":\"pierre-file-view\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"line\":149,\"symbol\":\"renderFileViewer\",\"annotation\":\"renderFileViewer mounts the full-file viewer, or PierreSnippetView for a declaration line.\"}]},{\"id\":\"wt-read-file\",\"title\":\"Read the file and paint it\",\"steps\":[{\"from\":\"pierre-file-view\",\"to\":\"read-file\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-react/src/pierre/PierreFileView.tsx\",\"line\":60,\"symbol\":\"PierreFileView\",\"annotation\":\"Viewer calls the host readFile closure for this path.\"},{\"from\":\"read-file\",\"to\":\"studio-get\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":1460,\"symbol\":\"readFile\",\"annotation\":\"Each open re-reads and JSON-parses the entire graph record because the host caches nothing.\"},{\"from\":\"read-file\",\"to\":\"resolve-sandboxed\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":1467,\"symbol\":\"readFile\",\"annotation\":\"Handler resolves the repo-relative path under the graph's root and rejects traversal.\"},{\"from\":\"read-file\",\"to\":\"node-fs\",\"mechanism\":\"reads\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":1468,\"symbol\":\"readFile\",\"annotation\":\"Reads the target file content and returns it over IPC as one string.\"},{\"from\":\"pierre-file-view\",\"to\":\"preload-highlighter\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-react/src/pierre/PierreFileView.tsx\",\"line\":77,\"symbol\":\"PierreFileView\",\"annotation\":\"Warms the shared Shiki grammar for this language before mounting the code view.\"},{\"from\":\"preload-highlighter\",\"to\":\"highlighter-store\",\"mechanism\":\"writes\",\"file\":\"packages/subsystems-react/node_modules/@pierre/diffs/dist/highlighter/shared_highlighter.js\",\"line\":13,\"symbol\":\"getSharedHighlighter\",\"annotation\":\"Initializes the process-wide singleton; loaded grammars and themes land here and are reused on later opens.\"},{\"from\":\"pierre-file-view\",\"to\":\"pierre-file-component\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-react/src/pierre/PierreFileView.tsx\",\"line\":121,\"symbol\":\"PierreFileView\",\"annotation\":\"Once content and highlighter are ready, File tokenizes and paints on the main thread.\"}]},{\"id\":\"wt-close-cmd-w\",\"title\":\"Close the active tab with ⌘W\",\"steps\":[{\"from\":\"app-menu\",\"to\":\"close-tab\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":3299,\"symbol\":\"ApplicationMenu\",\"annotation\":\"The File > Close Tab accelerator fires closeActiveTab; the host closes its *suggested* tab, which setActiveTab keeps in sync with the renderer's active tab.\"},{\"from\":\"close-tab\",\"to\":\"is-permanent\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":3241,\"symbol\":\"closeTabById\",\"annotation\":\"Permanent tabs are rejected — ⌘W never dismisses the fixed strip (Trails, Subsystems, …).\"},{\"from\":\"close-tab\",\"to\":\"tab-registry\",\"mechanism\":\"writes\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":3245,\"symbol\":\"closeTabById\",\"annotation\":\"Delete the tab record from the host's in-memory map.\"},{\"from\":\"close-tab\",\"to\":\"broadcast-tabs\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":3252,\"symbol\":\"closeTabById\",\"annotation\":\"Re-broadcast so every renderer view refreshes its tab list and picks a fallback.\"},{\"from\":\"broadcast-tabs\",\"to\":\"reload-subs\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-studio/src/mainview/rpc.ts\",\"line\":111,\"symbol\":\"tabsChanged\",\"annotation\":\"Host pushes tabsChanged across the RPC bridge; the renderer handler fans it out to every subscriber.\"},{\"from\":\"reload-subs\",\"to\":\"app-shell\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/rpc.ts\",\"line\":111,\"symbol\":\"tabsChanged\",\"annotation\":\"App's registered refresh callback runs, dropping the closed tab from local state.\"},{\"from\":\"app-shell\",\"to\":\"rpc-bridge\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/App.tsx\",\"line\":340,\"symbol\":\"refresh\",\"annotation\":\"The shell asks the host for the current tab list.\"},{\"from\":\"rpc-bridge\",\"to\":\"tab-registry\",\"mechanism\":\"reads\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":1425,\"symbol\":\"listTabs\",\"annotation\":\"listTabs serializes the registry plus the resume suggestion; the shell re-derives its active tab from the result.\"}]},{\"id\":\"wt-close-strip-x\",\"title\":\"Close a tab from the strip's × button\",\"steps\":[{\"from\":\"app-shell\",\"to\":\"tab-strip\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-studio/src/mainview/App.tsx\",\"line\":415,\"symbol\":\"App\",\"annotation\":\"App wires its onClose callback into the strip — the × affordance invokes it.\"},{\"from\":\"app-shell\",\"to\":\"rpc-bridge\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/App.tsx\",\"line\":381,\"symbol\":\"onClose\",\"annotation\":\"onClose asks the host to close that specific tab id (the click path closes the tab you clicked, not the suggestion).\"},{\"from\":\"rpc-bridge\",\"to\":\"close-tab\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":1450,\"symbol\":\"closeTab\",\"annotation\":\"The host's closeTab handler funnels into the same closeTabById choke point ⌘W uses.\"},{\"from\":\"close-tab\",\"to\":\"tab-registry\",\"mechanism\":\"writes\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":3245,\"symbol\":\"closeTabById\",\"annotation\":\"Delete the tab record from the host's in-memory map.\"},{\"from\":\"close-tab\",\"to\":\"broadcast-tabs\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":3252,\"symbol\":\"closeTabById\",\"annotation\":\"Re-broadcast so the strip re-renders without the closed tab.\"},{\"from\":\"broadcast-tabs\",\"to\":\"reload-subs\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-studio/src/mainview/rpc.ts\",\"line\":111,\"symbol\":\"tabsChanged\",\"annotation\":\"Same host notification, same renderer fan-out.\"},{\"from\":\"reload-subs\",\"to\":\"app-shell\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/rpc.ts\",\"line\":111,\"symbol\":\"tabsChanged\",\"annotation\":\"The shell refreshes and falls back to a remaining tab.\"}]},{\"id\":\"wt-create\",\"title\":\"Create or update a model\",\"steps\":[{\"from\":\"http-put\",\"to\":\"input-validation\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/http-server.ts\",\"line\":328,\"symbol\":\"handleSubsystemModelRequest\",\"annotation\":\"Reject an invalid document before anything is persisted.\"},{\"from\":\"http-put\",\"to\":\"register-roots\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/http-server.ts\",\"line\":332,\"symbol\":\"handleSubsystemModelRequest\",\"annotation\":\"Hand any supplied roots to the registry.\"},{\"from\":\"register-roots\",\"to\":\"alexandria-register\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/http-server.ts\",\"line\":134,\"symbol\":\"registerSuppliedRoots\",\"annotation\":\"Learn the roots into Alexandria, not the record.\"},{\"from\":\"http-put\",\"to\":\"studio-create\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/http-server.ts\",\"line\":334,\"symbol\":\"handleSubsystemModelRequest\",\"annotation\":\"Persist the validated document.\"},{\"from\":\"studio-create\",\"to\":\"verify-files\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"line\":762,\"symbol\":\"createSubsystemModel\",\"annotation\":\"Stamp verification before the record hits disk.\"},{\"from\":\"verify-files\",\"to\":\"resolve-root\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"line\":459,\"symbol\":\"verifyModelFiles\",\"annotation\":\"Resolve each component's checkout from its purl.\"},{\"from\":\"resolve-root\",\"to\":\"alexandria-resolve\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"line\":413,\"symbol\":\"resolveRepoRootForComponent\",\"annotation\":\"Delegate the purl lookup to the registry.\"},{\"from\":\"alexandria-resolve\",\"to\":\"registry-file\",\"mechanism\":\"reads\",\"file\":\"packages/subsystems-studio/src/bun/alexandria.ts\",\"line\":200,\"symbol\":\"resolveRepoRootFromAlexandria\",\"annotation\":\"Match the repo's remote against registered projects.\"}]},{\"id\":\"wt-list\",\"title\":\"List models as repo cards\",\"steps\":[{\"from\":\"studio-list\",\"to\":\"store-list\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelsView.tsx\",\"line\":645,\"symbol\":\"refresh\",\"annotation\":\"Renderer asks the host for the model list over RPC.\"},{\"from\":\"store-list\",\"to\":\"studio-get\",\"mechanism\":\"reads\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":1953,\"symbol\":\"listSubsystemModels\",\"annotation\":\"The host handler reads each record to build a summary.\"},{\"from\":\"studio-get\",\"to\":\"repo-derivation\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":1997,\"symbol\":\"githubReposFromComponents\",\"annotation\":\"Derive each model's repos from its component purls — no stored repo field.\"},{\"from\":\"repo-derivation\",\"to\":\"model-listing\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelsView.tsx\",\"line\":329,\"symbol\":\"collectReposFromGraphs\",\"annotation\":\"Group models into repo cards from the derived repos.\"}]},{\"id\":\"wt-audit__dup1\",\"title\":\"Audit a model\",\"steps\":[{\"from\":\"audit-model\",\"to\":\"audit-readiness\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"line\":1179,\"symbol\":\"auditSubsystemModel\",\"annotation\":\"Ask which component purls have a current graphify cache.\"},{\"from\":\"audit-readiness\",\"to\":\"resolve-purl-root\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/graphify-store.ts\",\"line\":907,\"symbol\":\"assessSubsystemGraphifyReadiness\",\"annotation\":\"Resolve each purl's checkout to key the cache slot.\"},{\"from\":\"resolve-purl-root\",\"to\":\"alexandria-resolve\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/graphify-store.ts\",\"line\":279,\"symbol\":\"resolveRepoRootForPurl\",\"annotation\":\"Same registry lookup the write path uses.\"}]},{\"id\":\"wt-propose\",\"title\":\"Propose and accept a correction bound to a component id\",\"steps\":[{\"from\":\"audit-model\",\"to\":\"create-proposal\",\"mechanism\":\"produces\",\"file\":\"packages/subsystems-studio/src/bun/proposal-store.ts\",\"line\":522,\"symbol\":\"createSubsystemModelProposal\",\"annotation\":\"Audit findings drive an agent-proposed correction; the change list targets component ids (and topology endpoints).\"},{\"from\":\"create-proposal\",\"to\":\"proposal-accept\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-studio/src/bun/proposal-store.ts\",\"line\":558,\"symbol\":\"acceptSubsystemModelProposal\",\"annotation\":\"An accepted proposal rewrites the model by component id — ids are the binding key.\"}]},{\"id\":\"wt-adopt\",\"title\":\"Adopt graphify findings onto a component\",\"steps\":[{\"from\":\"audit-model\",\"to\":\"fix-adopt\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"line\":1342,\"symbol\":\"applySubsystemModelAuditFix\",\"annotation\":\"A fix adopts graphify signature / file / declaration-ref onto the targeted componentId.\"},{\"from\":\"fix-adopt\",\"to\":\"studio-get\",\"mechanism\":\"reads\",\"file\":\"packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"line\":1366,\"symbol\":\"applySubsystemModelAuditFix\",\"annotation\":\"Re-reads the record and rewrites the component that owns the id.\"}]},{\"id\":\"wt-excalidraw\",\"title\":\"Excalidraw round-trip of a model\",\"steps\":[{\"from\":\"studio-get\",\"to\":\"excalidraw-scene-build\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-studio/src/mainview/excalidraw/subsystemToExcalidraw.ts\",\"line\":152,\"symbol\":\"principalMetaForComponent\",\"annotation\":\"Each component carries its id onto its element so the scene holds the model's identity.\"},{\"from\":\"excalidraw-scene-build\",\"to\":\"excalidraw-model-rebuild\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-studio/src/mainview/excalidraw/excalidrawToSubsystem.ts\",\"line\":140,\"symbol\":\"excalidrawSceneToSubsystemModel\",\"annotation\":\"The edited scene becomes a document again; ids ride through the metadata verbatim.\"}]},{\"id\":\"wt-merge\",\"title\":\"Compose a repo's models into one graph (proposed)\",\"steps\":[{\"from\":\"studio-get\",\"to\":\"merge-models\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-studio/src/bun/merge-submodel-models.ts\",\"line\":1,\"symbol\":\"mergeSubsystemModels\",\"annotation\":\"Reads every model touching a repo-key (proposed — this is the compose flow this model is the brief for).\"},{\"from\":\"merge-models\",\"to\":\"studio-get\",\"mechanism\":\"reads\",\"file\":\"packages/subsystems-studio/src/bun/merge-submodel-models.ts\",\"line\":1,\"symbol\":\"mergeSubsystemModels\",\"annotation\":\"Same code identity unifies to one node keyed consistently and uniquely; each model's edges resolve in its own alias-space (proposed; an agent pass aligns the composed nodes later).\"}]},{\"id\":\"wt-list-today\",\"steps\":[{\"annotation\":\"Polls listSubsystemModels every 10s. Summaries carry counts and repos, never files.\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelsView.tsx\",\"from\":\"studio-list\",\"line\":701,\"mechanism\":\"calls\",\"symbol\":\"refresh\",\"to\":\"list-rpc\"},{\"annotation\":\"Reads the lightweight index with counts and timestamps only.\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"from\":\"list-rpc\",\"line\":1950,\"mechanism\":\"calls\",\"symbol\":\"listSubsystemModels\",\"to\":\"store-list\"},{\"annotation\":\"Loads each full model to derive repos, graphify and audit, then drops component files before replying.\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"from\":\"list-rpc\",\"line\":1953,\"mechanism\":\"calls\",\"symbol\":\"listSubsystemModels\",\"to\":\"studio-get\"}],\"title\":\"List subsystems today — files stop at the host\"},{\"id\":\"wt-file-panel\",\"steps\":[{\"annotation\":\"Loads the full model once per selected id and caches it, invalidating on subsystemModelChanged.\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelsView.tsx\",\"from\":\"file-panel\",\"line\":958,\"mechanism\":\"calls\",\"symbol\":\"onShowAuditReport\",\"to\":\"studio-get\"},{\"annotation\":\"Groups the selected components file and purl pairs by repo.\",\"file\":\"packages/subsystems-react/src/subsystem/paths.ts\",\"from\":\"file-panel\",\"line\":93,\"mechanism\":\"calls\",\"symbol\":\"buildRepoGroups\",\"to\":\"repo-groups\"},{\"annotation\":\"Renders one tree per repo group like the detail graph. Clicking a file opens the graph tab with the file drawer.\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemFileTree.tsx\",\"from\":\"repo-groups\",\"line\":29,\"mechanism\":\"feeds\",\"symbol\":\"SubsystemFileTree\",\"to\":\"file-tree\"}],\"title\":\"Proposed — file trees for the selected subsystem\"}]");
|