diff --git a/.documentation/history/agent-chat/index.json b/.documentation/history/agent-chat/index.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/.documentation/history/agent-chat/index.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/VsExtension/Logs/debug3d-web-client-wasm.md-2026-05-22T07-03-14-095Z.ndjson b/VsExtension/Logs/debug3d-web-client-wasm.md-2026-05-22T07-03-14-095Z.ndjson new file mode 100644 index 0000000..761456a --- /dev/null +++ b/VsExtension/Logs/debug3d-web-client-wasm.md-2026-05-22T07-03-14-095Z.ndjson @@ -0,0 +1,1581 @@ +{"seq":1,"ts":"2026-05-22T07:03:13.842Z","type":"edge-label.render-state","payload":{"selectedDiagramId":"flow_1_nexusreader_web_client_program_cs","readableModeActive":false,"edgeTitlesVisible":true,"focusedNodeId":null,"labeledLinkCount":22,"inlineEdgeTitlesEligible":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":null,"cameraTarget":null}} +{"seq":2,"ts":"2026-05-22T07:03:13.845Z","type":"cycle.detection","payload":{"cycleNodeCount":0,"cycleEdgeCount":0,"sccCount":0,"cycleNodes":[]},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":null,"cameraTarget":null}} +{"seq":3,"ts":"2026-05-22T07:03:13.846Z","type":"pointer.up","payload":{"pointerId":0,"button":0,"buttons":0,"clientX":0,"clientY":0,"altKey":false,"ctrlKey":false,"hadOrbitDragState":false,"orbitDragMoved":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":0,"y":6.123233995736766e-14,"z":1000},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":4,"ts":"2026-05-22T07:03:16.736Z","type":"pointer.down","payload":{"pointerId":1,"button":0,"buttons":1,"clientX":540.7999877929688,"clientY":317.20001220703125,"altKey":false,"ctrlKey":false,"targetInGraph":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":0,"y":3.849408458163441e-14,"z":628.656108984819},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":5,"ts":"2026-05-22T07:03:17.092Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":540,"clientY":316.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":0,"y":3.849408458163441e-14,"z":628.656108984819},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":6,"ts":"2026-05-22T07:03:17.105Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":539.2000122070312,"clientY":316,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":6.0883152165040775,"y":-3.0442289930398037,"z":628.6192555526716},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":7,"ts":"2026-05-22T07:03:17.112Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":538.4000244140625,"clientY":316,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":12.174917226487045,"y":-9.132633676151352,"z":628.4718527958095},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":8,"ts":"2026-05-22T07:03:17.119Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":537.6000366210938,"clientY":316,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":18.260948364928993,"y":-9.13263367615135,"z":628.3244672387689},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":9,"ts":"2026-05-22T07:03:17.125Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":536,"clientY":314.4000244140625,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":24.345266683569438,"y":-9.13263367615135,"z":628.1181468133008},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":10,"ts":"2026-05-22T07:03:17.132Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":533.6000366210938,"clientY":312,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":36.489824556270925,"y":-21.305837717903152,"z":627.2344516581683},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":11,"ts":"2026-05-22T07:03:17.139Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":531.2000122070312,"clientY":310.4000244140625,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":54.61902929090553,"y":-39.54969312265016,"z":625.0288687550008},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":12,"ts":"2026-05-22T07:03:17.149Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":528.7999877929688,"clientY":308.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":72.65146398737964,"y":-51.69435643718437,"z":622.3005396566587},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":13,"ts":"2026-05-22T07:03:17.156Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":528,"clientY":307.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":90.53753700630239,"y":-63.81985619194821,"z":618.8202353772894},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":14,"ts":"2026-05-22T07:03:17.162Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":525.6000366210938,"clientY":305.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":96.31752589223316,"y":-75.92141118376885,"z":616.5771459386054},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":15,"ts":"2026-05-22T07:03:17.169Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":524,"clientY":304,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":113.89835215583598,"y":-87.99448099399268,"z":611.958037821806},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":16,"ts":"2026-05-22T07:03:17.176Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":522.4000244140625,"clientY":303.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":125.3623742386935,"y":-100.03453589140672,"z":607.8534939589971},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":17,"ts":"2026-05-22T07:03:17.182Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":522.4000244140625,"clientY":302.4000244140625,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":136.89168324466922,"y":-106.0406560811573,"z":604.3381087439805},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":18,"ts":"2026-05-22T07:03:17.189Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":521.6000366210938,"clientY":302.4000244140625,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":136.65838472766436,"y":-112.03682998926526,"z":603.3081616997359},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":19,"ts":"2026-05-22T07:03:17.196Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":520.7999877929688,"clientY":302.4000244140625,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":142.4948733547141,"y":-112.03682998926524,"z":601.9563631672257},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":20,"ts":"2026-05-22T07:03:17.219Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":520,"clientY":301.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":148.31844016064716,"y":-112.03682998926526,"z":600.5479934178463},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":21,"ts":"2026-05-22T07:03:17.232Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":520,"clientY":300.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":153.85006136358672,"y":-118.02272332428532,"z":598.0044303861574},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":22,"ts":"2026-05-22T07:03:17.262Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":519.2000122070312,"clientY":300,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":153.55805201778247,"y":-123.99731795476131,"z":596.8694104780899},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":23,"ts":"2026-05-22T07:03:17.282Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":518.4000244140625,"clientY":300,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":159.01344503450918,"y":-129.96050926844867,"z":594.1662172261861},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":24,"ts":"2026-05-22T07:03:17.295Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":518.4000244140625,"clientY":299.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":164.76034766151585,"y":-129.96050926844867,"z":592.5983439337934},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":25,"ts":"2026-05-22T07:03:17.312Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":518.4000244140625,"clientY":298.4000244140625,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":164.41546982267815,"y":-135.9112829952433,"z":591.3579117603038},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":26,"ts":"2026-05-22T07:03:17.326Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":517.6000366210938,"clientY":298.4000244140625,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":164.05517032737686,"y":-141.84930866908323,"z":590.0620120655885},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":27,"ts":"2026-05-22T07:03:17.330Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":516,"clientY":296.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":169.76208824339045,"y":-141.8493086690832,"z":588.4455033299844},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":28,"ts":"2026-05-22T07:03:17.338Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":516,"clientY":296,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":180.28151725857524,"y":-153.68511444638781,"z":582.3125994656815},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":29,"ts":"2026-05-22T07:03:17.360Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":515.2000122070312,"clientY":295.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":179.83285463074068,"y":-159.58178328849527,"z":580.8634109683233},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":30,"ts":"2026-05-22T07:03:17.368Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":514.4000244140625,"clientY":294.4000244140625,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":184.96989236561052,"y":-165.46325864541728,"z":577.5954919497092},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":31,"ts":"2026-05-22T07:03:17.375Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":513.6000366210938,"clientY":294.4000244140625,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":190.04267136090328,"y":-171.32921406656357,"z":574.2286886191579},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":32,"ts":"2026-05-22T07:03:17.405Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":513.6000366210938,"clientY":293.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":195.59502848906644,"y":-171.32921406656357,"z":572.361239604524},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":33,"ts":"2026-05-22T07:03:17.409Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":512.7999877929688,"clientY":293.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":195.0492672501303,"y":-177.17932218898179,"z":570.7642021866582},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":34,"ts":"2026-05-22T07:03:17.426Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":512,"clientY":293.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":200.56825716901153,"y":-177.1793221889817,"z":568.8482797449336},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":35,"ts":"2026-05-22T07:03:17.436Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":511.20001220703125,"clientY":292.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":206.06801266881033,"y":-177.1793221889817,"z":566.8791452393641},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":36,"ts":"2026-05-22T07:03:17.452Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":510.3999938964844,"clientY":292.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":210.93669219715574,"y":-183.01258797671514,"z":563.2234085076005},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":37,"ts":"2026-05-22T07:03:17.459Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":509.6000061035156,"clientY":292,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":216.3816931998804,"y":-183.01258797671514,"z":561.1540420009019},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":38,"ts":"2026-05-22T07:03:17.471Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":508.8000183105469,"clientY":291.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":221.1420891555875,"y":-188.82890929211842,"z":557.3583432437189},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":39,"ts":"2026-05-22T07:03:17.479Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":508,"clientY":291.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":225.82810020372796,"y":-194.6272968459814,"z":553.4712168168577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":40,"ts":"2026-05-22T07:03:17.486Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":507.20001220703125,"clientY":291.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":231.17795148309054,"y":-194.6272968459814,"z":551.2580824209655},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":41,"ts":"2026-05-22T07:03:17.500Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":506.3999938964844,"clientY":291.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":236.50591451099373,"y":-194.6272968459814,"z":548.9933251758865},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":42,"ts":"2026-05-22T07:03:17.508Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":505.6000061035156,"clientY":290.4000244140625,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":241.81189599739776,"y":-194.6272968459814,"z":546.676984736418},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":43,"ts":"2026-05-22T07:03:17.522Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":504.8000183105469,"clientY":290.4000244140625,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":246.30425196208535,"y":-200.40742896856617,"z":542.5675821900334},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":44,"ts":"2026-05-22T07:03:17.542Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":504,"clientY":290.4000244140625,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":251.54734013881148,"y":-200.40742896856636,"z":540.1567378522932},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":45,"ts":"2026-05-22T07:03:17.549Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":503.20001220703125,"clientY":290.4000244140625,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":256.7670326169962,"y":-200.40742896856645,"z":537.6951336391323},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":46,"ts":"2026-05-22T07:03:17.585Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":502.3999938964844,"clientY":290.4000244140625,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":261.9624415871167,"y":-200.40742896856645,"z":535.183188241053},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":47,"ts":"2026-05-22T07:03:17.595Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":501.6000061035156,"clientY":289.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":267.13347608009053,"y":-200.40742896856645,"z":532.6209456409969},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":48,"ts":"2026-05-22T07:03:17.608Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":500.8000183105469,"clientY":289.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":271.37955049860454,"y":-206.16898291696333,"z":528.2575067314172},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":49,"ts":"2026-05-22T07:03:17.621Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":499.20001220703125,"clientY":289.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.48287296695327,"y":-206.16898291696333,"z":525.604485143399},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":50,"ts":"2026-05-22T07:03:17.628Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":499.20001220703125,"clientY":288.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":286.61143414882605,"y":-206.16898291696333,"z":520.150689379598},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":51,"ts":"2026-05-22T07:03:17.635Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":498.3999938964844,"clientY":288.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":285.634382217404,"y":-211.9109787172598,"z":518.3775073807775},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":52,"ts":"2026-05-22T07:03:17.648Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":497.6000061035156,"clientY":288.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":290.64154117239354,"y":-211.9109787172598,"z":515.586787076591},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":53,"ts":"2026-05-22T07:03:17.658Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":496,"clientY":288.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":295.6212473429077,"y":-211.9109787172598,"z":512.7478118748528},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":54,"ts":"2026-05-22T07:03:17.672Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":495.20001220703125,"clientY":288.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":305.49719744742936,"y":-211.9109787172598,"z":506.92573698204797},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":55,"ts":"2026-05-22T07:03:17.686Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":494.3999938964844,"clientY":288.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":310.3923266772022,"y":-211.9109787172598,"z":503.9432944319619},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":56,"ts":"2026-05-22T07:03:17.694Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":493.6000061035156,"clientY":288.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":315.25852714367727,"y":-211.9109787172598,"z":500.91346710407515},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":57,"ts":"2026-05-22T07:03:17.698Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":492.8000183105469,"clientY":288.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":320.0949711622482,"y":-211.9109787172598,"z":497.836770337091},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":58,"ts":"2026-05-22T07:03:17.708Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":492,"clientY":288.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":324.9013912743928,"y":-211.9109787172598,"z":494.71337803923393},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":59,"ts":"2026-05-22T07:03:17.722Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":491.20001220703125,"clientY":288.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":329.6775182565896,"y":-211.9109787172598,"z":491.5434613736633},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":60,"ts":"2026-05-22T07:03:17.730Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":489.6000061035156,"clientY":288.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":334.422539744694,"y":-211.9109787172598,"z":488.32755950666416},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":61,"ts":"2026-05-22T07:03:17.744Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":488.8000183105469,"clientY":288.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":343.81821522093264,"y":-211.9109787172598,"z":481.75852389482276},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":62,"ts":"2026-05-22T07:03:17.748Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":488,"clientY":288.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":348.46780871370896,"y":-211.9109787172598,"z":478.4061316008523},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":63,"ts":"2026-05-22T07:03:17.754Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":487.20001220703125,"clientY":288.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":353.0848925114927,"y":-211.9109787172598,"z":475.008735859851},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":64,"ts":"2026-05-22T07:03:17.765Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":485.6000061035156,"clientY":288.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":357.6686813015515,"y":-211.9109787172598,"z":471.5669145296723},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":65,"ts":"2026-05-22T07:03:17.778Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":484.8000183105469,"clientY":288.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":366.7353591058737,"y":-211.9109787172598,"z":464.5507688557968},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":66,"ts":"2026-05-22T07:03:17.785Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":483.20001220703125,"clientY":288.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":371.21722475893796,"y":-211.9109787172598,"z":460.9772364285445},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":67,"ts":"2026-05-22T07:03:17.792Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":483.20001220703125,"clientY":289.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":380.0762495269918,"y":-211.9109787172598,"z":453.7006557285563},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":68,"ts":"2026-05-22T07:03:17.798Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":481.6000061035156,"clientY":289.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":381.37635293472977,"y":-206.16898291696333,"z":455.2526016060999},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":69,"ts":"2026-05-22T07:03:17.805Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":480.8000183105469,"clientY":289.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":390.1225914871151,"y":-206.16898291696333,"z":447.7803227680906},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":70,"ts":"2026-05-22T07:03:17.818Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":479.20001220703125,"clientY":290.4000244140625,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":394.4409424884224,"y":-206.16898291696333,"z":443.9810770018953},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":71,"ts":"2026-05-22T07:03:17.825Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":478.3999938964844,"clientY":290.4000244140625,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":404.3023687985839,"y":-200.40742896856645,"z":437.70419276264164},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":72,"ts":"2026-05-22T07:03:17.835Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":476,"clientY":291.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":408.52263009874497,"y":-200.40742896856645,"z":433.76794081092015},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":73,"ts":"2026-05-22T07:03:17.842Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":472.8000183105469,"clientY":292,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":422.3030443399278,"y":-194.62729684598168,"z":423.0707475441763},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":74,"ts":"2026-05-22T07:03:17.849Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":468.8000183105469,"clientY":292.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":439.7336045206236,"y":-188.8289092921188,"z":407.659788837189},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":75,"ts":"2026-05-22T07:03:17.856Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":464,"clientY":292.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":460.32971106371014,"y":-183.01258797671548,"z":387.05484510337686},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":76,"ts":"2026-05-22T07:03:17.862Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":458.3999938964844,"clientY":294.4000244140625,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":482.0320343767856,"y":-183.01258797671548,"z":359.6665314434682},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":77,"ts":"2026-05-22T07:03:17.869Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":454.3999938964844,"clientY":295.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":508.1731492129802,"y":-171.32921406656385,"z":328.0470304548246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":78,"ts":"2026-05-22T07:03:17.878Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":451.20001220703125,"clientY":296,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":524.8684307304492,"y":-165.46325864541754,"z":303.88080529202296},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":79,"ts":"2026-05-22T07:03:17.886Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":448.8000183105469,"clientY":296.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":537.6357484641633,"y":-159.5817832884955,"z":284.0597820526088},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":80,"ts":"2026-05-22T07:03:17.889Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":446.3999938964844,"clientY":297.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":547.0224203785839,"y":-153.68511444638807,"z":268.9904469766342},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":81,"ts":"2026-05-22T07:03:17.896Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":444.8000183105469,"clientY":297.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":555.9342435478004,"y":-147.77425507449365,"z":253.5909890986793},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":82,"ts":"2026-05-22T07:03:17.904Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":444,"clientY":298.4000244140625,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":560.7416640532232,"y":-147.77425507449365,"z":242.775738276982},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":83,"ts":"2026-05-22T07:03:17.911Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":443.20001220703125,"clientY":299.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":564.3591159556117,"y":-141.84930866908346,"z":237.87825716495428},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":84,"ts":"2026-05-22T07:03:17.918Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":442.3999938964844,"clientY":299.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":567.8808956273539,"y":-135.91128299524354,"z":232.911817862456},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":85,"ts":"2026-05-22T07:03:17.929Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":441.6000671386719,"clientY":299.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":570.1100431086024,"y":-135.91128299524354,"z":227.40089108274637},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":86,"ts":"2026-05-22T07:03:17.941Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":440.8000183105469,"clientY":299.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":572.2854660599484,"y":-135.91128299524354,"z":221.86926748666033},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":87,"ts":"2026-05-22T07:03:17.948Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":440.8000183105469,"clientY":300,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":574.4075382937068,"y":-135.91128299524354,"z":216.31598755035012},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":88,"ts":"2026-05-22T07:03:17.961Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":440,"clientY":300,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":575.6124153690358,"y":-129.96050926844882,"z":216.7697318991809},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":89,"ts":"2026-05-22T07:03:17.968Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":440,"clientY":300.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":577.6848619558363,"y":-129.96050926844882,"z":211.1846814086773},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":90,"ts":"2026-05-22T07:03:17.976Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":439.20001220703125,"clientY":300.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":578.839935089644,"y":-123.99731795476146,"z":211.60694234683143},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":91,"ts":"2026-05-22T07:03:17.998Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":438.3999938964844,"clientY":302.4000244140625,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":580.8621518844616,"y":-123.99731795476141,"z":205.99108964251536},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":92,"ts":"2026-05-22T07:03:18.002Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":437.6000671386719,"clientY":302.4000244140625,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":584.9918715747469,"y":-112.03682998926539,"z":201.09888682278577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":93,"ts":"2026-05-22T07:03:18.012Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":436.8000183105469,"clientY":303.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":586.9118874051485,"y":-112.03682998926539,"z":195.42438054760518},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":94,"ts":"2026-05-22T07:03:18.032Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":436,"clientY":304,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":589.7822817103269,"y":-106.04065608115748,"z":190.0545784830526},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":95,"ts":"2026-05-22T07:03:18.039Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":434.3999938964844,"clientY":304.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":592.5480641356661,"y":-100.03453589140693,"z":184.63040562701954},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":96,"ts":"2026-05-22T07:03:18.053Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":434.3999938964844,"clientY":305.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":596.915449475433,"y":-94.01880312675233,"z":173.38083573476962},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":97,"ts":"2026-05-22T07:03:18.061Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":433.6000671386719,"clientY":305.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":597.76186584906,"y":-87.99448099399287,"z":173.62668693256992},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":98,"ts":"2026-05-22T07:03:18.068Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":432.8000183105469,"clientY":306.4000244140625,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":599.415241380221,"y":-87.99448099399287,"z":167.8298039074753},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":99,"ts":"2026-05-22T07:03:18.082Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":432,"clientY":307.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":601.8073171753072,"y":-81.96167497607752,"z":162.23051560451705},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":100,"ts":"2026-05-22T07:03:18.102Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":431.20001220703125,"clientY":308,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":604.090404719934,"y":-75.92141118376901,"z":156.5861603498336},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":101,"ts":"2026-05-22T07:03:18.109Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":430.3999938964844,"clientY":308,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":606.2636849827281,"y":-69.8740262007187,"z":150.89886711833537},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":102,"ts":"2026-05-22T07:03:18.138Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":430.3999938964844,"clientY":308.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":607.6967257907212,"y":-69.8740262007187,"z":145.02004444100385},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":103,"ts":"2026-05-22T07:03:18.153Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":429.6000671386719,"clientY":309.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":608.3264791009676,"y":-63.81985619194835,"z":145.1703280432727},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":104,"ts":"2026-05-22T07:03:18.161Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":428.8000183105469,"clientY":309.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":610.2777527813174,"y":-57.75993090198933,"z":139.40358032100696},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":105,"ts":"2026-05-22T07:03:18.181Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":428,"clientY":309.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":611.5993212421791,"y":-57.75993090198933,"z":133.48619405105512},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":106,"ts":"2026-05-22T07:03:18.201Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":427.20001220703125,"clientY":310.4000244140625,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":612.8634677207276,"y":-57.75993090198935,"z":127.55651170934074},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":107,"ts":"2026-05-22T07:03:18.208Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":426.3999938964844,"clientY":310.4000244140625,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":614.5900334274218,"y":-51.694356437184524,"z":121.71806640001697},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":108,"ts":"2026-05-22T07:03:18.223Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":425.6000671386719,"clientY":311.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":615.7400637386635,"y":-51.694356437184524,"z":115.75997055798271},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":109,"ts":"2026-05-22T07:03:18.231Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":424,"clientY":312,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":617.2961856644415,"y":-45.62416448183178,"z":109.87428335784072},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":110,"ts":"2026-05-22T07:03:18.237Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":423.20001220703125,"clientY":312,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":619.7160049451766,"y":-39.54969312265019,"z":97.96120840734454},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":111,"ts":"2026-05-22T07:03:18.244Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":420,"clientY":312.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":620.635672504376,"y":-39.54969312265019,"z":91.95481038465692},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":112,"ts":"2026-05-22T07:03:18.251Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":417.6000671386719,"clientY":313.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":624.0830189055956,"y":-33.471280194787866,"z":67.88639244895114},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":113,"ts":"2026-05-22T07:03:18.258Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":416,"clientY":313.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":626.0855391150378,"y":-27.38995956621722,"z":49.751293349280516},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":114,"ts":"2026-05-22T07:03:18.264Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":414.3999938964844,"clientY":315.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":626.931747794883,"y":-27.38995956621722,"z":37.61485193041239},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":115,"ts":"2026-05-22T07:03:18.271Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":412.8000183105469,"clientY":315.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":627.9550541345059,"y":-15.219949488839672,"z":25.481493057105467},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":116,"ts":"2026-05-22T07:03:18.278Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":410.3999938964844,"clientY":315.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":628.3307978498522,"y":-15.219949488839672,"z":13.31408933640563},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":117,"ts":"2026-05-22T07:03:18.288Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":410.3999938964844,"clientY":316,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":628.4523842965853,"y":-15.219949488839664,"z":-4.945419438853152},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":118,"ts":"2026-05-22T07:03:18.295Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":409.6000671386719,"clientY":316,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":628.5703079317609,"y":-9.132633676151203,"z":-4.946347403886414},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":119,"ts":"2026-05-22T07:03:18.302Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":408.8000183105469,"clientY":316.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":628.492932909159,"y":-9.132633676151203,"z":-11.033206664974461},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":120,"ts":"2026-05-22T07:03:18.309Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":408,"clientY":316.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":628.4155376952284,"y":-3.0442289930396598,"z":-17.121565845049144},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":121,"ts":"2026-05-22T07:03:18.335Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":406.3999938964844,"clientY":316.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":628.220239076564,"y":-3.0442289930396598,"z":-23.20705169456322},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":122,"ts":"2026-05-22T07:03:18.366Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":405.6000671386719,"clientY":316.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":627.6528899911192,"y":-3.0442289930396598,"z":-35.37069012000463},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":123,"ts":"2026-05-22T07:03:18.371Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":404.8000183105469,"clientY":316.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":627.280927861677,"y":-3.04422899303966,"z":-41.44723844556063},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":124,"ts":"2026-05-22T07:03:18.408Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":404,"clientY":316.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":626.8500674953618,"y":-3.0442289930396607,"z":-47.52082611687186},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":125,"ts":"2026-05-22T07:03:18.441Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":403.20001220703125,"clientY":316.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":626.3604213817273,"y":-3.044228993039661,"z":-53.589724390734325},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":126,"ts":"2026-05-22T07:03:18.456Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":402.3999938964844,"clientY":316.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":625.8120421779107,"y":-3.0442289930396633,"z":-59.65336452274392},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":127,"ts":"2026-05-22T07:03:18.471Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":400.8000183105469,"clientY":316.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":625.2049394857645,"y":-3.0442289930396647,"z":-65.71164034151259},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":128,"ts":"2026-05-22T07:03:18.479Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":399.20001220703125,"clientY":316.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":623.8149138233904,"y":-3.0442289930396647,"z":-77.80867127310904},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":129,"ts":"2026-05-22T07:03:18.484Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":399.20001220703125,"clientY":316,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":622.1908128980741,"y":-3.0442289930396647,"z":-89.87673992198656},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":130,"ts":"2026-05-22T07:03:18.491Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":398.3999938964844,"clientY":316,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":622.1324500078243,"y":-9.132633676151217,"z":-89.86830928270463},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":131,"ts":"2026-05-22T07:03:18.499Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":396.8000183105469,"clientY":316,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":621.2328840977721,"y":-9.132633676151217,"z":-95.88953061535975},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":132,"ts":"2026-05-22T07:03:18.506Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":396,"clientY":315.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":619.2590994209946,"y":-9.132633676151213,"z":-107.90396725963441},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":133,"ts":"2026-05-22T07:03:18.514Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":395.20001220703125,"clientY":315.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":618.069015220891,"y":-15.219949488839674,"z":-113.87514621447372},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":134,"ts":"2026-05-22T07:03:18.521Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":394.3999938964844,"clientY":315.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":616.9371747354741,"y":-15.219949488839674,"z":-119.85565873541765},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":135,"ts":"2026-05-22T07:03:18.529Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":393.6000671386719,"clientY":315.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":615.7474209872238,"y":-15.219949488839672,"z":-125.82515666221978},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":136,"ts":"2026-05-22T07:03:18.534Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":392,"clientY":315.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":614.5000537151004,"y":-15.219949488839672,"z":-131.78217059082107},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":137,"ts":"2026-05-22T07:03:18.541Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":391.20001220703125,"clientY":315.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":611.8321818649607,"y":-15.219949488839672,"z":-143.66014665122393},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":138,"ts":"2026-05-22T07:03:18.548Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":389.6000671386719,"clientY":314.4000244140625,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":610.4121731513251,"y":-15.219949488839672,"z":-149.5788600376616},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":139,"ts":"2026-05-22T07:03:18.554Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":388,"clientY":314.4000244140625,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":607.2296439303906,"y":-21.30583771790316,"z":-161.3280018324218},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":140,"ts":"2026-05-22T07:03:18.562Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":387.20001220703125,"clientY":314.4000244140625,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":603.9908413286217,"y":-21.30583771790316,"z":-173.05960890460406},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":141,"ts":"2026-05-22T07:03:18.569Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":385.6000671386719,"clientY":313.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":602.286473482298,"y":-21.305837717903156,"z":-178.90100196289498},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":142,"ts":"2026-05-22T07:03:18.578Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":384.8000183105469,"clientY":313.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":598.4837820910427,"y":-27.389959566217208,"z":-190.46116678445134},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":143,"ts":"2026-05-22T07:03:18.584Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":383.20001220703125,"clientY":312.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":596.6109975102883,"y":-27.38995956621721,"z":-196.2488500059865},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":144,"ts":"2026-05-22T07:03:18.592Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":381.6000671386719,"clientY":312.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":592.4198063612151,"y":-33.47128019478784,"z":-207.67029107938106},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":145,"ts":"2026-05-22T07:03:18.599Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":379.20001220703125,"clientY":312,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":588.2864684376493,"y":-33.471280194787845,"z":-219.10547190614224},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":146,"ts":"2026-05-22T07:03:18.604Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":378.3999938964844,"clientY":312,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":581.3451020328567,"y":-39.549693122650176,"z":-235.97075556145586},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":147,"ts":"2026-05-22T07:03:18.611Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":376.8000183105469,"clientY":312,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":579.0324273162266,"y":-39.549693122650176,"z":-241.59009345193712},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":148,"ts":"2026-05-22T07:03:18.620Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":376.8000183105469,"clientY":311.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":574.2445399642363,"y":-39.549693122650176,"z":-252.75983355568897},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":149,"ts":"2026-05-22T07:03:18.627Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":375.20001220703125,"clientY":311.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":573.8670369149495,"y":-45.62416448183176,"z":-252.59367157892825},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":150,"ts":"2026-05-22T07:03:18.634Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":372.8000183105469,"clientY":311.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":568.8668969857222,"y":-45.62416448183174,"z":-263.66151120916913},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":151,"ts":"2026-05-22T07:03:18.641Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":372,"clientY":311.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":560.9671566122076,"y":-45.624164481831734,"z":-280.0763970449526},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":152,"ts":"2026-05-22T07:03:18.648Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":371.20001220703125,"clientY":311.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":558.2282686006214,"y":-45.62416448183172,"z":-285.49630315368205},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":153,"ts":"2026-05-22T07:03:18.654Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":370.3999938964844,"clientY":311.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":555.4371240005536,"y":-45.62416448183171,"z":-290.88922335016167},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":154,"ts":"2026-05-22T07:03:18.661Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":368.8000183105469,"clientY":310.4000244140625,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":552.5937716835875,"y":-45.62416448183171,"z":-296.25506320698344},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":155,"ts":"2026-05-22T07:03:18.667Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":367.20001220703125,"clientY":310.4000244140625,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":546.3411090221183,"y":-51.694356437184446,"z":-306.6717943811577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":156,"ts":"2026-05-22T07:03:18.684Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":364.8000183105469,"clientY":310.4000244140625,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":540.2986942012956,"y":-51.69435643718449,"z":-317.1963397027979},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":157,"ts":"2026-05-22T07:03:18.691Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":364,"clientY":309.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":530.8557696864675,"y":-51.69435643718452,"z":-332.75869435232846},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":158,"ts":"2026-05-22T07:03:18.698Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":363.20001220703125,"clientY":308.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":527.1616937870814,"y":-57.759930901989335,"z":-337.59864091797783},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":159,"ts":"2026-05-22T07:03:18.702Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":361.6000671386719,"clientY":308.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":523.3747104628673,"y":-63.819856191948375,"z":-342.36594714936456},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":160,"ts":"2026-05-22T07:03:18.717Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":359.20001220703125,"clientY":308.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":516.6455047650322,"y":-63.81985619194835,"z":-352.438578656844},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":161,"ts":"2026-05-22T07:03:18.724Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":356.8000183105469,"clientY":308.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":506.1884688011195,"y":-63.81985619194835,"z":-367.2992831089512},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":162,"ts":"2026-05-22T07:03:18.731Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":356,"clientY":308.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":495.30439906587856,"y":-63.81985619194835,"z":-381.84955360136325},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":163,"ts":"2026-05-22T07:03:18.738Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":354.3999938964844,"clientY":308.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":491.5829040793556,"y":-63.81985619194835,"z":-386.62873371812196},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":164,"ts":"2026-05-22T07:03:18.745Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":353.6000671386719,"clientY":308.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":484.0020764891574,"y":-63.81985619194835,"z":-396.0776682340917},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":165,"ts":"2026-05-22T07:03:18.754Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":352.8000183105469,"clientY":308.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":480.1437545775033,"y":-63.81985619194835,"z":-400.74618433590825},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":166,"ts":"2026-05-22T07:03:18.761Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":351.20001220703125,"clientY":308.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":476.2398044798625,"y":-63.81985619194835,"z":-405.377821234159},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":167,"ts":"2026-05-22T07:03:18.774Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":349.6000671386719,"clientY":308.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":468.29870429911153,"y":-63.81985619194835,"z":-414.52605813307406},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":168,"ts":"2026-05-22T07:03:18.781Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":348.8000183105469,"clientY":308.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":460.18221466811474,"y":-63.81985619194835,"z":-423.5184277250762},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":169,"ts":"2026-05-22T07:03:18.788Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":348,"clientY":308.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":456.05864022958946,"y":-63.81985619194835,"z":-427.95565890815067},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":170,"ts":"2026-05-22T07:03:18.801Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":347.20001220703125,"clientY":308.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":451.89244212573266,"y":-63.81985619194835,"z":-432.35257611030005},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":171,"ts":"2026-05-22T07:03:18.811Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":346.3999938964844,"clientY":308.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":447.68401603595055,"y":-63.81985619194835,"z":-436.708771500521},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":172,"ts":"2026-05-22T07:03:18.818Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":345.6000671386719,"clientY":308.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":443.43343564773573,"y":-63.81985619194835,"z":-441.0241688039521},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":173,"ts":"2026-05-22T07:03:18.832Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":344.8000183105469,"clientY":308.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":439.14175297164405,"y":-63.81985619194835,"z":-445.2977095343777},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":174,"ts":"2026-05-22T07:03:18.840Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":344,"clientY":308.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":434.80822213280334,"y":-63.81985619194835,"z":-449.53013167671213},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":175,"ts":"2026-05-22T07:03:18.854Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":343.20001220703125,"clientY":308.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":430.43406904989376,"y":-63.81985619194835,"z":-453.7202238392319},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":176,"ts":"2026-05-22T07:03:18.861Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":342.3999938964844,"clientY":308.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":426.01970868010477,"y":-63.81985619194835,"z":-457.8675978224383},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":177,"ts":"2026-05-22T07:03:18.875Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":341.6000671386719,"clientY":308.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":421.565218316738,"y":-63.81985619194835,"z":-461.9721810078313},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":178,"ts":"2026-05-22T07:03:18.881Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":340.8000183105469,"clientY":308.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":417.07169997460517,"y":-63.81985619194835,"z":-466.0329670740734},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":179,"ts":"2026-05-22T07:03:18.889Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":340,"clientY":308.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":412.5383729300154,"y":-63.81985619194835,"z":-470.0506570358422},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":180,"ts":"2026-05-22T07:03:18.895Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":339.20001220703125,"clientY":308.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":407.9665203036408,"y":-63.81985619194835,"z":-474.0241002638057},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":181,"ts":"2026-05-22T07:03:18.902Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":337.6000671386719,"clientY":308.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":403.3565753575648,"y":-63.81985619194835,"z":-477.95292910012444},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":182,"ts":"2026-05-22T07:03:18.909Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":336.8000183105469,"clientY":308.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":394.0238000953209,"y":-63.81985619194835,"z":-485.67558542510045},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":183,"ts":"2026-05-22T07:03:18.915Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":336,"clientY":308.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":389.3013054724268,"y":-63.81985619194835,"z":-489.469123517547},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":184,"ts":"2026-05-22T07:03:18.922Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":334.3999938964844,"clientY":308.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":384.5424722553165,"y":-63.81985619194835,"z":-493.2166018610288},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":185,"ts":"2026-05-22T07:03:18.937Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":333.6000671386719,"clientY":308.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":374.9172256451978,"y":-63.81985619194835,"z":-500.57227573456294},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":186,"ts":"2026-05-22T07:03:18.944Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":332.8000183105469,"clientY":308.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":370.0520903663701,"y":-63.81985619194835,"z":-504.1795114193468},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":187,"ts":"2026-05-22T07:03:18.951Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":332,"clientY":309.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":365.1515003061098,"y":-63.81985619194835,"z":-507.7400034897472},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":188,"ts":"2026-05-22T07:03:18.967Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":330.3999938964844,"clientY":309.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":360.5559463678544,"y":-57.75993090198931,"z":-511.73401614990456},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":189,"ts":"2026-05-22T07:03:18.994Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":329.6000671386719,"clientY":309.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":350.57653592026736,"y":-57.75993090198931,"z":-518.6216214238232},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":190,"ts":"2026-05-22T07:03:19.001Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":328.8000183105469,"clientY":309.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":345.53775167466983,"y":-57.75993090198931,"z":-521.9922948796698},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":191,"ts":"2026-05-22T07:03:19.007Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":328,"clientY":309.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":340.46578569297924,"y":-57.75993090198931,"z":-525.3145177116203},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":192,"ts":"2026-05-22T07:03:19.014Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":328,"clientY":310.4000244140625,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":335.362075502878,"y":-57.75993090198931,"z":-528.5873362657602},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":193,"ts":"2026-05-22T07:03:19.051Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":327.20001220703125,"clientY":310.4000244140625,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":335.64603754041616,"y":-51.69435643718449,"z":-529.0349084511298},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":194,"ts":"2026-05-22T07:03:19.057Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":327.20001220703125,"clientY":311.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":330.5067175690898,"y":-51.69435643718449,"z":-532.2607504956417},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":195,"ts":"2026-05-22T07:03:19.064Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":325.6000671386719,"clientY":311.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":330.75531990506346,"y":-45.624164481831734,"z":-532.6611092747115},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":196,"ts":"2026-05-22T07:03:19.071Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":325.6000671386719,"clientY":312,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":320.37656152726424,"y":-45.624164481831734,"z":-538.9673439117013},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":197,"ts":"2026-05-22T07:03:19.077Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":323.20001220703125,"clientY":312,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":320.58731266144116,"y":-39.549693122650154,"z":-539.3218891333374},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":198,"ts":"2026-05-22T07:03:19.087Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":320.8000183105469,"clientY":312.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":304.7837404717407,"y":-39.549693122650154,"z":-548.4078743799099},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":199,"ts":"2026-05-22T07:03:19.094Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":315.20001220703125,"clientY":313.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":288.8860148593265,"y":-33.47128019478783,"z":-557.3446395048142},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":200,"ts":"2026-05-22T07:03:19.101Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":310.3999938964844,"clientY":313.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":250.58343065656138,"y":-27.3899595662172,"z":-575.904712395446},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":201,"ts":"2026-05-22T07:03:19.107Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":306.3999938964844,"clientY":314.4000244140625,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":216.71311928239857,"y":-27.3899595662172,"z":-589.4859772800248},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":202,"ts":"2026-05-22T07:03:19.114Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":301.6000671386719,"clientY":315.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":187.9947399196383,"y":-21.305837717903152,"z":-599.5102521271992},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":203,"ts":"2026-05-22T07:03:19.121Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":300.8000183105469,"clientY":315.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":152.90282271007018,"y":-15.219949488839665,"z":-609.5880439352318},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":204,"ts":"2026-05-22T07:03:19.128Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":299.20001220703125,"clientY":316,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":146.99148342778366,"y":-15.219949488839665,"z":-611.0403917100643},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":205,"ts":"2026-05-22T07:03:19.135Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":298.3999938964844,"clientY":316,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":135.15402838027026,"y":-9.13263367615121,"z":-613.8880084988258},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":206,"ts":"2026-05-22T07:03:19.142Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":297.6000671386719,"clientY":316.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":129.2021015702926,"y":-9.13263367615121,"z":-615.1682008328203},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":207,"ts":"2026-05-22T07:03:19.158Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":296.8000183105469,"clientY":316.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":123.2502994242,"y":-3.0442289930396633,"z":-616.4483755559872},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":208,"ts":"2026-05-22T07:03:19.178Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":296,"clientY":317.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":117.27390524342485,"y":-3.0442289930396633,"z":-617.6132019174514},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":209,"ts":"2026-05-22T07:03:19.214Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":295.20001220703125,"clientY":318.4000244140625,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":111.28673804862646,"y":3.0442289930401594,"z":-618.7200481383053},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":210,"ts":"2026-05-22T07:03:19.242Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":295.20001220703125,"clientY":319.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":105.27948430935825,"y":9.132633676151709,"z":-619.7106813260727},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":211,"ts":"2026-05-22T07:03:19.305Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":294.3999938964844,"clientY":319.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":105.25973323403295,"y":15.219949488840166,"z":-619.5944198110485},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":212,"ts":"2026-05-22T07:03:19.388Z","type":"pointer.up","payload":{"pointerId":1,"button":0,"buttons":0,"clientX":294.3999938964844,"clientY":319.20001220703125,"altKey":false,"ctrlKey":false,"hadOrbitDragState":true,"orbitDragMoved":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":0,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":213,"ts":"2026-05-22T07:03:37.813Z","type":"pointer.down","payload":{"pointerId":1,"button":2,"buttons":2,"clientX":762.4000244140625,"clientY":315.6000061035156,"altKey":false,"ctrlKey":false,"targetInGraph":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":214,"ts":"2026-05-22T07:03:37.813Z","type":"pointerdown.rmb","payload":{"clientX":762.4000244140625,"clientY":315.6000061035156,"hoveredNodeId":null,"selectedNodeId":null},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":215,"ts":"2026-05-22T07:03:37.934Z","type":"pointer.up","payload":{"pointerId":1,"button":2,"buttons":0,"clientX":762.4000244140625,"clientY":315.6000061035156,"altKey":false,"ctrlKey":false,"hadOrbitDragState":false,"orbitDragMoved":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":216,"ts":"2026-05-22T07:03:37.935Z","type":"shortcut.radial.menu.hide","payload":{"hadAnchor":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":217,"ts":"2026-05-22T07:03:37.935Z","type":"context-menu.hide.skip","payload":{"restoreView":false,"reason":"already-hidden"},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":218,"ts":"2026-05-22T07:03:37.935Z","type":"shortcut.radial.menu.hide","payload":{"hadAnchor":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":219,"ts":"2026-05-22T07:03:37.935Z","type":"shortcut.radial.menu.show","payload":{"anchor":{"x":762,"y":315}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":220,"ts":"2026-05-22T07:03:37.940Z","type":"context-menu.hide.skip","payload":{"restoreView":false,"reason":"already-hidden"},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":221,"ts":"2026-05-22T07:03:37.941Z","type":"shortcut.radial.menu.hide","payload":{"hadAnchor":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":222,"ts":"2026-05-22T07:03:37.941Z","type":"shortcut.radial.menu.show","payload":{"anchor":{"x":762.4000244140625,"y":315.6000061035156}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":223,"ts":"2026-05-22T07:03:38.447Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":763.2000122070312,"clientY":315.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":224,"ts":"2026-05-22T07:03:38.456Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":765.6000366210938,"clientY":316.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":225,"ts":"2026-05-22T07:03:38.462Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":768,"clientY":316.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":226,"ts":"2026-05-22T07:03:38.469Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":772,"clientY":316.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":227,"ts":"2026-05-22T07:03:38.479Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":776,"clientY":316.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":228,"ts":"2026-05-22T07:03:38.483Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":781.6000366210938,"clientY":316.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":229,"ts":"2026-05-22T07:03:38.490Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":787.2000122070312,"clientY":316.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":230,"ts":"2026-05-22T07:03:38.499Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":792.7999877929688,"clientY":314,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":231,"ts":"2026-05-22T07:03:38.507Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":798.4000244140625,"clientY":313.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":232,"ts":"2026-05-22T07:03:38.512Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":801.6000366210938,"clientY":311.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":233,"ts":"2026-05-22T07:03:38.520Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":804.7999877929688,"clientY":310.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":234,"ts":"2026-05-22T07:03:38.527Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":808,"clientY":309.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":235,"ts":"2026-05-22T07:03:38.532Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":810.4000244140625,"clientY":308.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":236,"ts":"2026-05-22T07:03:38.541Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":811.2000122070312,"clientY":307.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":237,"ts":"2026-05-22T07:03:38.546Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":812.7999877929688,"clientY":307.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":238,"ts":"2026-05-22T07:03:38.556Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":813.6000366210938,"clientY":307.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":239,"ts":"2026-05-22T07:03:38.565Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":813.6000366210938,"clientY":306.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":240,"ts":"2026-05-22T07:03:38.569Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":814.4000244140625,"clientY":306.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":241,"ts":"2026-05-22T07:03:38.579Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":815.2000122070312,"clientY":306.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":242,"ts":"2026-05-22T07:03:38.593Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":816,"clientY":306.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":243,"ts":"2026-05-22T07:03:38.616Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":816.7999877929688,"clientY":305.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":244,"ts":"2026-05-22T07:03:38.627Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":817.6000366210938,"clientY":305.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":245,"ts":"2026-05-22T07:03:38.656Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":818.4000244140625,"clientY":305.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":246,"ts":"2026-05-22T07:03:38.685Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":818.4000244140625,"clientY":306,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":247,"ts":"2026-05-22T07:03:38.708Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":818.4000244140625,"clientY":307.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":248,"ts":"2026-05-22T07:03:38.712Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":817.6000366210938,"clientY":308.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":249,"ts":"2026-05-22T07:03:38.722Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":816.7999877929688,"clientY":309.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":250,"ts":"2026-05-22T07:03:38.725Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":816.7999877929688,"clientY":310.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":251,"ts":"2026-05-22T07:03:38.742Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":816,"clientY":312.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":252,"ts":"2026-05-22T07:03:38.747Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":815.2000122070312,"clientY":313.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":253,"ts":"2026-05-22T07:03:38.754Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":814.4000244140625,"clientY":314,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":254,"ts":"2026-05-22T07:03:38.763Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":813.6000366210938,"clientY":315.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":255,"ts":"2026-05-22T07:03:38.770Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":812,"clientY":318.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":256,"ts":"2026-05-22T07:03:38.779Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":808.7999877929688,"clientY":323.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":257,"ts":"2026-05-22T07:03:38.783Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":801.6000366210938,"clientY":334.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":258,"ts":"2026-05-22T07:03:38.792Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":787.2000122070312,"clientY":358,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":259,"ts":"2026-05-22T07:03:38.800Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":763.2000122070312,"clientY":393.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":260,"ts":"2026-05-22T07:03:38.805Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":744.7999877929688,"clientY":420.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":261,"ts":"2026-05-22T07:03:38.813Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":731.2000122070312,"clientY":439.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":262,"ts":"2026-05-22T07:03:38.825Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":723.2000122070312,"clientY":449.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":263,"ts":"2026-05-22T07:03:38.829Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":719.2000122070312,"clientY":455.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":264,"ts":"2026-05-22T07:03:38.835Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":716.7999877929688,"clientY":458.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":265,"ts":"2026-05-22T07:03:38.840Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":714.4000244140625,"clientY":461.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":266,"ts":"2026-05-22T07:03:38.848Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":712,"clientY":462.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":267,"ts":"2026-05-22T07:03:38.857Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":711.2000122070312,"clientY":464.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":268,"ts":"2026-05-22T07:03:38.862Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":710.4000244140625,"clientY":464.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":269,"ts":"2026-05-22T07:03:38.869Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":709.6000366210938,"clientY":464.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":270,"ts":"2026-05-22T07:03:38.877Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":708.7999877929688,"clientY":464.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":271,"ts":"2026-05-22T07:03:38.893Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":707.2000122070312,"clientY":464.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":272,"ts":"2026-05-22T07:03:38.906Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":706.4000244140625,"clientY":464.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":273,"ts":"2026-05-22T07:03:39.249Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":705.6000366210938,"clientY":453.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":274,"ts":"2026-05-22T07:03:39.253Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":700.7999877929688,"clientY":426.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":275,"ts":"2026-05-22T07:03:39.262Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":697.6000366210938,"clientY":398,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":276,"ts":"2026-05-22T07:03:39.271Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":696.7999877929688,"clientY":386,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":277,"ts":"2026-05-22T07:03:39.275Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":696.7999877929688,"clientY":379.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":278,"ts":"2026-05-22T07:03:39.283Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":696.7999877929688,"clientY":377.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":279,"ts":"2026-05-22T07:03:39.296Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":696.7999877929688,"clientY":375.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":280,"ts":"2026-05-22T07:03:39.705Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":696,"clientY":374.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":281,"ts":"2026-05-22T07:03:39.885Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":696,"clientY":373.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":282,"ts":"2026-05-22T07:03:39.919Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":696,"clientY":372.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":283,"ts":"2026-05-22T07:03:40.094Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":696,"clientY":371.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":284,"ts":"2026-05-22T07:03:40.111Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":696,"clientY":370.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":285,"ts":"2026-05-22T07:03:40.121Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":696.7999877929688,"clientY":369.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":286,"ts":"2026-05-22T07:03:40.129Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":696.7999877929688,"clientY":368.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":287,"ts":"2026-05-22T07:03:40.134Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":697.6000366210938,"clientY":365.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":288,"ts":"2026-05-22T07:03:40.143Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":698.4000244140625,"clientY":362,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":289,"ts":"2026-05-22T07:03:40.148Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":699.2000122070312,"clientY":359.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":290,"ts":"2026-05-22T07:03:40.157Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":700,"clientY":357.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":291,"ts":"2026-05-22T07:03:40.162Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":701.6000366210938,"clientY":353.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":292,"ts":"2026-05-22T07:03:40.169Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":702.4000244140625,"clientY":350.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":293,"ts":"2026-05-22T07:03:40.174Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":703.2000122070312,"clientY":347.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":294,"ts":"2026-05-22T07:03:40.182Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":704.7999877929688,"clientY":345.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":295,"ts":"2026-05-22T07:03:40.191Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":704.7999877929688,"clientY":342.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":296,"ts":"2026-05-22T07:03:40.201Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":704.7999877929688,"clientY":341.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":297,"ts":"2026-05-22T07:03:40.204Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":705.6000366210938,"clientY":340.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":298,"ts":"2026-05-22T07:03:40.215Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":706.4000244140625,"clientY":339.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":299,"ts":"2026-05-22T07:03:40.219Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":706.4000244140625,"clientY":338.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":300,"ts":"2026-05-22T07:03:40.232Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":707.2000122070312,"clientY":337.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":301,"ts":"2026-05-22T07:03:40.242Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":707.2000122070312,"clientY":336.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":302,"ts":"2026-05-22T07:03:40.247Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":707.2000122070312,"clientY":335.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":303,"ts":"2026-05-22T07:03:40.258Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":707.2000122070312,"clientY":334.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":304,"ts":"2026-05-22T07:03:40.271Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":707.2000122070312,"clientY":330.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":305,"ts":"2026-05-22T07:03:40.276Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":706.4000244140625,"clientY":326,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":306,"ts":"2026-05-22T07:03:40.285Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":704.7999877929688,"clientY":318,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":307,"ts":"2026-05-22T07:03:40.296Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":702.4000244140625,"clientY":310.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":308,"ts":"2026-05-22T07:03:40.300Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":700.7999877929688,"clientY":304.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":309,"ts":"2026-05-22T07:03:40.306Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":700,"clientY":298.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":310,"ts":"2026-05-22T07:03:40.315Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":699.2000122070312,"clientY":295.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":311,"ts":"2026-05-22T07:03:40.321Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":698.4000244140625,"clientY":294,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":312,"ts":"2026-05-22T07:03:40.329Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":698.4000244140625,"clientY":292.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":313,"ts":"2026-05-22T07:03:40.341Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":698.4000244140625,"clientY":290.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":314,"ts":"2026-05-22T07:03:40.368Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":698.4000244140625,"clientY":289.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":315,"ts":"2026-05-22T07:03:40.377Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":698.4000244140625,"clientY":288.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":316,"ts":"2026-05-22T07:03:40.386Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":698.4000244140625,"clientY":287.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":317,"ts":"2026-05-22T07:03:40.391Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":698.4000244140625,"clientY":284.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":318,"ts":"2026-05-22T07:03:40.399Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":697.6000366210938,"clientY":280.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":319,"ts":"2026-05-22T07:03:40.404Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":697.6000366210938,"clientY":274.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":320,"ts":"2026-05-22T07:03:40.411Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":696,"clientY":266.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":321,"ts":"2026-05-22T07:03:40.421Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":695.2000122070312,"clientY":257.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":322,"ts":"2026-05-22T07:03:40.426Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":694.4000244140625,"clientY":251.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":323,"ts":"2026-05-22T07:03:40.435Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":694.4000244140625,"clientY":246,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":324,"ts":"2026-05-22T07:03:40.441Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":693.6000366210938,"clientY":242.8000030517578,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":325,"ts":"2026-05-22T07:03:40.449Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":693.6000366210938,"clientY":240.40000915527344,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":326,"ts":"2026-05-22T07:03:40.457Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":693.6000366210938,"clientY":237.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":327,"ts":"2026-05-22T07:03:40.461Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":693.6000366210938,"clientY":235.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":328,"ts":"2026-05-22T07:03:40.469Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":693.6000366210938,"clientY":234.8000030517578,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":329,"ts":"2026-05-22T07:03:40.482Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":693.6000366210938,"clientY":233.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":330,"ts":"2026-05-22T07:03:40.505Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":693.6000366210938,"clientY":232.40000915527344,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":331,"ts":"2026-05-22T07:03:40.622Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":694.4000244140625,"clientY":232.40000915527344,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":332,"ts":"2026-05-22T07:03:40.636Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":695.2000122070312,"clientY":233.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":333,"ts":"2026-05-22T07:03:40.641Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":695.2000122070312,"clientY":234,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":334,"ts":"2026-05-22T07:03:40.654Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":696,"clientY":234.8000030517578,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":335,"ts":"2026-05-22T07:03:40.671Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":696,"clientY":235.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":336,"ts":"2026-05-22T07:03:40.679Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":696,"clientY":236.40000915527344,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":337,"ts":"2026-05-22T07:03:40.692Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":696,"clientY":237.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":338,"ts":"2026-05-22T07:03:40.697Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":696,"clientY":238,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":339,"ts":"2026-05-22T07:03:40.726Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":696,"clientY":239.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":340,"ts":"2026-05-22T07:03:40.736Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":696,"clientY":240.40000915527344,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":341,"ts":"2026-05-22T07:03:40.876Z","type":"pointer.down","payload":{"pointerId":1,"button":0,"buttons":1,"clientX":696,"clientY":240.40000915527344,"altKey":false,"ctrlKey":false,"targetInGraph":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":342,"ts":"2026-05-22T07:03:40.876Z","type":"shortcut.radial.menu.action.pointerdown","payload":{"actionKey":"dag-layout","disabled":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433399608,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":343,"ts":"2026-05-22T07:03:40.876Z","type":"focus.node-click.suppressed-window","payload":{"duration":420,"suppressNodeClickUntil":1779433421296},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421296,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":344,"ts":"2026-05-22T07:03:40.974Z","type":"pointer.up","payload":{"pointerId":1,"button":0,"buttons":0,"clientX":696,"clientY":240.40000915527344,"altKey":false,"ctrlKey":false,"hadOrbitDragState":false,"orbitDragMoved":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421296,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":345,"ts":"2026-05-22T07:03:40.975Z","type":"focus.node-click.suppressed-window","payload":{"duration":520,"suppressNodeClickUntil":1779433421495},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":346,"ts":"2026-05-22T07:03:40.975Z","type":"shortcut.radial.menu.action.run","payload":{"actionKey":"dag-layout"},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":347,"ts":"2026-05-22T07:03:40.975Z","type":"layout.set","payload":{"previousMode":"force","nextMode":"dag"},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":348,"ts":"2026-05-22T07:03:40.976Z","type":"cycle.detection","payload":{"cycleNodeCount":0,"cycleEdgeCount":0,"sccCount":0,"cycleNodes":[]},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":349,"ts":"2026-05-22T07:03:40.976Z","type":"edge-label.render-state","payload":{"selectedDiagramId":"flow_1_nexusreader_web_client_program_cs","readableModeActive":false,"edgeTitlesVisible":true,"focusedNodeId":null,"labeledLinkCount":22,"inlineEdgeTitlesEligible":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":350,"ts":"2026-05-22T07:03:40.977Z","type":"pointer.up","payload":{"pointerId":0,"button":0,"buttons":0,"clientX":0,"clientY":0,"altKey":false,"ctrlKey":false,"hadOrbitDragState":false,"orbitDragMoved":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":351,"ts":"2026-05-22T07:03:40.978Z","type":"shortcut.radial.menu.action.done","payload":{"actionKey":"dag-layout"},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":99.25394116669084,"y":15.219949488840166,"z":-620.5848142392534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":352,"ts":"2026-05-22T07:03:41.343Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":695.2000122070312,"clientY":243.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":242.378399791741,"y":37.16715889216713,"z":-1515.4698387014191},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":353,"ts":"2026-05-22T07:03:41.348Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":692,"clientY":249.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":244.21198299994865,"y":37.448327009870766,"z":-1526.9343093439172},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":354,"ts":"2026-05-22T07:03:41.355Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":688,"clientY":254,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":246.54827701423744,"y":37.80658257605365,"z":-1541.541977007519},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":355,"ts":"2026-05-22T07:03:41.364Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":685.6000366210938,"clientY":258.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":249.3248419055975,"y":38.232350831724375,"z":-1558.9024363210094},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":356,"ts":"2026-05-22T07:03:41.369Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":681.6000366210938,"clientY":263.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":250.53506648806075,"y":38.41793093865744,"z":-1566.469360000487},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":357,"ts":"2026-05-22T07:03:41.377Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":675.2000122070312,"clientY":268.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":252.71047361751954,"y":38.75151554234004,"z":-1580.071083150832},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":358,"ts":"2026-05-22T07:03:41.388Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":669.6000366210938,"clientY":274.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":255.28493356469613,"y":39.1462923128792,"z":-1596.1678822230401},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":359,"ts":"2026-05-22T07:03:41.391Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":659.2000122070312,"clientY":281.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":256.7550007542516,"y":39.37171760186253,"z":-1605.3594706176748},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":360,"ts":"2026-05-22T07:03:41.402Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":646.4000244140625,"clientY":290,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":258.5315400784911,"y":39.644138409157755,"z":-1616.4672746359588},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":361,"ts":"2026-05-22T07:03:41.407Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":633.6000366210938,"clientY":297.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":260.11248824830517,"y":39.88656657882241,"z":-1626.3521458536993},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":362,"ts":"2026-05-22T07:03:41.415Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":624,"clientY":301.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":262.0525970573297,"y":40.18406970795878,"z":-1638.4826673292182},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":363,"ts":"2026-05-22T07:03:41.422Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":612.7999877929688,"clientY":306,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":263.0811368636741,"y":40.341789630370045,"z":-1644.9136077750582},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":364,"ts":"2026-05-22T07:03:41.427Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":601.6000366210938,"clientY":310,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":264.4080084819425,"y":40.54525680528357,"z":-1653.209866513636},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":365,"ts":"2026-05-22T07:03:41.435Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":592,"clientY":313.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":265.90793120976554,"y":40.775260247829905,"z":-1662.5881265250546},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":366,"ts":"2026-05-22T07:03:41.444Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":582.4000244140625,"clientY":315.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":267.58421204728677,"y":41.03230706507757,"z":-1673.0690648126224},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":367,"ts":"2026-05-22T07:03:41.450Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":576.7999877929688,"clientY":317.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":268.44283044827773,"y":41.16397063973929,"z":-1678.4375724468582},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":368,"ts":"2026-05-22T07:03:41.459Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":571.2000122070312,"clientY":317.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":269.87448552099704,"y":41.38350567921581,"z":-1687.388989256253},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":369,"ts":"2026-05-22T07:03:41.464Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":565.6000366210938,"clientY":318,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":270.6168577332386,"y":41.497343653198726,"z":-1692.0306681257762},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":370,"ts":"2026-05-22T07:03:41.472Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":560,"clientY":318.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":271.70281914765985,"y":41.66386880756577,"z":-1698.8206369140962},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":371,"ts":"2026-05-22T07:03:41.477Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":554.4000244140625,"clientY":318.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":272.32594651534487,"y":41.75942135640967,"z":-1702.7167379371554},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":372,"ts":"2026-05-22T07:03:41.486Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":548,"clientY":318.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":273.2753803262062,"y":41.905010886401605,"z":-1708.6530685072062},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":373,"ts":"2026-05-22T07:03:41.491Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":540.7999877929688,"clientY":318.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":273.77208610702337,"y":41.98117750312222,"z":-1711.7587191352486},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":374,"ts":"2026-05-22T07:03:41.501Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":534.4000244140625,"clientY":318,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":274.60468016447305,"y":42.10885041313604,"z":-1716.9645096802442},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":375,"ts":"2026-05-22T07:03:41.510Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":528.7999877929688,"clientY":318,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":275.30678247862454,"y":42.216513258880745,"z":-1721.3544011957147},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":376,"ts":"2026-05-22T07:03:41.515Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":521.6000366210938,"clientY":318,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":275.7300789457706,"y":42.28142303246794,"z":-1724.0010604250015},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":377,"ts":"2026-05-22T07:03:41.520Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":516.7999877929688,"clientY":318,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":275.99057678843747,"y":42.32136869065277,"z":-1725.6298219975993},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":378,"ts":"2026-05-22T07:03:41.528Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":509.6000061035156,"clientY":318,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.37132160078505,"y":42.37975344337847,"z":-1728.0104271994264},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":379,"ts":"2026-05-22T07:03:41.537Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":504,"clientY":318,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.6247737520894,"y":42.41861869039382,"z":-1729.5951356189298},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":380,"ts":"2026-05-22T07:03:41.541Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":497.6000061035156,"clientY":318.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.74798854565086,"y":42.43751288151852,"z":-1730.3655355534315},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":381,"ts":"2026-05-22T07:03:41.550Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":488.8000183105469,"clientY":320.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.8472526156406,"y":42.45273438419682,"z":-1730.9861836980908},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":382,"ts":"2026-05-22T07:03:41.558Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":482.3999938964844,"clientY":321.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":383,"ts":"2026-05-22T07:03:41.563Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":476.8000183105469,"clientY":322,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":384,"ts":"2026-05-22T07:03:41.573Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":472.8000183105469,"clientY":322,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":385,"ts":"2026-05-22T07:03:41.577Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":471.20001220703125,"clientY":322.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":386,"ts":"2026-05-22T07:03:41.588Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":470.3999938964844,"clientY":322.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":387,"ts":"2026-05-22T07:03:41.974Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":469.6000061035156,"clientY":322,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":388,"ts":"2026-05-22T07:03:41.995Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":469.6000061035156,"clientY":321.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":389,"ts":"2026-05-22T07:03:42.026Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":468.8000183105469,"clientY":321.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":390,"ts":"2026-05-22T07:03:42.050Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":468,"clientY":320.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":391,"ts":"2026-05-22T07:03:42.053Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":467.20001220703125,"clientY":320.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":392,"ts":"2026-05-22T07:03:42.062Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":464.8000183105469,"clientY":320.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":393,"ts":"2026-05-22T07:03:42.076Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":460.8000183105469,"clientY":320.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":394,"ts":"2026-05-22T07:03:42.080Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":457.6000061035156,"clientY":319.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":395,"ts":"2026-05-22T07:03:42.090Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":453.6000061035156,"clientY":318.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":396,"ts":"2026-05-22T07:03:42.093Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":448.8000183105469,"clientY":317.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":397,"ts":"2026-05-22T07:03:42.101Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":443.20001220703125,"clientY":316.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":398,"ts":"2026-05-22T07:03:42.110Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":436.8000183105469,"clientY":316.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":399,"ts":"2026-05-22T07:03:42.120Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":428.8000183105469,"clientY":315.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":400,"ts":"2026-05-22T07:03:42.123Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":423.20001220703125,"clientY":314.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":401,"ts":"2026-05-22T07:03:42.132Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":417.6000061035156,"clientY":314.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":402,"ts":"2026-05-22T07:03:42.137Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":414.3999938964844,"clientY":314,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":403,"ts":"2026-05-22T07:03:42.145Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":413.6000061035156,"clientY":314,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":404,"ts":"2026-05-22T07:03:42.153Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":412,"clientY":314,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":405,"ts":"2026-05-22T07:03:42.163Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":411.20001220703125,"clientY":314,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":406,"ts":"2026-05-22T07:03:42.175Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":410.3999938964844,"clientY":314,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":407,"ts":"2026-05-22T07:03:42.180Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":409.6000061035156,"clientY":314,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":408,"ts":"2026-05-22T07:03:42.188Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":408.8000183105469,"clientY":314,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":409,"ts":"2026-05-22T07:03:42.290Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":409.6000061035156,"clientY":314,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":410,"ts":"2026-05-22T07:03:42.297Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":410.3999938964844,"clientY":314,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":411,"ts":"2026-05-22T07:03:42.301Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":411.20001220703125,"clientY":314,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":412,"ts":"2026-05-22T07:03:42.310Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":412,"clientY":314,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":413,"ts":"2026-05-22T07:03:42.324Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":413.6000061035156,"clientY":314,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":414,"ts":"2026-05-22T07:03:42.337Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":415.20001220703125,"clientY":314,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":415,"ts":"2026-05-22T07:03:42.340Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":416.8000183105469,"clientY":314,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":416,"ts":"2026-05-22T07:03:42.345Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":420.8000183105469,"clientY":314,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":417,"ts":"2026-05-22T07:03:42.356Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":426.3999938964844,"clientY":314,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":418,"ts":"2026-05-22T07:03:42.360Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":436.8000183105469,"clientY":314,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":419,"ts":"2026-05-22T07:03:42.368Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":455.20001220703125,"clientY":314,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":420,"ts":"2026-05-22T07:03:42.377Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":474.3999938964844,"clientY":314,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":421,"ts":"2026-05-22T07:03:42.382Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":495.20001220703125,"clientY":317.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":422,"ts":"2026-05-22T07:03:42.391Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":509.6000061035156,"clientY":317.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":423,"ts":"2026-05-22T07:03:42.394Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":520.7999877929688,"clientY":318,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":424,"ts":"2026-05-22T07:03:42.403Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":529.6000366210938,"clientY":318,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":425,"ts":"2026-05-22T07:03:42.408Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":536.7999877929688,"clientY":318,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":426,"ts":"2026-05-22T07:03:42.417Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":542.4000244140625,"clientY":318,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":427,"ts":"2026-05-22T07:03:42.426Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":548,"clientY":318,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":428,"ts":"2026-05-22T07:03:42.434Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":552.7999877929688,"clientY":318,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":429,"ts":"2026-05-22T07:03:42.439Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":560,"clientY":318,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":430,"ts":"2026-05-22T07:03:42.450Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":568.7999877929688,"clientY":318,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":431,"ts":"2026-05-22T07:03:42.453Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":578.4000244140625,"clientY":317.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":432,"ts":"2026-05-22T07:03:42.463Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":586.4000244140625,"clientY":317.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":433,"ts":"2026-05-22T07:03:42.467Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":596,"clientY":315.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":434,"ts":"2026-05-22T07:03:42.473Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":602.4000244140625,"clientY":315.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":435,"ts":"2026-05-22T07:03:42.481Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":610.4000244140625,"clientY":315.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":436,"ts":"2026-05-22T07:03:42.490Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":619.2000122070312,"clientY":314.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":437,"ts":"2026-05-22T07:03:42.495Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":625.6000366210938,"clientY":314,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":438,"ts":"2026-05-22T07:03:42.504Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":634.4000244140625,"clientY":311.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":439,"ts":"2026-05-22T07:03:42.510Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":640,"clientY":310.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":440,"ts":"2026-05-22T07:03:42.517Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":644,"clientY":309.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":441,"ts":"2026-05-22T07:03:42.523Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":646.4000244140625,"clientY":308.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":442,"ts":"2026-05-22T07:03:42.532Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":648,"clientY":306.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":443,"ts":"2026-05-22T07:03:42.807Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":650.4000244140625,"clientY":306.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":444,"ts":"2026-05-22T07:03:42.813Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":652,"clientY":306.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":445,"ts":"2026-05-22T07:03:42.829Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":654.4000244140625,"clientY":305.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":446,"ts":"2026-05-22T07:03:42.838Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":656,"clientY":305.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":447,"ts":"2026-05-22T07:03:42.843Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":656,"clientY":304.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":448,"ts":"2026-05-22T07:03:42.850Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":657.6000366210938,"clientY":303.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":449,"ts":"2026-05-22T07:03:42.859Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":659.2000122070312,"clientY":302.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":450,"ts":"2026-05-22T07:03:42.864Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":660,"clientY":302,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":451,"ts":"2026-05-22T07:03:42.871Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":661.6000366210938,"clientY":301.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":452,"ts":"2026-05-22T07:03:42.880Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":662.4000244140625,"clientY":300.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":453,"ts":"2026-05-22T07:03:42.884Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":663.2000122070312,"clientY":299.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":454,"ts":"2026-05-22T07:03:42.901Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":664,"clientY":298.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":455,"ts":"2026-05-22T07:03:42.914Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":665.6000366210938,"clientY":298.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":456,"ts":"2026-05-22T07:03:42.943Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":666.4000244140625,"clientY":298.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":457,"ts":"2026-05-22T07:03:42.957Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":667.2000122070312,"clientY":298.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":458,"ts":"2026-05-22T07:03:42.990Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":668,"clientY":298.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":459,"ts":"2026-05-22T07:03:43.021Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":669.6000366210938,"clientY":298.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":460,"ts":"2026-05-22T07:03:43.055Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":670.4000244140625,"clientY":298.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":461,"ts":"2026-05-22T07:03:43.064Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":671.2000122070312,"clientY":298,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":462,"ts":"2026-05-22T07:03:43.069Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":671.2000122070312,"clientY":297.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":463,"ts":"2026-05-22T07:03:43.077Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":672,"clientY":297.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":464,"ts":"2026-05-22T07:03:43.083Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":673.6000366210938,"clientY":297.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":465,"ts":"2026-05-22T07:03:43.091Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":675.2000122070312,"clientY":296.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":466,"ts":"2026-05-22T07:03:43.096Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":676.7999877929688,"clientY":294.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":467,"ts":"2026-05-22T07:03:43.105Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":678.4000244140625,"clientY":294,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":468,"ts":"2026-05-22T07:03:43.114Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":680,"clientY":294,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":469,"ts":"2026-05-22T07:03:43.119Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":680,"clientY":293.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":470,"ts":"2026-05-22T07:03:43.133Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":682.4000244140625,"clientY":292.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":471,"ts":"2026-05-22T07:03:43.146Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":683.2000122070312,"clientY":292.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":472,"ts":"2026-05-22T07:03:43.159Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":684,"clientY":292.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":473,"ts":"2026-05-22T07:03:43.191Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":685.6000366210938,"clientY":292.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":474,"ts":"2026-05-22T07:03:43.204Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":686.4000244140625,"clientY":292.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":475,"ts":"2026-05-22T07:03:43.217Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":686.4000244140625,"clientY":291.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":476,"ts":"2026-05-22T07:03:43.231Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":686.4000244140625,"clientY":290.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":477,"ts":"2026-05-22T07:03:43.240Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":687.2000122070312,"clientY":290.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":478,"ts":"2026-05-22T07:03:43.249Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":688,"clientY":290.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":479,"ts":"2026-05-22T07:03:43.261Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":688.7999877929688,"clientY":288.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":480,"ts":"2026-05-22T07:03:43.266Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":689.6000366210938,"clientY":287.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":481,"ts":"2026-05-22T07:03:43.276Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":691.2000122070312,"clientY":285.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":482,"ts":"2026-05-22T07:03:43.280Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":692.7999877929688,"clientY":282,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":483,"ts":"2026-05-22T07:03:43.288Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":695.2000122070312,"clientY":278.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":484,"ts":"2026-05-22T07:03:43.296Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":697.6000366210938,"clientY":274,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":485,"ts":"2026-05-22T07:03:43.302Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":700.7999877929688,"clientY":269.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":486,"ts":"2026-05-22T07:03:43.313Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":703.2000122070312,"clientY":264.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":487,"ts":"2026-05-22T07:03:43.317Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":704.7999877929688,"clientY":261.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":488,"ts":"2026-05-22T07:03:43.323Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":706.4000244140625,"clientY":259.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":489,"ts":"2026-05-22T07:03:43.330Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":707.2000122070312,"clientY":257.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":490,"ts":"2026-05-22T07:03:43.339Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":708,"clientY":257.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":491,"ts":"2026-05-22T07:03:43.344Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":708.7999877929688,"clientY":256.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":492,"ts":"2026-05-22T07:03:43.353Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":708.7999877929688,"clientY":255.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":493,"ts":"2026-05-22T07:03:43.362Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":709.6000366210938,"clientY":255.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":494,"ts":"2026-05-22T07:03:43.366Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":709.6000366210938,"clientY":254.8000030517578,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":495,"ts":"2026-05-22T07:03:43.410Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":709.6000366210938,"clientY":253.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":496,"ts":"2026-05-22T07:03:43.432Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":709.6000366210938,"clientY":252.40000915527344,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":497,"ts":"2026-05-22T07:03:43.445Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":709.6000366210938,"clientY":251.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":498,"ts":"2026-05-22T07:03:43.473Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":709.6000366210938,"clientY":250.8000030517578,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":499,"ts":"2026-05-22T07:03:43.530Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":709.6000366210938,"clientY":251.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":500,"ts":"2026-05-22T07:03:43.536Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":709.6000366210938,"clientY":252.40000915527344,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":501,"ts":"2026-05-22T07:03:43.549Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":709.6000366210938,"clientY":253.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":502,"ts":"2026-05-22T07:03:43.558Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":708.7999877929688,"clientY":253.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":503,"ts":"2026-05-22T07:03:43.564Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":708.7999877929688,"clientY":254,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":504,"ts":"2026-05-22T07:03:43.582Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":708,"clientY":255.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":505,"ts":"2026-05-22T07:03:43.587Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":707.2000122070312,"clientY":256.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":506,"ts":"2026-05-22T07:03:43.592Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":706.4000244140625,"clientY":257.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":507,"ts":"2026-05-22T07:03:43.602Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":705.6000366210938,"clientY":258,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":508,"ts":"2026-05-22T07:03:43.614Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":703.2000122070312,"clientY":260.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":509,"ts":"2026-05-22T07:03:43.624Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":701.6000366210938,"clientY":261.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":510,"ts":"2026-05-22T07:03:43.629Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":701.6000366210938,"clientY":262.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":511,"ts":"2026-05-22T07:03:43.639Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":699.2000122070312,"clientY":264.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":512,"ts":"2026-05-22T07:03:43.644Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":698.4000244140625,"clientY":266,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":513,"ts":"2026-05-22T07:03:43.649Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":697.6000366210938,"clientY":266,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":514,"ts":"2026-05-22T07:03:43.656Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":696.7999877929688,"clientY":266.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":515,"ts":"2026-05-22T07:03:43.667Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":696.7999877929688,"clientY":268.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":516,"ts":"2026-05-22T07:03:43.679Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":695.2000122070312,"clientY":268.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":517,"ts":"2026-05-22T07:03:43.689Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":695.2000122070312,"clientY":269.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":518,"ts":"2026-05-22T07:03:43.692Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":695.2000122070312,"clientY":270,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":519,"ts":"2026-05-22T07:03:43.701Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":694.4000244140625,"clientY":270,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":520,"ts":"2026-05-22T07:03:43.706Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":693.6000366210938,"clientY":270.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":521,"ts":"2026-05-22T07:03:43.714Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":692.7999877929688,"clientY":271.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":522,"ts":"2026-05-22T07:03:43.720Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":692.7999877929688,"clientY":272.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":523,"ts":"2026-05-22T07:03:43.742Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":691.2000122070312,"clientY":274,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":524,"ts":"2026-05-22T07:03:43.755Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":690.4000244140625,"clientY":274.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":525,"ts":"2026-05-22T07:03:43.764Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":689.6000366210938,"clientY":275.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":526,"ts":"2026-05-22T07:03:43.769Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":688.7999877929688,"clientY":277.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":527,"ts":"2026-05-22T07:03:43.785Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":687.2000122070312,"clientY":278,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":528,"ts":"2026-05-22T07:03:43.790Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":686.4000244140625,"clientY":279.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":529,"ts":"2026-05-22T07:03:43.798Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":685.6000366210938,"clientY":279.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":530,"ts":"2026-05-22T07:03:43.807Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":684.7999877929688,"clientY":280.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":531,"ts":"2026-05-22T07:03:43.812Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":684,"clientY":282,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":532,"ts":"2026-05-22T07:03:43.819Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":683.2000122070312,"clientY":282.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":533,"ts":"2026-05-22T07:03:43.829Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":682.4000244140625,"clientY":282.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":534,"ts":"2026-05-22T07:03:43.832Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":681.6000366210938,"clientY":284.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":535,"ts":"2026-05-22T07:03:43.841Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":680.7999877929688,"clientY":285.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":536,"ts":"2026-05-22T07:03:43.846Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":680,"clientY":286,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":537,"ts":"2026-05-22T07:03:43.854Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":679.2000122070312,"clientY":286.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":538,"ts":"2026-05-22T07:03:43.863Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":678.4000244140625,"clientY":288.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":539,"ts":"2026-05-22T07:03:43.872Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":677.6000366210938,"clientY":288.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":540,"ts":"2026-05-22T07:03:43.876Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":676.7999877929688,"clientY":289.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":541,"ts":"2026-05-22T07:03:43.885Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":676,"clientY":290,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":542,"ts":"2026-05-22T07:03:43.889Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":675.2000122070312,"clientY":291.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":543,"ts":"2026-05-22T07:03:43.906Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":675.2000122070312,"clientY":292.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":544,"ts":"2026-05-22T07:03:43.912Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":674.4000244140625,"clientY":293.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":545,"ts":"2026-05-22T07:03:43.920Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":673.6000366210938,"clientY":293.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":546,"ts":"2026-05-22T07:03:43.925Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":673.6000366210938,"clientY":294,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":547,"ts":"2026-05-22T07:03:43.942Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":672.7999877929688,"clientY":294.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":548,"ts":"2026-05-22T07:03:43.968Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":672,"clientY":295.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":549,"ts":"2026-05-22T07:03:43.976Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":671.2000122070312,"clientY":295.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":550,"ts":"2026-05-22T07:03:43.990Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":671.2000122070312,"clientY":296.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":551,"ts":"2026-05-22T07:03:44.003Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":671.2000122070312,"clientY":297.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":552,"ts":"2026-05-22T07:03:44.115Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":671.2000122070312,"clientY":296.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":553,"ts":"2026-05-22T07:03:44.133Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":672,"clientY":295.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":554,"ts":"2026-05-22T07:03:44.279Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":672,"clientY":296.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":555,"ts":"2026-05-22T07:03:44.289Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":672,"clientY":297.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":556,"ts":"2026-05-22T07:03:44.300Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":672.7999877929688,"clientY":298.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":557,"ts":"2026-05-22T07:03:44.309Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":672.7999877929688,"clientY":299.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":558,"ts":"2026-05-22T07:03:44.323Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":672.7999877929688,"clientY":300.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":559,"ts":"2026-05-22T07:03:44.332Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":673.6000366210938,"clientY":302,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":560,"ts":"2026-05-22T07:03:44.352Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":673.6000366210938,"clientY":303.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":561,"ts":"2026-05-22T07:03:44.356Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":673.6000366210938,"clientY":304.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":562,"ts":"2026-05-22T07:03:44.379Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":673.6000366210938,"clientY":305.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":563,"ts":"2026-05-22T07:03:44.385Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":673.6000366210938,"clientY":306,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":564,"ts":"2026-05-22T07:03:44.420Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":674.4000244140625,"clientY":307.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":565,"ts":"2026-05-22T07:03:44.438Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":674.4000244140625,"clientY":308.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":566,"ts":"2026-05-22T07:03:44.469Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":674.4000244140625,"clientY":309.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":567,"ts":"2026-05-22T07:03:44.492Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":674.4000244140625,"clientY":310,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":568,"ts":"2026-05-22T07:03:44.584Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":675.2000122070312,"clientY":310,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":569,"ts":"2026-05-22T07:03:44.656Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":676,"clientY":310,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":570,"ts":"2026-05-22T07:03:44.703Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":677.6000366210938,"clientY":310,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":571,"ts":"2026-05-22T07:03:44.724Z","type":"pointer.down","payload":{"pointerId":1,"button":0,"buttons":1,"clientX":677.6000366210938,"clientY":310,"altKey":false,"ctrlKey":false,"targetInGraph":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":572,"ts":"2026-05-22T07:03:44.724Z","type":"shortcut.radial.menu.action.pointerdown","payload":{"actionKey":"force-layout","disabled":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433421495,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":573,"ts":"2026-05-22T07:03:44.724Z","type":"focus.node-click.suppressed-window","payload":{"duration":420,"suppressNodeClickUntil":1779433425144},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425144,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":574,"ts":"2026-05-22T07:03:44.872Z","type":"pointer.up","payload":{"pointerId":1,"button":0,"buttons":0,"clientX":677.6000366210938,"clientY":310,"altKey":false,"ctrlKey":false,"hadOrbitDragState":false,"orbitDragMoved":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425144,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":575,"ts":"2026-05-22T07:03:44.873Z","type":"focus.node-click.suppressed-window","payload":{"duration":520,"suppressNodeClickUntil":1779433425393},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":576,"ts":"2026-05-22T07:03:44.873Z","type":"shortcut.radial.menu.action.run","payload":{"actionKey":"force-layout"},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":577,"ts":"2026-05-22T07:03:44.873Z","type":"layout.set","payload":{"previousMode":"dag","nextMode":"force"},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":578,"ts":"2026-05-22T07:03:44.874Z","type":"cycle.detection","payload":{"cycleNodeCount":0,"cycleEdgeCount":0,"sccCount":0,"cycleNodes":[]},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":579,"ts":"2026-05-22T07:03:44.875Z","type":"edge-label.render-state","payload":{"selectedDiagramId":"flow_1_nexusreader_web_client_program_cs","readableModeActive":false,"edgeTitlesVisible":true,"focusedNodeId":null,"labeledLinkCount":22,"inlineEdgeTitlesEligible":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":580,"ts":"2026-05-22T07:03:44.875Z","type":"pointer.up","payload":{"pointerId":0,"button":0,"buttons":0,"clientX":0,"clientY":0,"altKey":false,"ctrlKey":false,"hadOrbitDragState":false,"orbitDragMoved":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":581,"ts":"2026-05-22T07:03:44.876Z","type":"shortcut.radial.menu.action.done","payload":{"actionKey":"force-layout"},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":276.86085064457035,"y":42.45481955392434,"z":-1731.0712053119246},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":582,"ts":"2026-05-22T07:03:45.220Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":676.7999877929688,"clientY":310,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":293.41985084368815,"y":44.99403506167938,"z":-1834.6062784965648},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":583,"ts":"2026-05-22T07:03:45.229Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":672,"clientY":312.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":293.84411616781057,"y":45.05909340321329,"z":-1837.2589954996756},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":584,"ts":"2026-05-22T07:03:45.233Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":666.4000244140625,"clientY":314.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":294.0103100420078,"y":45.08457815818527,"z":-1838.298121939735},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":585,"ts":"2026-05-22T07:03:45.243Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":660.7999877929688,"clientY":318,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":294.35744091701673,"y":45.137808431175436,"z":-1840.468556151736},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":586,"ts":"2026-05-22T07:03:45.252Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":652,"clientY":320.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":294.6982511602654,"y":45.190069476193415,"z":-1842.5994706424976},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":587,"ts":"2026-05-22T07:03:45.255Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":644,"clientY":322.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":294.9001767170792,"y":45.221033453432874,"z":-1843.8620092650697},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":588,"ts":"2026-05-22T07:03:45.264Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":635.2000122070312,"clientY":326,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":295.19278603720613,"y":45.265903198855035,"z":-1845.6915477039583},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":589,"ts":"2026-05-22T07:03:45.269Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":625.6000366210938,"clientY":329.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":295.3638087455455,"y":45.29212842428965,"z":-1846.7608664074571},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":590,"ts":"2026-05-22T07:03:45.280Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":616,"clientY":334,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":295.649774070431,"y":45.33597935604265,"z":-1848.5488632964157},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":591,"ts":"2026-05-22T07:03:45.285Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":608.7999877929688,"clientY":337.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":295.8876719534384,"y":45.372459456684645,"z":-1850.0363187243684},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":592,"ts":"2026-05-22T07:03:45.293Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":603.2000122070312,"clientY":338.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":296.1242848418483,"y":45.408742511721805,"z":-1851.515739729463},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":593,"ts":"2026-05-22T07:03:45.298Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":598.4000244140625,"clientY":342,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":296.2690530541591,"y":45.430941780114175,"z":-1852.4209023163446},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":594,"ts":"2026-05-22T07:03:45.306Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":596,"clientY":342.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":296.51496828747463,"y":45.468651289536204,"z":-1853.9584861905146},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":595,"ts":"2026-05-22T07:03:45.315Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":593.6000366210938,"clientY":343.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":296.7492339692526,"y":45.50457441562791,"z":-1855.423231296854},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":596,"ts":"2026-05-22T07:03:45.319Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":592,"clientY":345.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":296.8559101323351,"y":45.52093251480961,"z":-1856.0902235197539},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":597,"ts":"2026-05-22T07:03:45.329Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":590.4000244140625,"clientY":346,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":297.049928320312,"y":45.55068394821581,"z":-1857.303321354755},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":598,"ts":"2026-05-22T07:03:45.333Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":588,"clientY":347.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":297.1897821576679,"y":45.572129629015556,"z":-1858.177756834656},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":599,"ts":"2026-05-22T07:03:45.342Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":586.4000244140625,"clientY":349.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":297.3729949237759,"y":45.60022412091277,"z":-1859.3232938187284},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":600,"ts":"2026-05-22T07:03:45.351Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":585.6000366210938,"clientY":350,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":297.53109624652643,"y":45.624467935496824,"z":-1860.3118216177943},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":601,"ts":"2026-05-22T07:03:45.355Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":584,"clientY":350,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":297.641518351884,"y":45.641400450682,"z":-1861.0022353276754},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":602,"ts":"2026-05-22T07:03:45.365Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":583.2000122070312,"clientY":350.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":297.77745516480854,"y":45.66224548113688,"z":-1861.8521796301934},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":603,"ts":"2026-05-22T07:03:45.373Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":582.4000244140625,"clientY":351.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":297.9290600743894,"y":45.685493112807286,"z":-1862.8000886355594},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":604,"ts":"2026-05-22T07:03:45.378Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":582.4000244140625,"clientY":352.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":297.9899389209751,"y":45.69482848991254,"z":-1863.1807333460404},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":605,"ts":"2026-05-22T07:03:45.388Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":581.6000366210938,"clientY":352.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.1054953641623,"y":45.71254832257356,"z":-1863.9032494797734},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":606,"ts":"2026-05-22T07:03:45.392Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":580.7999877929688,"clientY":352.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.1825433330421,"y":45.724363129933174,"z":-1864.3849915536164},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":607,"ts":"2026-05-22T07:03:45.401Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":580,"clientY":353.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.26353746645185,"y":45.7367830560832,"z":-1864.891407003177},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":608,"ts":"2026-05-22T07:03:45.415Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":579.2000122070312,"clientY":354,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.3779104361757,"y":45.75432141074825,"z":-1865.6065234744801},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":609,"ts":"2026-05-22T07:03:45.418Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":578.4000244140625,"clientY":354,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.4157063824659,"y":45.7601171744898,"z":-1865.842842456193},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":610,"ts":"2026-05-22T07:03:45.458Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":577.6000366210938,"clientY":354.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461695,"z":-1866.4867775911387},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":611,"ts":"2026-05-22T07:03:45.472Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":576.7999877929688,"clientY":355.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":612,"ts":"2026-05-22T07:03:45.522Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":577.6000366210938,"clientY":355.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":613,"ts":"2026-05-22T07:03:45.536Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":579.2000122070312,"clientY":355.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":614,"ts":"2026-05-22T07:03:45.542Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":582.4000244140625,"clientY":354,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":615,"ts":"2026-05-22T07:03:45.552Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":587.2000122070312,"clientY":352.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":616,"ts":"2026-05-22T07:03:45.556Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":602.4000244140625,"clientY":347.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":617,"ts":"2026-05-22T07:03:45.565Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":632.7999877929688,"clientY":337.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":618,"ts":"2026-05-22T07:03:45.571Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":663.2000122070312,"clientY":325.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":619,"ts":"2026-05-22T07:03:45.579Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":680.7999877929688,"clientY":318.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":620,"ts":"2026-05-22T07:03:45.585Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":692.7999877929688,"clientY":313.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":621,"ts":"2026-05-22T07:03:45.591Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":701.6000366210938,"clientY":310,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":622,"ts":"2026-05-22T07:03:45.600Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":706.4000244140625,"clientY":308.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":623,"ts":"2026-05-22T07:03:45.605Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":708,"clientY":307.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":624,"ts":"2026-05-22T07:03:45.615Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":709.6000366210938,"clientY":307.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":625,"ts":"2026-05-22T07:03:45.621Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":711.2000122070312,"clientY":306.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":626,"ts":"2026-05-22T07:03:45.634Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":712,"clientY":306.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":627,"ts":"2026-05-22T07:03:45.664Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":713.6000366210938,"clientY":306.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":628,"ts":"2026-05-22T07:03:45.678Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":715.2000122070312,"clientY":306.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":629,"ts":"2026-05-22T07:03:45.686Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":716,"clientY":306.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":630,"ts":"2026-05-22T07:03:45.692Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":718.4000244140625,"clientY":306.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":631,"ts":"2026-05-22T07:03:45.701Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":719.2000122070312,"clientY":306.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":632,"ts":"2026-05-22T07:03:45.705Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":721.6000366210938,"clientY":306,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":633,"ts":"2026-05-22T07:03:45.714Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":724.7999877929688,"clientY":306,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":634,"ts":"2026-05-22T07:03:45.719Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":726.4000244140625,"clientY":306,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":635,"ts":"2026-05-22T07:03:45.729Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":728,"clientY":305.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":636,"ts":"2026-05-22T07:03:45.734Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":729.6000366210938,"clientY":305.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":637,"ts":"2026-05-22T07:03:45.742Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":731.2000122070312,"clientY":304.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":638,"ts":"2026-05-22T07:03:45.755Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":732.7999877929688,"clientY":304.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":639,"ts":"2026-05-22T07:03:45.765Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":733.6000366210938,"clientY":304.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":640,"ts":"2026-05-22T07:03:45.778Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":734.4000244140625,"clientY":304.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":641,"ts":"2026-05-22T07:03:45.788Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":735.2000122070312,"clientY":304.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":642,"ts":"2026-05-22T07:03:45.809Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":736,"clientY":304.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":643,"ts":"2026-05-22T07:03:45.828Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":736.7999877929688,"clientY":305.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":644,"ts":"2026-05-22T07:03:45.852Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":737.6000366210938,"clientY":306,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":645,"ts":"2026-05-22T07:03:45.871Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":737.6000366210938,"clientY":307.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":646,"ts":"2026-05-22T07:03:45.881Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":738.4000244140625,"clientY":307.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":647,"ts":"2026-05-22T07:03:45.891Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":739.2000122070312,"clientY":307.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":648,"ts":"2026-05-22T07:03:45.899Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":739.2000122070312,"clientY":308.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":649,"ts":"2026-05-22T07:03:45.908Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":740,"clientY":308.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":650,"ts":"2026-05-22T07:03:45.912Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":741.6000366210938,"clientY":308.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":651,"ts":"2026-05-22T07:03:45.924Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":742.4000244140625,"clientY":309.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":652,"ts":"2026-05-22T07:03:45.928Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":744,"clientY":310,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":653,"ts":"2026-05-22T07:03:45.937Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":746.4000244140625,"clientY":310.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":654,"ts":"2026-05-22T07:03:45.941Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":747.2000122070312,"clientY":310.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":655,"ts":"2026-05-22T07:03:45.950Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":748.7999877929688,"clientY":311.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":656,"ts":"2026-05-22T07:03:45.959Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":750.4000244140625,"clientY":311.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":657,"ts":"2026-05-22T07:03:45.971Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":751.2000122070312,"clientY":311.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":658,"ts":"2026-05-22T07:03:45.978Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":752.7999877929688,"clientY":312.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":659,"ts":"2026-05-22T07:03:45.992Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":753.6000366210938,"clientY":313.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":660,"ts":"2026-05-22T07:03:46.008Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":754.4000244140625,"clientY":313.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":661,"ts":"2026-05-22T07:03:46.012Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":755.2000122070312,"clientY":313.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":662,"ts":"2026-05-22T07:03:46.042Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":756,"clientY":313.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":663,"ts":"2026-05-22T07:03:46.242Z","type":"pointer.down","payload":{"pointerId":1,"button":0,"buttons":1,"clientX":756.7999877929688,"clientY":313.20001220703125,"altKey":false,"ctrlKey":false,"targetInGraph":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":664,"ts":"2026-05-22T07:03:46.376Z","type":"pointer.up","payload":{"pointerId":1,"button":0,"buttons":0,"clientX":756.7999877929688,"clientY":313.20001220703125,"altKey":false,"ctrlKey":false,"hadOrbitDragState":false,"orbitDragMoved":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433425393,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":665,"ts":"2026-05-22T07:03:46.376Z","type":"focus.node-click.suppressed-window","payload":{"duration":220,"suppressNodeClickUntil":1779433426596},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":666,"ts":"2026-05-22T07:03:46.376Z","type":"shortcut.radial.menu.hide","payload":{"hadAnchor":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":667,"ts":"2026-05-22T07:03:47.268Z","type":"pointer.down","payload":{"pointerId":1,"button":0,"buttons":1,"clientX":536,"clientY":371.6000061035156,"altKey":false,"ctrlKey":false,"targetInGraph":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":668,"ts":"2026-05-22T07:03:47.268Z","type":"controls.start","payload":{"startPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":669,"ts":"2026-05-22T07:03:47.576Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":533.6000366210938,"clientY":371.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":298.5186948838481,"y":45.77590979461696,"z":-1866.486777591139},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":670,"ts":"2026-05-22T07:03:47.577Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":244.19579871521552,"y":36.62215572456581,"z":-1874.5690079682736},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":671,"ts":"2026-05-22T07:03:47.584Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":529.6000366210938,"clientY":368.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":244.19579871521546,"y":36.6221557245658,"z":-1874.5690079682731},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":672,"ts":"2026-05-22T07:03:47.584Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":153.18995813771275,"y":-18.311587435994632,"z":-1884.457284877153},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":673,"ts":"2026-05-22T07:03:47.593Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":522.4000244140625,"clientY":366.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":153.18995813771275,"y":-18.311587435994632,"z":-1884.457284877153},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":674,"ts":"2026-05-22T07:03:47.593Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-11.435740412132217,"y":-73.2305710728627,"z":-1889.3089327414932},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":675,"ts":"2026-05-22T07:03:47.597Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":516.7999877929688,"clientY":364,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-11.43574041213184,"y":-73.2305710728627,"z":-1889.3089327414932},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":676,"ts":"2026-05-22T07:03:47.597Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-139.18295423917272,"y":-128.08703929763692,"z":-1881.277106555133},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":677,"ts":"2026-05-22T07:03:47.604Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":510.3999938964844,"clientY":360.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-139.18295423917272,"y":-128.08703929763692,"z":-1881.277106555133},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":678,"ts":"2026-05-22T07:03:47.605Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-283.4205371953056,"y":-201.0525821449983,"z":-1858.5565351487119},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":679,"ts":"2026-05-22T07:03:47.613Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":506.3999938964844,"clientY":359.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-283.4205371953056,"y":-201.0525821449983,"z":-1858.5565351487119},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":680,"ts":"2026-05-22T07:03:47.613Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-372.2116121321376,"y":-237.42939007525192,"z":-1838.4959985155588},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":681,"ts":"2026-05-22T07:03:47.620Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":500,"clientY":357.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-372.21161213213765,"y":-237.42939007525197,"z":-1838.495998515559},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":682,"ts":"2026-05-22T07:03:47.621Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-512.0449505986743,"y":-273.71711616169824,"z":-1799.4084152636829},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":683,"ts":"2026-05-22T07:03:47.627Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":496,"clientY":356,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-512.0449505986743,"y":-273.71711616169824,"z":-1799.408415263683},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":684,"ts":"2026-05-22T07:03:47.628Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-596.7391116703498,"y":-309.90214550372883,"z":-1767.1572733773025},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":685,"ts":"2026-05-22T07:03:47.636Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":492.8000183105469,"clientY":355.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-596.7391116703499,"y":-309.9021455037289,"z":-1767.157273377303},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":686,"ts":"2026-05-22T07:03:47.636Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-663.6331730014412,"y":-327.9515606530706,"z":-1739.8334752477008},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":687,"ts":"2026-05-22T07:03:47.640Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":490.3999938964844,"clientY":354.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-663.6331730014412,"y":-327.9515606530706,"z":-1739.8334752477008},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":688,"ts":"2026-05-22T07:03:47.640Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-712.6464603737361,"y":-345.97090173183454,"z":-1716.805432687957},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":689,"ts":"2026-05-22T07:03:47.647Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":488,"clientY":353.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-712.6464603737361,"y":-345.97090173183454,"z":-1716.805432687957},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":690,"ts":"2026-05-22T07:03:47.648Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-760.8109546237472,"y":-363.9571038578146,"z":-1692.2421971783979},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":691,"ts":"2026-05-22T07:03:47.655Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":486.3999938964844,"clientY":353.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-760.8109546237472,"y":-363.9571038578146,"z":-1692.2421971783979},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":692,"ts":"2026-05-22T07:03:47.655Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-793.4452525836499,"y":-363.9571038578146,"z":-1677.1885981424798},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":693,"ts":"2026-05-22T07:03:47.663Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":484,"clientY":352,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-793.4452525836499,"y":-363.9571038578146,"z":-1677.1885981424798},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":694,"ts":"2026-05-22T07:03:47.663Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-838.4779985997635,"y":-399.8260929069497,"z":-1646.83802401151},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":695,"ts":"2026-05-22T07:03:47.670Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":481.6000061035156,"clientY":352,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-838.4779985997635,"y":-399.8260929069497,"z":-1646.83802401151},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":696,"ts":"2026-05-22T07:03:47.671Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-885.9664434740866,"y":-399.8260929069497,"z":-1621.7842928404127},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":697,"ts":"2026-05-22T07:03:47.677Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":478.3999938964844,"clientY":351.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-885.9664434740864,"y":-399.82609290694967,"z":-1621.7842928404125},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":698,"ts":"2026-05-22T07:03:47.677Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-946.0834535444706,"y":-417.70483127644076,"z":-1582.8551762220454},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":699,"ts":"2026-05-22T07:03:47.684Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":477.6000061035156,"clientY":350.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-946.0834535444706,"y":-417.70483127644076,"z":-1582.8551762220454},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":700,"ts":"2026-05-22T07:03:47.685Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-959.2144919300365,"y":-435.54507000707054,"z":-1570.0922859816785},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":701,"ts":"2026-05-22T07:03:47.692Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":475.20001220703125,"clientY":349.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-959.2144919300365,"y":-435.54507000707054,"z":-1570.0922859816785},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":702,"ts":"2026-05-22T07:03:47.692Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1002.0726088361565,"y":-453.34377467987747,"z":-1537.9569709892844},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":703,"ts":"2026-05-22T07:03:47.696Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":474.3999938964844,"clientY":348.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1002.0726088361565,"y":-453.34377467987747,"z":-1537.9569709892844},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":704,"ts":"2026-05-22T07:03:47.696Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1014.4409007210096,"y":-471.0999571255449,"z":-1524.4527625924954},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":705,"ts":"2026-05-22T07:03:47.704Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":473.6000061035156,"clientY":348.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1014.4409007210096,"y":-471.0999571255449,"z":-1524.4527625924954},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":706,"ts":"2026-05-22T07:03:47.704Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1029.1572915945212,"y":-471.0999571255449,"z":-1514.556646543593},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":707,"ts":"2026-05-22T07:03:47.711Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":472.8000183105469,"clientY":348.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1029.157291594521,"y":-471.0999571255448,"z":-1514.5566465435925},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":708,"ts":"2026-05-22T07:03:47.711Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1043.7771507352516,"y":-471.09995712554473,"z":-1504.5184698216708},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":709,"ts":"2026-05-22T07:03:47.720Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":471.20001220703125,"clientY":348.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1043.7771507352513,"y":-471.0999571255446,"z":-1504.5184698216706},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":710,"ts":"2026-05-22T07:03:47.720Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1072.722346092979,"y":-471.0999571255446,"z":-1484.0193174700644},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":711,"ts":"2026-05-22T07:03:47.754Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":470.3999938964844,"clientY":348.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1072.722346092979,"y":-471.0999571255446,"z":-1484.0193174700644},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":712,"ts":"2026-05-22T07:03:47.754Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1087.0449596645,"y":-471.0999571255446,"z":-1473.5602539765878},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":713,"ts":"2026-05-22T07:03:47.768Z","type":"pointer.up","payload":{"pointerId":1,"button":0,"buttons":0,"clientX":470.3999938964844,"clientY":348.8000183105469,"altKey":false,"ctrlKey":false,"hadOrbitDragState":true,"orbitDragMoved":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433426596,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1087.0449596645,"y":-471.0999571255446,"z":-1473.5602539765878},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":714,"ts":"2026-05-22T07:03:47.768Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433427988,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1087.0449596645,"y":-471.0999571255446,"z":-1473.5602539765878},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":715,"ts":"2026-05-22T07:03:48.611Z","type":"pointer.down","payload":{"pointerId":1,"button":0,"buttons":1,"clientX":221.60000610351562,"clientY":77.20000457763672,"altKey":false,"ctrlKey":false,"targetInGraph":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1087.0449596645,"y":-471.0999571255446,"z":-1473.5602539765878},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":716,"ts":"2026-05-22T07:03:48.612Z","type":"controls.start","payload":{"startPosition":{"x":-1087.0449596645,"y":-471.0999571255446,"z":-1473.5602539765878},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1087.0449596645,"y":-471.0999571255446,"z":-1473.5602539765878},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":717,"ts":"2026-05-22T07:03:48.792Z","type":"pointer.up","payload":{"pointerId":1,"button":0,"buttons":0,"clientX":221.60000610351562,"clientY":77.20000457763672,"altKey":false,"ctrlKey":false,"hadOrbitDragState":true,"orbitDragMoved":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1087.0449596645,"y":-471.0999571255446,"z":-1473.5602539765878},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":718,"ts":"2026-05-22T07:03:48.792Z","type":"controls.end","payload":{"changed":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1087.0449596645,"y":-471.0999571255446,"z":-1473.5602539765878},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":719,"ts":"2026-05-22T07:03:49.246Z","type":"pointer.down","payload":{"pointerId":1,"button":0,"buttons":1,"clientX":222.40000915527344,"clientY":102.80000305175781,"altKey":false,"ctrlKey":false,"targetInGraph":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1087.0449596645,"y":-471.0999571255446,"z":-1473.5602539765878},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":720,"ts":"2026-05-22T07:03:49.317Z","type":"pointer.up","payload":{"pointerId":1,"button":0,"buttons":0,"clientX":222.40000915527344,"clientY":102.80000305175781,"altKey":false,"ctrlKey":false,"hadOrbitDragState":false,"orbitDragMoved":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1087.0449596645,"y":-471.0999571255446,"z":-1473.5602539765878},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":721,"ts":"2026-05-22T07:03:50.280Z","type":"pointer.down","payload":{"pointerId":1,"button":0,"buttons":1,"clientX":208,"clientY":205.1999969482422,"altKey":false,"ctrlKey":false,"targetInGraph":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1087.0449596645,"y":-471.0999571255446,"z":-1473.5602539765878},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":722,"ts":"2026-05-22T07:03:50.371Z","type":"pointer.up","payload":{"pointerId":1,"button":0,"buttons":0,"clientX":208,"clientY":205.1999969482422,"altKey":false,"ctrlKey":false,"hadOrbitDragState":false,"orbitDragMoved":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1087.0449596645,"y":-471.0999571255446,"z":-1473.5602539765878},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":723,"ts":"2026-05-22T07:03:50.372Z","type":"focus.clear","payload":{"caller":"clear-focused-node-state","previousFocusedNodeId":null},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1087.0449596645,"y":-471.0999571255446,"z":-1473.5602539765878},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":724,"ts":"2026-05-22T07:03:50.375Z","type":"cycle.detection","payload":{"cycleNodeCount":0,"cycleEdgeCount":0,"sccCount":0,"cycleNodes":[]},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1087.0449596645,"y":-471.0999571255446,"z":-1473.5602539765878},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":725,"ts":"2026-05-22T07:03:50.376Z","type":"edge-label.render-state","payload":{"selectedDiagramId":"flow_2_nexusreader_maui_mauiprogram_cs","readableModeActive":false,"edgeTitlesVisible":true,"focusedNodeId":null,"labeledLinkCount":22,"inlineEdgeTitlesEligible":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1087.0449596645,"y":-471.0999571255446,"z":-1473.5602539765878},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":726,"ts":"2026-05-22T07:03:50.376Z","type":"pointer.up","payload":{"pointerId":0,"button":0,"buttons":0,"clientX":0,"clientY":0,"altKey":false,"ctrlKey":false,"hadOrbitDragState":false,"orbitDragMoved":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1087.0449596645,"y":-471.0999571255446,"z":-1473.5602539765878},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":727,"ts":"2026-05-22T07:03:51.678Z","type":"pointer.down","payload":{"pointerId":1,"button":0,"buttons":1,"clientX":404.8000183105469,"clientY":231.60000610351562,"altKey":false,"ctrlKey":false,"targetInGraph":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-782.6958244974096,"y":-339.2021333477088,"z":-1060.9951756630026},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":728,"ts":"2026-05-22T07:03:51.678Z","type":"controls.start","payload":{"startPosition":{"x":-782.6958244974096,"y":-339.2021333477088,"z":-1060.9951756630026},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-782.6958244974096,"y":-339.2021333477088,"z":-1060.9951756630026},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":729,"ts":"2026-05-22T07:03:51.944Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":403.20001220703125,"clientY":230.4000244140625,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-782.6958244974096,"y":-339.2021333477088,"z":-1060.9951756630026},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":730,"ts":"2026-05-22T07:03:51.944Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-800.0131829128154,"y":-358.3193559222258,"z":-1041.617852223487},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":731,"ts":"2026-05-22T07:03:51.947Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":399.20001220703125,"clientY":228,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-800.0131829128154,"y":-358.3193559222258,"z":-1041.617852223487},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":732,"ts":"2026-05-22T07:03:51.948Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-842.4048017157145,"y":-396.3238847776534,"z":-993.3091825481831},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":733,"ts":"2026-05-22T07:03:51.954Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":394.3999938964844,"clientY":224.8000030517578,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-842.4048017157145,"y":-396.3238847776534,"z":-993.3091825481831},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":734,"ts":"2026-05-22T07:03:51.955Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-887.4065253610096,"y":-446.4701016135869,"z":-930.8897415082713},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":735,"ts":"2026-05-22T07:03:51.961Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":389.6000671386719,"clientY":222.4000244140625,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-887.4065253610097,"y":-446.47010161358696,"z":-930.8897415082714},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":736,"ts":"2026-05-22T07:03:51.962Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-930.0954089202627,"y":-483.6438741346197,"z":-868.5578489950965},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":737,"ts":"2026-05-22T07:03:51.972Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":388,"clientY":220.8000030517578,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-930.0954089202627,"y":-483.6438741346197,"z":-868.5578489950965},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":738,"ts":"2026-05-22T07:03:51.972Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-939.5978298423516,"y":-508.20204653565247,"z":-843.9598342255401},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":739,"ts":"2026-05-22T07:03:51.975Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":384.8000183105469,"clientY":219.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-939.5978298423518,"y":-508.2020465356525,"z":-843.9598342255404},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":740,"ts":"2026-05-22T07:03:51.976Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-963.8251671239672,"y":-532.5693100072937,"z":-800.495209848439},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":741,"ts":"2026-05-22T07:03:51.982Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":382.3999938964844,"clientY":217.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-963.8251671239672,"y":-532.5693100072937,"z":-800.495209848439},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":742,"ts":"2026-05-22T07:03:51.982Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-978.365380972196,"y":-556.7365277086309,"z":-765.6547680015786},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":743,"ts":"2026-05-22T07:03:51.989Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":380,"clientY":216.8000030517578,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-978.365380972196,"y":-556.7365277086309,"z":-765.6547680015786},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":744,"ts":"2026-05-22T07:03:51.989Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-995.8075997852393,"y":-568.7424846094094,"z":-733.6762325057022},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":745,"ts":"2026-05-22T07:03:51.997Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":378.3999938964844,"clientY":215.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-995.8075997852393,"y":-568.7424846094094,"z":-733.6762325057022},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":746,"ts":"2026-05-22T07:03:51.997Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1000.6482239902624,"y":-592.5932323509929,"z":-707.7556050858375},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":747,"ts":"2026-05-22T07:03:52.004Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":376,"clientY":214.4000244140625,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1000.6482239902624,"y":-592.5932323509929,"z":-707.7556050858375},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":748,"ts":"2026-05-22T07:03:52.004Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1015.9592731992506,"y":-604.4353352994292,"z":-675.1787055109202},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":749,"ts":"2026-05-22T07:03:52.011Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":375.20001220703125,"clientY":214.4000244140625,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1015.9592731992507,"y":-604.4353352994294,"z":-675.1787055109204},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":750,"ts":"2026-05-22T07:03:52.011Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1022.4505733087328,"y":-604.4353352994294,"z":-665.3077140057791},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":751,"ts":"2026-05-22T07:03:52.018Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":372.8000183105469,"clientY":213.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1022.4505733087328,"y":-604.4353352994294,"z":-665.3077140057791},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":752,"ts":"2026-05-22T07:03:52.018Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1036.3006655735978,"y":-616.2214190144962,"z":-632.2449659846766},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":753,"ts":"2026-05-22T07:03:52.027Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":370.3999938964844,"clientY":212,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1036.3006655735978,"y":-616.2214190144963,"z":-632.2449659846766},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":754,"ts":"2026-05-22T07:03:52.027Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1043.6677927803257,"y":-639.6186301301965,"z":-595.8415477598891},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":755,"ts":"2026-05-22T07:03:52.035Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":369.6000671386719,"clientY":211.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1043.6677927803255,"y":-639.6186301301965,"z":-595.8415477598894},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":756,"ts":"2026-05-22T07:03:52.035Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1043.9306097163155,"y":-651.2277882027208,"z":-582.6601528364539},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":757,"ts":"2026-05-22T07:03:52.042Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":367.20001220703125,"clientY":210.4000244140625,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1043.9306097163148,"y":-651.2277882027206,"z":-582.6601528364541},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":758,"ts":"2026-05-22T07:03:52.042Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1054.7734401058813,"y":-662.7754214733454,"z":-549.1478257004378},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":759,"ts":"2026-05-22T07:03:52.047Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":364.8000183105469,"clientY":209.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1054.773440105881,"y":-662.7754214733453,"z":-549.1478257004377},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":760,"ts":"2026-05-22T07:03:52.047Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1064.4540166489526,"y":-674.2615462824438,"z":-515.4518574786617},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":761,"ts":"2026-05-22T07:03:52.054Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":362.3999938964844,"clientY":208,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1064.4540166489526,"y":-674.2615462824439,"z":-515.4518574786623},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":762,"ts":"2026-05-22T07:03:52.054Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1066.8623563595297,"y":-697.0425470008299,"z":-478.871594466692},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":763,"ts":"2026-05-22T07:03:52.061Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":360.8000183105469,"clientY":207.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1066.8623563595297,"y":-697.0425470008299,"z":-478.871594466692},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":764,"ts":"2026-05-22T07:03:52.061Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1069.6756119532113,"y":-708.335505713788,"z":-455.4519736165385},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":765,"ts":"2026-05-22T07:03:52.067Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":359.20001220703125,"clientY":207.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1069.6756119532113,"y":-708.3355057137882,"z":-455.4519736165385},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":766,"ts":"2026-05-22T07:03:52.067Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1078.296589610221,"y":-708.3355057137882,"z":-434.6479954096691},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":767,"ts":"2026-05-22T07:03:52.075Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":357.6000671386719,"clientY":206.4000244140625,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1078.296589610221,"y":-708.3355057137882,"z":-434.6479954096691},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":768,"ts":"2026-05-22T07:03:52.075Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1080.0507690122038,"y":-719.5615952634774,"z":-411.2214132453612},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":769,"ts":"2026-05-22T07:03:52.082Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":356.8000183105469,"clientY":206.4000244140625,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1080.0507690122038,"y":-719.5615952634776,"z":-411.2214132453612},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":770,"ts":"2026-05-22T07:03:52.082Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1083.982995131729,"y":-719.5615952634776,"z":-400.74128888924184},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":771,"ts":"2026-05-22T07:03:52.089Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":356,"clientY":205.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1083.982995131729,"y":-719.5615952634776,"z":-400.741288889242},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":772,"ts":"2026-05-22T07:03:52.089Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1081.2026097314563,"y":-730.7208313333576,"z":-387.8525326704212},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":773,"ts":"2026-05-22T07:03:52.097Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":355.20001220703125,"clientY":205.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1081.202609731456,"y":-730.7208313333574,"z":-387.8525326704214},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":774,"ts":"2026-05-22T07:03:52.097Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1084.9081636050216,"y":-730.7208313333574,"z":-377.36314993935366},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":775,"ts":"2026-05-22T07:03:52.104Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":355.20001220703125,"clientY":204.8000030517578,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1084.9081636050214,"y":-730.7208313333573,"z":-377.363149939354},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":776,"ts":"2026-05-22T07:03:52.104Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1078.1730898549176,"y":-741.8113119740525,"z":-375.0204920714589},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":777,"ts":"2026-05-22T07:03:52.111Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":354.3999938964844,"clientY":204.8000030517578,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1078.1730898549176,"y":-741.8113119740525,"z":-375.0204920714589},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":778,"ts":"2026-05-22T07:03:52.111Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1081.7546452013432,"y":-741.8113119740525,"z":-364.56065167011013},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":779,"ts":"2026-05-22T07:03:52.138Z","type":"pointer.up","payload":{"pointerId":1,"button":0,"buttons":0,"clientX":354.3999938964844,"clientY":204.8000030517578,"altKey":false,"ctrlKey":false,"hadOrbitDragState":true,"orbitDragMoved":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433428088,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1081.7546452013432,"y":-741.8113119740525,"z":-364.56065167011013},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":780,"ts":"2026-05-22T07:03:52.139Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433432359,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1081.7546452013432,"y":-741.8113119740525,"z":-364.56065167011013},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":781,"ts":"2026-05-22T07:03:53.385Z","type":"pointer.down","payload":{"pointerId":1,"button":0,"buttons":1,"clientX":161.60000610351562,"clientY":104.4000015258789,"altKey":false,"ctrlKey":false,"targetInGraph":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433432459,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1081.7546452013432,"y":-741.8113119740525,"z":-364.56065167011013},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":782,"ts":"2026-05-22T07:03:53.482Z","type":"pointer.up","payload":{"pointerId":1,"button":0,"buttons":0,"clientX":161.60000610351562,"clientY":104.4000015258789,"altKey":false,"ctrlKey":false,"hadOrbitDragState":false,"orbitDragMoved":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433432459,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1081.7546452013432,"y":-741.8113119740525,"z":-364.56065167011013},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":783,"ts":"2026-05-22T07:03:54.650Z","type":"pointer.down","payload":{"pointerId":1,"button":0,"buttons":1,"clientX":179.1999969482422,"clientY":229.1999969482422,"altKey":false,"ctrlKey":false,"targetInGraph":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433432459,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1081.7546452013432,"y":-741.8113119740525,"z":-364.56065167011013},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":784,"ts":"2026-05-22T07:03:54.785Z","type":"pointer.up","payload":{"pointerId":1,"button":0,"buttons":0,"clientX":179.1999969482422,"clientY":229.1999969482422,"altKey":false,"ctrlKey":false,"hadOrbitDragState":false,"orbitDragMoved":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433432459,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1081.7546452013432,"y":-741.8113119740525,"z":-364.56065167011013},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":785,"ts":"2026-05-22T07:03:54.785Z","type":"focus.clear","payload":{"caller":"clear-focused-node-state","previousFocusedNodeId":null},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433432459,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1081.7546452013432,"y":-741.8113119740525,"z":-364.56065167011013},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":786,"ts":"2026-05-22T07:03:54.788Z","type":"cycle.detection","payload":{"cycleNodeCount":0,"cycleEdgeCount":0,"sccCount":0,"cycleNodes":[]},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433432459,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1081.7546452013432,"y":-741.8113119740525,"z":-364.56065167011013},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":787,"ts":"2026-05-22T07:03:54.788Z","type":"edge-label.render-state","payload":{"selectedDiagramId":"flow_0_nexusreader_web_program_cs","readableModeActive":false,"edgeTitlesVisible":true,"focusedNodeId":null,"labeledLinkCount":23,"inlineEdgeTitlesEligible":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433432459,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1081.7546452013432,"y":-741.8113119740525,"z":-364.56065167011013},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":788,"ts":"2026-05-22T07:03:54.788Z","type":"pointer.up","payload":{"pointerId":0,"button":0,"buttons":0,"clientX":0,"clientY":0,"altKey":false,"ctrlKey":false,"hadOrbitDragState":false,"orbitDragMoved":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433432459,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-1081.7546452013432,"y":-741.8113119740525,"z":-364.56065167011013},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":789,"ts":"2026-05-22T07:03:55.811Z","type":"pointer.down","payload":{"pointerId":1,"button":0,"buttons":1,"clientX":272,"clientY":248.40000915527344,"altKey":false,"ctrlKey":false,"targetInGraph":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433432459,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-574.5095371407764,"y":-393.96888691768174,"z":-193.61467240267942},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":790,"ts":"2026-05-22T07:03:55.812Z","type":"controls.start","payload":{"startPosition":{"x":-574.5095371407764,"y":-393.96888691768174,"z":-193.61467240267942},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433432459,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-574.5095371407764,"y":-393.96888691768174,"z":-193.61467240267942},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":791,"ts":"2026-05-22T07:03:56.002Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":272,"clientY":247.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433432459,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-574.5095371407764,"y":-393.96888691768174,"z":-193.61467240267942},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":792,"ts":"2026-05-22T07:03:56.003Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433432459,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-569.0253431431892,"y":-402.7345532235481,"z":-191.76645169337655},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":793,"ts":"2026-05-22T07:03:56.010Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":270.3999938964844,"clientY":247.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433432459,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-569.0253431431893,"y":-402.73455322354823,"z":-191.7664516933766},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":794,"ts":"2026-05-22T07:03:56.011Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433432459,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-572.6329186071806,"y":-402.73455322354823,"z":-180.70903038230955},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":795,"ts":"2026-05-22T07:03:56.019Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":268,"clientY":246.4000244140625,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433432459,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-572.6329186071806,"y":-402.73455322354823,"z":-180.70903038230955},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":796,"ts":"2026-05-22T07:03:56.019Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433432459,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-573.8618905538209,"y":-408.53096610545987,"z":-162.9242578543714},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":797,"ts":"2026-05-22T07:03:56.028Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":267.20001220703125,"clientY":245.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433432459,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-573.8618905538209,"y":-408.53096610546,"z":-162.92425785437158},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":798,"ts":"2026-05-22T07:03:56.028Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433432459,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-571.5693350806037,"y":-414.2893899086478,"z":-156.3078056243537},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":799,"ts":"2026-05-22T07:03:56.032Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":266.3999938964844,"clientY":244.8000030517578,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433432459,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-571.5693350806037,"y":-414.2893899086478,"z":-156.30780562435382},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":800,"ts":"2026-05-22T07:03:56.032Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433432459,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-569.149184362727,"y":-420.0088429834939,"z":-149.73680659534935},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":801,"ts":"2026-05-22T07:03:56.039Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":264.8000183105469,"clientY":244.8000030517578,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433432459,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-569.149184362727,"y":-420.0088429834939,"z":-149.73680659534935},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":802,"ts":"2026-05-22T07:03:56.039Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433432459,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-571.9426135502728,"y":-420.0088429834939,"z":-138.68508252661442},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":803,"ts":"2026-05-22T07:03:56.049Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":264,"clientY":244,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433432459,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-571.9426135502728,"y":-420.0088429834939,"z":-138.68508252661442},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":804,"ts":"2026-05-22T07:03:56.050Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433432459,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-569.2697812740878,"y":-425.6888990406129,"z":-132.21274846325093},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":805,"ts":"2026-05-22T07:03:56.054Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":263.20001220703125,"clientY":244,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433432459,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-569.2697812740878,"y":-425.6888990406129,"z":-132.21274846325093},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":806,"ts":"2026-05-22T07:03:56.055Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433432459,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-570.5235327941772,"y":-425.6888990406129,"z":-126.69330391187238},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":807,"ts":"2026-05-22T07:03:56.062Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":262.3999938964844,"clientY":244,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433432459,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-570.5235327941772,"y":-425.6888990406129,"z":-126.69330391187238},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":808,"ts":"2026-05-22T07:03:56.062Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433432459,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-571.7238157565428,"y":-425.6888990406129,"z":-121.16176469841203},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":809,"ts":"2026-05-22T07:03:56.074Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":260.8000183105469,"clientY":244,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433432459,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-571.7238157565428,"y":-425.6888990406129,"z":-121.16176469841214},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":810,"ts":"2026-05-22T07:03:56.075Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433432459,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-573.9633028043079,"y":-425.6888990406129,"z":-110.06553394239728},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":811,"ts":"2026-05-22T07:03:56.081Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":257.6000671386719,"clientY":243.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433432459,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-573.9633028043079,"y":-425.6888990406129,"z":-110.06553394239728},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":812,"ts":"2026-05-22T07:03:56.082Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433432459,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-573.6923684800064,"y":-431.32902528820114,"z":-87.1302001959984},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":813,"ts":"2026-05-22T07:03:56.089Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":256,"clientY":242.4000244140625,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433432459,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-573.6923684800064,"y":-431.3290252882012,"z":-87.1302001959984},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":814,"ts":"2026-05-22T07:03:56.089Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433432459,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-571.1041918033495,"y":-436.92847984869405,"z":-75.45090520475074},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":815,"ts":"2026-05-22T07:03:56.096Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":252.8000030517578,"clientY":240.8000030517578,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433432459,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-571.1041918033495,"y":-436.92847984869405,"z":-75.45090520475074},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":816,"ts":"2026-05-22T07:03:56.096Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433432459,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-565.0636578847973,"y":-448.0044489023442,"z":-52.48247132160856},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":817,"ts":"2026-05-22T07:03:56.104Z","type":"pointer.move","payload":{"pointerId":1,"buttons":1,"clientX":248,"clientY":240,"altKey":false,"ctrlKey":false,"orbitDragActive":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433432459,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-565.0636578847973,"y":-448.0044489023442,"z":-52.48247132160856},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":818,"ts":"2026-05-22T07:03:56.104Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433432459,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":819,"ts":"2026-05-22T07:03:56.110Z","type":"pointer.up","payload":{"pointerId":1,"button":0,"buttons":0,"clientX":248,"clientY":240,"altKey":false,"ctrlKey":false,"hadOrbitDragState":true,"orbitDragMoved":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433432459,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":820,"ts":"2026-05-22T07:03:56.110Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433436330,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":821,"ts":"2026-05-22T07:03:58.045Z","type":"pointer.down","payload":{"pointerId":1,"button":0,"buttons":1,"clientX":686.4000244140625,"clientY":271.6000061035156,"altKey":false,"ctrlKey":false,"targetInGraph":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":822,"ts":"2026-05-22T07:03:58.045Z","type":"controls.start","payload":{"startPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":823,"ts":"2026-05-22T07:03:58.163Z","type":"pointer.up","payload":{"pointerId":1,"button":0,"buttons":0,"clientX":686.4000244140625,"clientY":271.6000061035156,"altKey":false,"ctrlKey":false,"hadOrbitDragState":true,"orbitDragMoved":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":824,"ts":"2026-05-22T07:03:58.163Z","type":"controls.end","payload":{"changed":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":825,"ts":"2026-05-22T07:03:58.815Z","type":"pointer.down","payload":{"pointerId":1,"button":2,"buttons":2,"clientX":684,"clientY":287.6000061035156,"altKey":false,"ctrlKey":false,"targetInGraph":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":826,"ts":"2026-05-22T07:03:58.816Z","type":"pointerdown.rmb","payload":{"clientX":684,"clientY":287.6000061035156,"hoveredNodeId":null,"selectedNodeId":null},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":827,"ts":"2026-05-22T07:03:58.991Z","type":"pointer.up","payload":{"pointerId":1,"button":2,"buttons":0,"clientX":684,"clientY":287.6000061035156,"altKey":false,"ctrlKey":false,"hadOrbitDragState":false,"orbitDragMoved":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":828,"ts":"2026-05-22T07:03:58.992Z","type":"shortcut.radial.menu.hide","payload":{"hadAnchor":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":829,"ts":"2026-05-22T07:03:58.992Z","type":"context-menu.hide.skip","payload":{"restoreView":false,"reason":"already-hidden"},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":830,"ts":"2026-05-22T07:03:58.992Z","type":"shortcut.radial.menu.hide","payload":{"hadAnchor":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":831,"ts":"2026-05-22T07:03:58.992Z","type":"shortcut.radial.menu.show","payload":{"anchor":{"x":684,"y":287}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":832,"ts":"2026-05-22T07:03:58.995Z","type":"context-menu.hide.skip","payload":{"restoreView":false,"reason":"already-hidden"},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":833,"ts":"2026-05-22T07:03:58.995Z","type":"shortcut.radial.menu.hide","payload":{"hadAnchor":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":834,"ts":"2026-05-22T07:03:58.995Z","type":"shortcut.radial.menu.show","payload":{"anchor":{"x":684,"y":287.6000061035156}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":835,"ts":"2026-05-22T07:03:59.367Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":684,"clientY":286.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":836,"ts":"2026-05-22T07:03:59.375Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":684,"clientY":283.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":837,"ts":"2026-05-22T07:03:59.384Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":684.7999877929688,"clientY":282,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":838,"ts":"2026-05-22T07:03:59.389Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":685.6000366210938,"clientY":276.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":839,"ts":"2026-05-22T07:03:59.397Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":686.4000244140625,"clientY":272.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":840,"ts":"2026-05-22T07:03:59.406Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":688,"clientY":265.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":841,"ts":"2026-05-22T07:03:59.410Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":688.7999877929688,"clientY":257.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":842,"ts":"2026-05-22T07:03:59.419Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":688.7999877929688,"clientY":249.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":843,"ts":"2026-05-22T07:03:59.426Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":688.7999877929688,"clientY":245.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":844,"ts":"2026-05-22T07:03:59.435Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":689.6000366210938,"clientY":240.40000915527344,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":845,"ts":"2026-05-22T07:03:59.440Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":689.6000366210938,"clientY":239.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":846,"ts":"2026-05-22T07:03:59.446Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":689.6000366210938,"clientY":237.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":847,"ts":"2026-05-22T07:03:59.453Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":689.6000366210938,"clientY":236.40000915527344,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":848,"ts":"2026-05-22T07:03:59.468Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":689.6000366210938,"clientY":235.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":849,"ts":"2026-05-22T07:03:59.490Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":689.6000366210938,"clientY":234.8000030517578,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":850,"ts":"2026-05-22T07:03:59.510Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":688.7999877929688,"clientY":234,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":851,"ts":"2026-05-22T07:03:59.563Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":687.2000122070312,"clientY":234,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":852,"ts":"2026-05-22T07:03:59.574Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":686.4000244140625,"clientY":234,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":853,"ts":"2026-05-22T07:03:59.587Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":684.7999877929688,"clientY":235.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":854,"ts":"2026-05-22T07:03:59.596Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":684,"clientY":236.40000915527344,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":855,"ts":"2026-05-22T07:03:59.600Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":682.4000244140625,"clientY":237.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":856,"ts":"2026-05-22T07:03:59.608Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":681.6000366210938,"clientY":238,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":857,"ts":"2026-05-22T07:03:59.617Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":680.7999877929688,"clientY":238.8000030517578,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":858,"ts":"2026-05-22T07:03:59.629Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":679.2000122070312,"clientY":238.8000030517578,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":859,"ts":"2026-05-22T07:03:59.638Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":678.4000244140625,"clientY":238.8000030517578,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":860,"ts":"2026-05-22T07:03:59.643Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":678.4000244140625,"clientY":239.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":861,"ts":"2026-05-22T07:03:59.660Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":677.6000366210938,"clientY":239.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":862,"ts":"2026-05-22T07:03:59.673Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":676.7999877929688,"clientY":239.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":863,"ts":"2026-05-22T07:03:59.703Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":676.7999877929688,"clientY":238.8000030517578,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":864,"ts":"2026-05-22T07:03:59.730Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":676.7999877929688,"clientY":237.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":865,"ts":"2026-05-22T07:03:59.739Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":676.7999877929688,"clientY":235.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":866,"ts":"2026-05-22T07:03:59.743Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":678.4000244140625,"clientY":234,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":867,"ts":"2026-05-22T07:03:59.751Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":680,"clientY":231.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":868,"ts":"2026-05-22T07:03:59.756Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":682.4000244140625,"clientY":228.40000915527344,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":869,"ts":"2026-05-22T07:03:59.763Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":685.6000366210938,"clientY":225.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":870,"ts":"2026-05-22T07:03:59.771Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":687.2000122070312,"clientY":224.40000915527344,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":871,"ts":"2026-05-22T07:03:59.779Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":688.7999877929688,"clientY":222.8000030517578,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":872,"ts":"2026-05-22T07:03:59.786Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":689.6000366210938,"clientY":222.8000030517578,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":873,"ts":"2026-05-22T07:03:59.794Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":692,"clientY":222,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":874,"ts":"2026-05-22T07:03:59.799Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":693.6000366210938,"clientY":222,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":875,"ts":"2026-05-22T07:03:59.806Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":695.2000122070312,"clientY":222,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":876,"ts":"2026-05-22T07:03:59.814Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":696,"clientY":222.8000030517578,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":877,"ts":"2026-05-22T07:03:59.823Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":697.6000366210938,"clientY":222.8000030517578,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":878,"ts":"2026-05-22T07:03:59.830Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":698.4000244140625,"clientY":224.40000915527344,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":879,"ts":"2026-05-22T07:03:59.834Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":699.2000122070312,"clientY":226,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":880,"ts":"2026-05-22T07:03:59.843Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":700,"clientY":227.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":881,"ts":"2026-05-22T07:03:59.852Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":700,"clientY":228.40000915527344,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":882,"ts":"2026-05-22T07:03:59.856Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":701.6000366210938,"clientY":230.8000030517578,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":883,"ts":"2026-05-22T07:03:59.866Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":702.4000244140625,"clientY":233.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":884,"ts":"2026-05-22T07:03:59.872Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":703.2000122070312,"clientY":236.40000915527344,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":885,"ts":"2026-05-22T07:03:59.880Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":705.6000366210938,"clientY":238,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":886,"ts":"2026-05-22T07:03:59.883Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":706.4000244140625,"clientY":238.8000030517578,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":887,"ts":"2026-05-22T07:03:59.891Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":707.2000122070312,"clientY":241.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":888,"ts":"2026-05-22T07:03:59.899Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":708,"clientY":242.8000030517578,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":889,"ts":"2026-05-22T07:03:59.907Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":709.6000366210938,"clientY":244.40000915527344,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":890,"ts":"2026-05-22T07:03:59.912Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":712,"clientY":247.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":891,"ts":"2026-05-22T07:03:59.920Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":716,"clientY":250,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":892,"ts":"2026-05-22T07:03:59.927Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":719.2000122070312,"clientY":253.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":893,"ts":"2026-05-22T07:03:59.936Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":722.4000244140625,"clientY":257.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":894,"ts":"2026-05-22T07:03:59.943Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":727.2000122070312,"clientY":261.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":895,"ts":"2026-05-22T07:03:59.947Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":732,"clientY":266,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":896,"ts":"2026-05-22T07:03:59.956Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":736.7999877929688,"clientY":270,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":897,"ts":"2026-05-22T07:03:59.963Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":740,"clientY":273.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":898,"ts":"2026-05-22T07:03:59.972Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":741.6000366210938,"clientY":274.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":899,"ts":"2026-05-22T07:03:59.977Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":744,"clientY":276.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":900,"ts":"2026-05-22T07:03:59.984Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":744.7999877929688,"clientY":277.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":901,"ts":"2026-05-22T07:03:59.992Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":745.6000366210938,"clientY":277.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":902,"ts":"2026-05-22T07:03:59.999Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":745.6000366210938,"clientY":278,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":903,"ts":"2026-05-22T07:04:00.009Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":746.4000244140625,"clientY":278.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":904,"ts":"2026-05-22T07:04:00.013Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":747.2000122070312,"clientY":278.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":905,"ts":"2026-05-22T07:04:00.022Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":747.2000122070312,"clientY":279.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":906,"ts":"2026-05-22T07:04:00.026Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":748,"clientY":279.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":907,"ts":"2026-05-22T07:04:00.046Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":749.6000366210938,"clientY":279.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":908,"ts":"2026-05-22T07:04:00.084Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":750.4000244140625,"clientY":279.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":909,"ts":"2026-05-22T07:04:00.097Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":751.2000122070312,"clientY":279.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":910,"ts":"2026-05-22T07:04:00.132Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":751.2000122070312,"clientY":278.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":911,"ts":"2026-05-22T07:04:00.160Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":751.2000122070312,"clientY":277.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":912,"ts":"2026-05-22T07:04:00.170Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":750.4000244140625,"clientY":276.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":913,"ts":"2026-05-22T07:04:00.182Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":749.6000366210938,"clientY":275.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":914,"ts":"2026-05-22T07:04:00.190Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":748.7999877929688,"clientY":274.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":915,"ts":"2026-05-22T07:04:00.202Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":746.4000244140625,"clientY":274,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":916,"ts":"2026-05-22T07:04:00.209Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":743.2000122070312,"clientY":272.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":917,"ts":"2026-05-22T07:04:00.218Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":740,"clientY":270,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":918,"ts":"2026-05-22T07:04:00.225Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":733.6000366210938,"clientY":267.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":919,"ts":"2026-05-22T07:04:00.232Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":725.6000366210938,"clientY":262.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":920,"ts":"2026-05-22T07:04:00.239Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":712.7999877929688,"clientY":257.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":921,"ts":"2026-05-22T07:04:00.246Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":696.7999877929688,"clientY":251.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":922,"ts":"2026-05-22T07:04:00.255Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":681.6000366210938,"clientY":243.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":923,"ts":"2026-05-22T07:04:00.259Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":670.4000244140625,"clientY":239.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":924,"ts":"2026-05-22T07:04:00.267Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":663.2000122070312,"clientY":234.8000030517578,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":925,"ts":"2026-05-22T07:04:00.276Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":657.6000366210938,"clientY":233.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":926,"ts":"2026-05-22T07:04:00.284Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":654.4000244140625,"clientY":232.40000915527344,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":927,"ts":"2026-05-22T07:04:00.287Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":652,"clientY":231.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":928,"ts":"2026-05-22T07:04:00.310Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":651.2000122070312,"clientY":231.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":929,"ts":"2026-05-22T07:04:00.330Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":650.4000244140625,"clientY":232.40000915527344,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":930,"ts":"2026-05-22T07:04:00.365Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":650.4000244140625,"clientY":233.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":931,"ts":"2026-05-22T07:04:00.559Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":649.6000366210938,"clientY":233.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":932,"ts":"2026-05-22T07:04:00.563Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":648.7999877929688,"clientY":233.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":933,"ts":"2026-05-22T07:04:00.592Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":647.2000122070312,"clientY":233.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":934,"ts":"2026-05-22T07:04:00.602Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":646.4000244140625,"clientY":233.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":935,"ts":"2026-05-22T07:04:00.613Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":645.6000366210938,"clientY":233.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":936,"ts":"2026-05-22T07:04:00.626Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":644.7999877929688,"clientY":233.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":937,"ts":"2026-05-22T07:04:00.673Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":644,"clientY":232.40000915527344,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":938,"ts":"2026-05-22T07:04:00.677Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":643.2000122070312,"clientY":232.40000915527344,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":939,"ts":"2026-05-22T07:04:00.692Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":642.4000244140625,"clientY":231.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":940,"ts":"2026-05-22T07:04:00.713Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":642.4000244140625,"clientY":230.8000030517578,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":941,"ts":"2026-05-22T07:04:00.729Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":641.6000366210938,"clientY":230.8000030517578,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":942,"ts":"2026-05-22T07:04:00.742Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":640.7999877929688,"clientY":230.8000030517578,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":943,"ts":"2026-05-22T07:04:00.783Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":640.7999877929688,"clientY":229.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":944,"ts":"2026-05-22T07:04:00.904Z","type":"pointer.down","payload":{"pointerId":1,"button":0,"buttons":1,"clientX":640.7999877929688,"clientY":229.1999969482422,"altKey":false,"ctrlKey":false,"targetInGraph":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":945,"ts":"2026-05-22T07:04:00.904Z","type":"shortcut.radial.menu.action.pointerdown","payload":{"actionKey":"dag-layout","disabled":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433436430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":946,"ts":"2026-05-22T07:04:00.905Z","type":"focus.node-click.suppressed-window","payload":{"duration":420,"suppressNodeClickUntil":1779433441325},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441325,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":947,"ts":"2026-05-22T07:04:01.002Z","type":"pointer.up","payload":{"pointerId":1,"button":0,"buttons":0,"clientX":640.7999877929688,"clientY":229.1999969482422,"altKey":false,"ctrlKey":false,"hadOrbitDragState":false,"orbitDragMoved":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441325,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":948,"ts":"2026-05-22T07:04:01.002Z","type":"focus.node-click.suppressed-window","payload":{"duration":520,"suppressNodeClickUntil":1779433441522},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":949,"ts":"2026-05-22T07:04:01.002Z","type":"shortcut.radial.menu.action.run","payload":{"actionKey":"dag-layout"},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":950,"ts":"2026-05-22T07:04:01.002Z","type":"layout.set","payload":{"previousMode":"force","nextMode":"dag"},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":951,"ts":"2026-05-22T07:04:01.004Z","type":"cycle.detection","payload":{"cycleNodeCount":0,"cycleEdgeCount":0,"sccCount":0,"cycleNodes":[]},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":952,"ts":"2026-05-22T07:04:01.004Z","type":"edge-label.render-state","payload":{"selectedDiagramId":"flow_0_nexusreader_web_program_cs","readableModeActive":false,"edgeTitlesVisible":true,"focusedNodeId":null,"labeledLinkCount":23,"inlineEdgeTitlesEligible":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":953,"ts":"2026-05-22T07:04:01.004Z","type":"pointer.up","payload":{"pointerId":0,"button":0,"buttons":0,"clientX":0,"clientY":0,"altKey":false,"ctrlKey":false,"hadOrbitDragState":false,"orbitDragMoved":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":954,"ts":"2026-05-22T07:04:01.005Z","type":"shortcut.radial.menu.action.done","payload":{"actionKey":"dag-layout"},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.7950112849625,"y":-453.47960445111295,"z":-19.42568181776577},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":955,"ts":"2026-05-22T07:04:01.298Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":640,"clientY":230,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.6687907271288,"y":-452.5721371799921,"z":-19.38680869029587},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":956,"ts":"2026-05-22T07:04:01.308Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":637.6000366210938,"clientY":232.40000915527344,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.6270618307868,"y":-452.5385135638835,"z":-19.385368357231982},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":957,"ts":"2026-05-22T07:04:01.316Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":635.2000122070312,"clientY":234.8000030517578,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.5927302947738,"y":-452.5108504697564,"z":-19.384183354732787},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":958,"ts":"2026-05-22T07:04:01.320Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":632.7999877929688,"clientY":237.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.5752059894139,"y":-452.49673002642714,"z":-19.383578478049145},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":959,"ts":"2026-05-22T07:04:01.328Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":630.4000244140625,"clientY":239.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.5418095605037,"y":-452.46982040734986,"z":-19.382425752120785},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":960,"ts":"2026-05-22T07:04:01.336Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":627.2000122070312,"clientY":242,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.5146207151231,"y":-452.4479126316918,"z":-19.38148728989428},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":961,"ts":"2026-05-22T07:04:01.341Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":624.7999877929688,"clientY":244.40000915527344,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.500264297967,"y":-452.43634475663475,"z":-19.380991757442633},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":962,"ts":"2026-05-22T07:04:01.349Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":620.7999877929688,"clientY":246.8000030517578,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.4698635399831,"y":-452.411848939456,"z":-19.379942431418463},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":963,"ts":"2026-05-22T07:04:01.356Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":618.4000244140625,"clientY":249.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.4475543840713,"y":-452.3938730388249,"z":-19.379172398714413},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":964,"ts":"2026-05-22T07:04:01.365Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":616.7999877929688,"clientY":250.8000030517578,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.4226703255986,"y":-452.37382237603106,"z":-19.378313489533394},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":965,"ts":"2026-05-22T07:04:01.371Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":615.2000122070312,"clientY":252.40000915527344,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.4026961767559,"y":-452.357727938563,"z":-19.37762405296729},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":966,"ts":"2026-05-22T07:04:01.376Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":614.4000244140625,"clientY":252.40000915527344,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.3833143420464,"y":-452.3421107661267,"z":-19.376955060978094},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":967,"ts":"2026-05-22T07:04:01.385Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":613.6000366210938,"clientY":254,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.3589743947892,"y":-452.322498528219,"z":-19.37611493258072},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":968,"ts":"2026-05-22T07:04:01.393Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":612.7999877929688,"clientY":254.8000030517578,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.3328606390679,"y":-452.301457020427,"z":-19.37521357862495},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":969,"ts":"2026-05-22T07:04:01.416Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":611.2000122070312,"clientY":255.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.275048451515,"y":-452.2548740774047,"z":-19.373218107559868},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":970,"ts":"2026-05-22T07:04:01.422Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":611.2000122070312,"clientY":256.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.2637523240802,"y":-452.2457720717041,"z":-19.372828205423353},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":971,"ts":"2026-05-22T07:04:01.429Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":610.4000244140625,"clientY":256.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.241259012001,"y":-452.22764778477915,"z":-19.372051816303482},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":972,"ts":"2026-05-22T07:04:01.434Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":609.6000366210938,"clientY":256.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.2329227390107,"y":-452.22093072136806,"z":-19.37176407781361},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":973,"ts":"2026-05-22T07:04:01.462Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":608.7999877929688,"clientY":256.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.1774436931217,"y":-452.1762277384336,"z":-19.369849138499323},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":974,"ts":"2026-05-22T07:04:01.498Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":608.7999877929688,"clientY":255.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.1235781025533,"y":-452.1328248186943,"z":-19.36798988992333},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":975,"ts":"2026-05-22T07:04:01.528Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":608.7999877929688,"clientY":254.8000030517578,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0959994550435,"y":-452.1106029547594,"z":-19.36703797311393},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":976,"ts":"2026-05-22T07:04:01.543Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":608.7999877929688,"clientY":253.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.085439653586,"y":-452.1020942535591,"z":-19.366673486330892},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":977,"ts":"2026-05-22T07:04:01.555Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":608.7999877929688,"clientY":252.40000915527344,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0798737810924,"y":-452.09760947738613,"z":-19.366481372211307},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":978,"ts":"2026-05-22T07:04:01.564Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":608.7999877929688,"clientY":251.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0775695910627,"y":-452.0957528454646,"z":-19.366401839767935},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":979,"ts":"2026-05-22T07:04:01.572Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":609.6000366210938,"clientY":251.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0761096986433,"y":-452.0945765176302,"z":-19.366351449474745},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":980,"ts":"2026-05-22T07:04:01.577Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":609.6000366210938,"clientY":250.8000030517578,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758695047407,"y":-452.0943829781819,"z":-19.36634315883564},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":981,"ts":"2026-05-22T07:04:01.586Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":610.4000244140625,"clientY":250,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.0943454006253,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":982,"ts":"2026-05-22T07:04:01.591Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":611.2000122070312,"clientY":249.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":983,"ts":"2026-05-22T07:04:01.599Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":611.2000122070312,"clientY":248.40000915527344,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":984,"ts":"2026-05-22T07:04:01.604Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":611.2000122070312,"clientY":247.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":985,"ts":"2026-05-22T07:04:01.615Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":612,"clientY":246.8000030517578,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":986,"ts":"2026-05-22T07:04:01.636Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":612.7999877929688,"clientY":245.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":987,"ts":"2026-05-22T07:04:01.652Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":612.7999877929688,"clientY":244.40000915527344,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":988,"ts":"2026-05-22T07:04:01.656Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":613.6000366210938,"clientY":243.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":989,"ts":"2026-05-22T07:04:01.667Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":613.6000366210938,"clientY":242.8000030517578,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":990,"ts":"2026-05-22T07:04:01.691Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":614.4000244140625,"clientY":240.40000915527344,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":991,"ts":"2026-05-22T07:04:01.707Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":615.2000122070312,"clientY":239.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":992,"ts":"2026-05-22T07:04:01.712Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":615.2000122070312,"clientY":238,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":993,"ts":"2026-05-22T07:04:01.720Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":615.2000122070312,"clientY":237.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":994,"ts":"2026-05-22T07:04:01.729Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":615.2000122070312,"clientY":236.40000915527344,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":995,"ts":"2026-05-22T07:04:01.738Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":615.2000122070312,"clientY":235.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":996,"ts":"2026-05-22T07:04:01.742Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":616,"clientY":234.8000030517578,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":997,"ts":"2026-05-22T07:04:01.763Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":616.7999877929688,"clientY":233.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":998,"ts":"2026-05-22T07:04:01.771Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":617.6000366210938,"clientY":231.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":999,"ts":"2026-05-22T07:04:01.785Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":618.4000244140625,"clientY":230.8000030517578,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1000,"ts":"2026-05-22T07:04:01.792Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":618.4000244140625,"clientY":229.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1001,"ts":"2026-05-22T07:04:01.801Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":619.2000122070312,"clientY":229.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1002,"ts":"2026-05-22T07:04:01.805Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":619.2000122070312,"clientY":228.40000915527344,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1003,"ts":"2026-05-22T07:04:01.812Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":619.2000122070312,"clientY":227.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1004,"ts":"2026-05-22T07:04:01.820Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":619.2000122070312,"clientY":226.8000030517578,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1005,"ts":"2026-05-22T07:04:01.836Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":620,"clientY":226.8000030517578,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1006,"ts":"2026-05-22T07:04:01.858Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":620.7999877929688,"clientY":225.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1007,"ts":"2026-05-22T07:04:01.869Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":621.6000366210938,"clientY":225.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1008,"ts":"2026-05-22T07:04:01.891Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":621.6000366210938,"clientY":224.40000915527344,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1009,"ts":"2026-05-22T07:04:01.898Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":622.4000244140625,"clientY":224.40000915527344,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1010,"ts":"2026-05-22T07:04:01.908Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":622.4000244140625,"clientY":223.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1011,"ts":"2026-05-22T07:04:01.920Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":623.2000122070312,"clientY":223.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1012,"ts":"2026-05-22T07:04:01.978Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":623.2000122070312,"clientY":222.8000030517578,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1013,"ts":"2026-05-22T07:04:02.101Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":624,"clientY":222.8000030517578,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1014,"ts":"2026-05-22T07:04:02.145Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":625.6000366210938,"clientY":222,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1015,"ts":"2026-05-22T07:04:02.149Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":625.6000366210938,"clientY":221.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1016,"ts":"2026-05-22T07:04:02.158Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":626.4000244140625,"clientY":221.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1017,"ts":"2026-05-22T07:04:02.166Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":626.4000244140625,"clientY":220.40000915527344,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1018,"ts":"2026-05-22T07:04:02.171Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":627.2000122070312,"clientY":220.40000915527344,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1019,"ts":"2026-05-22T07:04:02.178Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":627.2000122070312,"clientY":219.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1020,"ts":"2026-05-22T07:04:02.186Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":628,"clientY":219.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1021,"ts":"2026-05-22T07:04:02.205Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":628.7999877929688,"clientY":220.40000915527344,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1022,"ts":"2026-05-22T07:04:02.214Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":628.7999877929688,"clientY":221.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1023,"ts":"2026-05-22T07:04:02.221Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":628.7999877929688,"clientY":223.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1024,"ts":"2026-05-22T07:04:02.229Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":629.6000366210938,"clientY":225.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1025,"ts":"2026-05-22T07:04:02.237Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":629.6000366210938,"clientY":227.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1026,"ts":"2026-05-22T07:04:02.244Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":629.6000366210938,"clientY":230,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1027,"ts":"2026-05-22T07:04:02.252Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":630.4000244140625,"clientY":231.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1028,"ts":"2026-05-22T07:04:02.256Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":630.4000244140625,"clientY":233.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1029,"ts":"2026-05-22T07:04:02.265Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":631.2000122070312,"clientY":234.8000030517578,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1030,"ts":"2026-05-22T07:04:02.272Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":631.2000122070312,"clientY":235.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1031,"ts":"2026-05-22T07:04:02.281Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":631.2000122070312,"clientY":236.40000915527344,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1032,"ts":"2026-05-22T07:04:02.284Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":631.2000122070312,"clientY":237.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1033,"ts":"2026-05-22T07:04:02.299Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":631.2000122070312,"clientY":238,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1034,"ts":"2026-05-22T07:04:02.361Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":631.2000122070312,"clientY":239.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1035,"ts":"2026-05-22T07:04:02.377Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":632,"clientY":241.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1036,"ts":"2026-05-22T07:04:02.384Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":632,"clientY":242.8000030517578,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1037,"ts":"2026-05-22T07:04:02.392Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":633.6000366210938,"clientY":246,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1038,"ts":"2026-05-22T07:04:02.400Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":634.4000244140625,"clientY":249.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1039,"ts":"2026-05-22T07:04:02.409Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":634.4000244140625,"clientY":251.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1040,"ts":"2026-05-22T07:04:02.415Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":635.2000122070312,"clientY":253.1999969482422,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1041,"ts":"2026-05-22T07:04:02.423Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":636,"clientY":254,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1042,"ts":"2026-05-22T07:04:02.445Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":636,"clientY":255.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1043,"ts":"2026-05-22T07:04:02.538Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":635.2000122070312,"clientY":255.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1044,"ts":"2026-05-22T07:04:02.542Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":635.2000122070312,"clientY":256.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1045,"ts":"2026-05-22T07:04:02.559Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":634.4000244140625,"clientY":257.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1046,"ts":"2026-05-22T07:04:02.564Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":633.6000366210938,"clientY":258,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1047,"ts":"2026-05-22T07:04:02.572Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":632.7999877929688,"clientY":258,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1048,"ts":"2026-05-22T07:04:02.581Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":632,"clientY":259.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1049,"ts":"2026-05-22T07:04:02.586Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":631.2000122070312,"clientY":260.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1050,"ts":"2026-05-22T07:04:02.594Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":630.4000244140625,"clientY":261.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1051,"ts":"2026-05-22T07:04:02.602Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":628.7999877929688,"clientY":261.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1052,"ts":"2026-05-22T07:04:02.615Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":628,"clientY":262,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1053,"ts":"2026-05-22T07:04:02.628Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":627.2000122070312,"clientY":263.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1054,"ts":"2026-05-22T07:04:02.644Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":626.4000244140625,"clientY":263.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1055,"ts":"2026-05-22T07:04:02.651Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":625.6000366210938,"clientY":263.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1056,"ts":"2026-05-22T07:04:02.659Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":624.7999877929688,"clientY":263.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1057,"ts":"2026-05-22T07:04:02.664Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":624.7999877929688,"clientY":264.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1058,"ts":"2026-05-22T07:04:02.702Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":623.2000122070312,"clientY":264.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1059,"ts":"2026-05-22T07:04:02.716Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":622.4000244140625,"clientY":265.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1060,"ts":"2026-05-22T07:04:02.724Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":621.6000366210938,"clientY":265.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1061,"ts":"2026-05-22T07:04:02.729Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":620.7999877929688,"clientY":265.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1062,"ts":"2026-05-22T07:04:02.745Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":619.2000122070312,"clientY":265.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1063,"ts":"2026-05-22T07:04:02.750Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":619.2000122070312,"clientY":266,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1064,"ts":"2026-05-22T07:04:02.758Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":617.6000366210938,"clientY":266,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1065,"ts":"2026-05-22T07:04:02.767Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":616.7999877929688,"clientY":266.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1066,"ts":"2026-05-22T07:04:02.779Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":616.7999877929688,"clientY":267.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1067,"ts":"2026-05-22T07:04:02.797Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":615.2000122070312,"clientY":267.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1068,"ts":"2026-05-22T07:04:02.801Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":614.4000244140625,"clientY":267.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1069,"ts":"2026-05-22T07:04:02.814Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":614.4000244140625,"clientY":268.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1070,"ts":"2026-05-22T07:04:02.831Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":613.6000366210938,"clientY":268.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1071,"ts":"2026-05-22T07:04:02.838Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":613.6000366210938,"clientY":269.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1072,"ts":"2026-05-22T07:04:02.844Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":612.7999877929688,"clientY":269.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1073,"ts":"2026-05-22T07:04:02.874Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":612,"clientY":270,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1074,"ts":"2026-05-22T07:04:02.878Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":611.2000122070312,"clientY":270,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1075,"ts":"2026-05-22T07:04:02.900Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":610.4000244140625,"clientY":270,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1076,"ts":"2026-05-22T07:04:03.094Z","type":"pointer.down","payload":{"pointerId":1,"button":0,"buttons":1,"clientX":610.4000244140625,"clientY":270,"altKey":false,"ctrlKey":false,"targetInGraph":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1077,"ts":"2026-05-22T07:04:03.094Z","type":"shortcut.radial.menu.action.pointerdown","payload":{"actionKey":"force-layout","disabled":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433441522,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1078,"ts":"2026-05-22T07:04:03.094Z","type":"focus.node-click.suppressed-window","payload":{"duration":420,"suppressNodeClickUntil":1779433443514},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443514,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1079,"ts":"2026-05-22T07:04:03.200Z","type":"pointer.up","payload":{"pointerId":1,"button":0,"buttons":0,"clientX":610.4000244140625,"clientY":270,"altKey":false,"ctrlKey":false,"hadOrbitDragState":false,"orbitDragMoved":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443514,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1080,"ts":"2026-05-22T07:04:03.200Z","type":"focus.node-click.suppressed-window","payload":{"duration":520,"suppressNodeClickUntil":1779433443720},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1081,"ts":"2026-05-22T07:04:03.200Z","type":"shortcut.radial.menu.action.run","payload":{"actionKey":"force-layout"},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1082,"ts":"2026-05-22T07:04:03.200Z","type":"layout.set","payload":{"previousMode":"dag","nextMode":"force"},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1083,"ts":"2026-05-22T07:04:03.202Z","type":"cycle.detection","payload":{"cycleNodeCount":0,"cycleEdgeCount":0,"sccCount":0,"cycleNodes":[]},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1084,"ts":"2026-05-22T07:04:03.202Z","type":"edge-label.render-state","payload":{"selectedDiagramId":"flow_0_nexusreader_web_program_cs","readableModeActive":false,"edgeTitlesVisible":true,"focusedNodeId":null,"labeledLinkCount":23,"inlineEdgeTitlesEligible":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1085,"ts":"2026-05-22T07:04:03.202Z","type":"pointer.up","payload":{"pointerId":0,"button":0,"buttons":0,"clientX":0,"clientY":0,"altKey":false,"ctrlKey":false,"hadOrbitDragState":false,"orbitDragMoved":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1086,"ts":"2026-05-22T07:04:03.203Z","type":"shortcut.radial.menu.action.done","payload":{"actionKey":"force-layout"},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-561.0758228687702,"y":-452.09434540062534,"z":-19.366341549127835},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1087,"ts":"2026-05-22T07:04:03.457Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":582.4000244140625,"clientY":277.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-592.0242975255451,"y":-477.0314926110746,"z":-20.434572804509894},"cameraTarget":{"x":0.03743640921740621,"y":0.03016488722104782,"z":0.0012921716775640135}}} +{"seq":1088,"ts":"2026-05-22T07:04:03.464Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":531.2000122070312,"clientY":286.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-593.4812175599283,"y":-478.2054254066063,"z":-20.48486050154765},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1089,"ts":"2026-05-22T07:04:03.472Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":503.20001220703125,"clientY":290,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-594.5679653493667,"y":-479.0810869668739,"z":-20.52237116946489},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1090,"ts":"2026-05-22T07:04:03.478Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":482.3999938964844,"clientY":293.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-595.2196232455377,"y":-479.60616902884595,"z":-20.54486408196628},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1091,"ts":"2026-05-22T07:04:03.488Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":462.3999938964844,"clientY":294,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-596.6939132683668,"y":-480.7940979247903,"z":-20.595751329216746},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1092,"ts":"2026-05-22T07:04:03.497Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":440,"clientY":295.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_type_nexusreader_web_program_cs_knowledgecoordinator_55","cameraPosition":{"x":-597.9938268702389,"y":-481.84152068827876,"z":-20.640619722706766},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1093,"ts":"2026-05-22T07:04:03.501Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":420,"clientY":297.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_type_nexusreader_web_program_cs_knowledgecoordinator_55","cameraPosition":{"x":-598.863850343698,"y":-482.5425537335195,"z":-20.67064983816713},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1094,"ts":"2026-05-22T07:04:03.511Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":400,"clientY":299.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_type_nexusreader_web_program_cs_knowledgecoordinator_55","cameraPosition":{"x":-599.8187112654829,"y":-483.311945686956,"z":-20.70360824056032},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1095,"ts":"2026-05-22T07:04:03.517Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":382.3999938964844,"clientY":301.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_type_nexusreader_web_program_cs_knowledgecoordinator_55","cameraPosition":{"x":-600.684516799177,"y":-484.0095800708408,"z":-20.733492767744035},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1096,"ts":"2026-05-22T07:04:03.521Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":367.20001220703125,"clientY":303.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_type_nexusreader_web_program_cs_knowledgecoordinator_55","cameraPosition":{"x":-601.5035220352285,"y":-484.6695044892183,"z":-20.761761915130922},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1097,"ts":"2026-05-22T07:04:03.531Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":356.8000183105469,"clientY":304.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_type_nexusreader_web_program_cs_knowledgecoordinator_55","cameraPosition":{"x":-602.495245337227,"y":-485.4685987983317,"z":-20.7959926757624},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1098,"ts":"2026-05-22T07:04:03.537Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":352.8000183105469,"clientY":304.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_type_nexusreader_web_program_cs_knowledgecoordinator_55","cameraPosition":{"x":-603.0796189500419,"y":-485.9394656494538,"z":-20.816163174145682},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1099,"ts":"2026-05-22T07:04:03.545Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":351.20001220703125,"clientY":304.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_type_nexusreader_web_program_cs_knowledgecoordinator_55","cameraPosition":{"x":-604.1451280690262,"y":-486.79801386705947,"z":-20.852940758708947},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1100,"ts":"2026-05-22T07:04:03.551Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":350.3999938964844,"clientY":304.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-604.7068684310215,"y":-487.25064367374557,"z":-20.872330037784824},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1101,"ts":"2026-05-22T07:04:03.564Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":350.3999938964844,"clientY":305.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-606.0997622755989,"y":-488.3729865108635,"z":-20.920407778504146},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1102,"ts":"2026-05-22T07:04:03.603Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":351.20001220703125,"clientY":305.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-609.9020118213699,"y":-491.43669991533005,"z":-21.051647907479797},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1103,"ts":"2026-05-22T07:04:03.608Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":352,"clientY":305.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-610.3306221594132,"y":-491.7820584253776,"z":-21.066442011698356},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1104,"ts":"2026-05-22T07:04:03.614Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":353.6000061035156,"clientY":305.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-610.7304567378136,"y":-492.1042304823845,"z":-21.080242879055042},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1105,"ts":"2026-05-22T07:04:03.621Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":356.8000183105469,"clientY":305.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-611.3733319470799,"y":-492.6222357769657,"z":-21.102432644446218},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1106,"ts":"2026-05-22T07:04:03.630Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":358.3999938964844,"clientY":304.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-611.9905991224318,"y":-493.11960705586193,"z":-21.123738511599445},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1107,"ts":"2026-05-22T07:04:03.638Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":362.3999938964844,"clientY":303.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-612.6014917662792,"y":-493.61184197077614,"z":-21.14482435260059},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1108,"ts":"2026-05-22T07:04:03.642Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":367.20001220703125,"clientY":302,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-612.902963164446,"y":-493.8547565802746,"z":-21.15523007287265},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1109,"ts":"2026-05-22T07:04:03.652Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":372,"clientY":299.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-613.4577599263241,"y":-494.3017914883362,"z":-21.174379683572234},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1110,"ts":"2026-05-22T07:04:03.657Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":375.20001220703125,"clientY":298,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_type_nexusreader_web_program_cs_identity_with_appdbcontext_107","cameraPosition":{"x":-613.8070842770139,"y":-494.5832642540849,"z":-21.18643711754309},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1111,"ts":"2026-05-22T07:04:03.664Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":380,"clientY":296.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_type_nexusreader_web_program_cs_identity_with_appdbcontext_107","cameraPosition":{"x":-614.2509568567681,"y":-494.9409205194346,"z":-21.201758020054733},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1112,"ts":"2026-05-22T07:04:03.674Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":383.20001220703125,"clientY":294,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_type_nexusreader_web_program_cs_identity_with_appdbcontext_107","cameraPosition":{"x":-614.7614933637143,"y":-495.3522921353614,"z":-21.21937992419643},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1113,"ts":"2026-05-22T07:04:03.680Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":388,"clientY":290.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_type_nexusreader_web_program_cs_identity_with_appdbcontext_107","cameraPosition":{"x":-615.0019206805482,"y":-495.5460196602166,"z":-21.22767861992661},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1114,"ts":"2026-05-22T07:04:03.691Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":395.20001220703125,"clientY":288.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_type_nexusreader_web_program_cs_identity_with_appdbcontext_107","cameraPosition":{"x":-615.4173130245355,"y":-495.8807275948397,"z":-21.24201648600934},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1115,"ts":"2026-05-22T07:04:03.694Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":403.20001220703125,"clientY":283.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_type_nexusreader_web_program_cs_identity_with_appdbcontext_107","cameraPosition":{"x":-615.7133184444956,"y":-496.1192379193225,"z":-21.252233540157263},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1116,"ts":"2026-05-22T07:04:03.703Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":412,"clientY":280.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_type_nexusreader_web_program_cs_identity_with_appdbcontext_107","cameraPosition":{"x":-615.9919880685648,"y":-496.34377969450077,"z":-21.261852224297844},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1117,"ts":"2026-05-22T07:04:03.707Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":423.20001220703125,"clientY":274.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_type_nexusreader_web_program_cs_nexusreader_infrastructure_assembly_extension_79","cameraPosition":{"x":-616.201541647083,"y":-496.5126302919515,"z":-21.269085268405277},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1118,"ts":"2026-05-22T07:04:03.717Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":431.20001220703125,"clientY":270.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_type_nexusreader_web_program_cs_nexusreader_infrastructure_assembly_extension_79","cameraPosition":{"x":-616.4417320567404,"y":-496.70616692568206,"z":-21.27737578694245},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1119,"ts":"2026-05-22T07:04:03.721Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":438.3999938964844,"clientY":266.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_type_nexusreader_web_program_cs_nexusreader_infrastructure_assembly_extension_79","cameraPosition":{"x":-616.6060533242655,"y":-496.8385709838311,"z":-21.283047572574567},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1120,"ts":"2026-05-22T07:04:03.731Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":444.8000183105469,"clientY":264.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_type_nexusreader_web_program_cs_nexusreader_infrastructure_assembly_extension_79","cameraPosition":{"x":-616.8239890458315,"y":-497.0141756051049,"z":-21.290569938443088},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1121,"ts":"2026-05-22T07:04:03.734Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":448.8000183105469,"clientY":262.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_type_nexusreader_web_program_cs_nexusreader_infrastructure_assembly_extension_79","cameraPosition":{"x":-616.914668594409,"y":-497.0872418636826,"z":-21.29369987389512},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1122,"ts":"2026-05-22T07:04:03.742Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":451.20001220703125,"clientY":261.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_type_nexusreader_web_program_cs_nexusreader_infrastructure_assembly_extension_79","cameraPosition":{"x":-617.0500724451737,"y":-497.19634532667476,"z":-21.29837353316557},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1123,"ts":"2026-05-22T07:04:03.751Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":454.3999938964844,"clientY":259.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_type_nexusreader_web_program_cs_nexusreader_infrastructure_assembly_extension_79","cameraPosition":{"x":-617.1811777608882,"y":-497.3019851875824,"z":-21.302898822296815},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1124,"ts":"2026-05-22T07:04:03.760Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":456.8000183105469,"clientY":258.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_321","cameraPosition":{"x":-617.2786201748476,"y":-497.3805007153554,"z":-21.306262187804993},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1125,"ts":"2026-05-22T07:04:03.768Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":457.6000061035156,"clientY":258.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_321","cameraPosition":{"x":-617.3245729787697,"y":-497.4175278014669,"z":-21.30784831513328},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1126,"ts":"2026-05-22T07:04:03.772Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":460,"clientY":257.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_321","cameraPosition":{"x":-617.342824655869,"y":-497.4322343342997,"z":-21.30847829810197},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1127,"ts":"2026-05-22T07:04:03.782Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":461.6000061035156,"clientY":256.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_321","cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1128,"ts":"2026-05-22T07:04:03.786Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":462.3999938964844,"clientY":256.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_321","cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1129,"ts":"2026-05-22T07:04:03.795Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":463.20001220703125,"clientY":255.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_321","cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1130,"ts":"2026-05-22T07:04:03.800Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":464,"clientY":255.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_321","cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1131,"ts":"2026-05-22T07:04:03.807Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":464,"clientY":254.8000030517578,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_321","cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1132,"ts":"2026-05-22T07:04:03.836Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":465.6000061035156,"clientY":254,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_321","cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1133,"ts":"2026-05-22T07:04:04.000Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":464.8000183105469,"clientY":255.60000610351562,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_321","cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1134,"ts":"2026-05-22T07:04:04.038Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":464,"clientY":256.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_321","cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1135,"ts":"2026-05-22T07:04:04.043Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":463.20001220703125,"clientY":257.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_321","cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1136,"ts":"2026-05-22T07:04:04.051Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":462.3999938964844,"clientY":258,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_321","cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1137,"ts":"2026-05-22T07:04:04.060Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":461.6000061035156,"clientY":258.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_321","cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1138,"ts":"2026-05-22T07:04:04.070Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":459.20001220703125,"clientY":261.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_321","cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1139,"ts":"2026-05-22T07:04:04.073Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":455.20001220703125,"clientY":266,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_321","cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1140,"ts":"2026-05-22T07:04:04.083Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":448.8000183105469,"clientY":273.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_321","cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1141,"ts":"2026-05-22T07:04:04.086Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":442.3999938964844,"clientY":281.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_321","cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1142,"ts":"2026-05-22T07:04:04.094Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":438.3999938964844,"clientY":286,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_321","cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1143,"ts":"2026-05-22T07:04:04.100Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":436,"clientY":290,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_321","cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1144,"ts":"2026-05-22T07:04:04.107Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":434.3999938964844,"clientY":292.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_321","cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1145,"ts":"2026-05-22T07:04:04.115Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":433.6000061035156,"clientY":294,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_321","cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1146,"ts":"2026-05-22T07:04:04.123Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":432.8000183105469,"clientY":294.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_type_nexusreader_web_program_cs_knowledgecoordinator_55","cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1147,"ts":"2026-05-22T07:04:04.128Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":432,"clientY":295.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_type_nexusreader_web_program_cs_knowledgecoordinator_55","cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1148,"ts":"2026-05-22T07:04:04.136Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":432,"clientY":296.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_type_nexusreader_web_program_cs_knowledgecoordinator_55","cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1149,"ts":"2026-05-22T07:04:04.144Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":432,"clientY":297.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_type_nexusreader_web_program_cs_knowledgecoordinator_55","cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1150,"ts":"2026-05-22T07:04:04.157Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":432,"clientY":298,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_type_nexusreader_web_program_cs_knowledgecoordinator_55","cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1151,"ts":"2026-05-22T07:04:04.164Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":431.20001220703125,"clientY":298.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_type_nexusreader_web_program_cs_knowledgecoordinator_55","cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1152,"ts":"2026-05-22T07:04:04.181Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":430.3999938964844,"clientY":299.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_type_nexusreader_web_program_cs_knowledgecoordinator_55","cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1153,"ts":"2026-05-22T07:04:04.193Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":430.3999938964844,"clientY":300.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_type_nexusreader_web_program_cs_knowledgecoordinator_55","cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1154,"ts":"2026-05-22T07:04:04.200Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":430.3999938964844,"clientY":301.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_type_nexusreader_web_program_cs_knowledgecoordinator_55","cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1155,"ts":"2026-05-22T07:04:04.217Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":430.3999938964844,"clientY":302,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_type_nexusreader_web_program_cs_knowledgecoordinator_55","cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1156,"ts":"2026-05-22T07:04:04.236Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":430.3999938964844,"clientY":303.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_type_nexusreader_web_program_cs_knowledgecoordinator_55","cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1157,"ts":"2026-05-22T07:04:04.251Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":431.20001220703125,"clientY":303.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_type_nexusreader_web_program_cs_knowledgecoordinator_55","cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1158,"ts":"2026-05-22T07:04:04.260Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":432,"clientY":303.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_type_nexusreader_web_program_cs_knowledgecoordinator_55","cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1159,"ts":"2026-05-22T07:04:04.268Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":434.3999938964844,"clientY":303.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_type_nexusreader_web_program_cs_knowledgecoordinator_55","cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1160,"ts":"2026-05-22T07:04:04.273Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":439.20001220703125,"clientY":304.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_type_nexusreader_web_program_cs_knowledgecoordinator_55","cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1161,"ts":"2026-05-22T07:04:04.281Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":460,"clientY":305.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_type_nexusreader_web_program_cs_knowledgecoordinator_55","cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1162,"ts":"2026-05-22T07:04:04.289Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":499.20001220703125,"clientY":310.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_type_nexusreader_web_program_cs_knowledgecoordinator_55","cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1163,"ts":"2026-05-22T07:04:04.294Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":525.6000366210938,"clientY":315.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_type_nexusreader_web_program_cs_knowledgecoordinator_55","cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1164,"ts":"2026-05-22T07:04:04.301Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":535.2000122070312,"clientY":318.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_type_nexusreader_web_program_cs_knowledgecoordinator_55","cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1165,"ts":"2026-05-22T07:04:04.310Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":540.7999877929688,"clientY":321.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_type_nexusreader_web_program_cs_knowledgecoordinator_55","cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1166,"ts":"2026-05-22T07:04:04.314Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":545.6000366210938,"clientY":323.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_type_nexusreader_web_program_cs_knowledgecoordinator_55","cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1167,"ts":"2026-05-22T07:04:04.322Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":552,"clientY":327.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_type_nexusreader_web_program_cs_knowledgecoordinator_55","cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1168,"ts":"2026-05-22T07:04:04.330Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":556,"clientY":330,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1169,"ts":"2026-05-22T07:04:04.340Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":560.7999877929688,"clientY":334,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1170,"ts":"2026-05-22T07:04:04.344Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":567.2000122070312,"clientY":337.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1171,"ts":"2026-05-22T07:04:04.354Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":574.4000244140625,"clientY":341.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1172,"ts":"2026-05-22T07:04:04.360Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":581.6000366210938,"clientY":344.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1173,"ts":"2026-05-22T07:04:04.367Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":587.2000122070312,"clientY":346,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1174,"ts":"2026-05-22T07:04:04.376Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":592.7999877929688,"clientY":348.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1175,"ts":"2026-05-22T07:04:04.380Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":596.7999877929688,"clientY":348.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1176,"ts":"2026-05-22T07:04:04.388Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":600,"clientY":348.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1177,"ts":"2026-05-22T07:04:04.393Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":602.4000244140625,"clientY":348.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1178,"ts":"2026-05-22T07:04:04.401Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":605.6000366210938,"clientY":347.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1179,"ts":"2026-05-22T07:04:04.409Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":608,"clientY":346,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1180,"ts":"2026-05-22T07:04:04.414Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":610.4000244140625,"clientY":342.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1181,"ts":"2026-05-22T07:04:04.422Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":612.7999877929688,"clientY":336.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1182,"ts":"2026-05-22T07:04:04.430Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":616.7999877929688,"clientY":330.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1183,"ts":"2026-05-22T07:04:04.439Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":620,"clientY":321.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1184,"ts":"2026-05-22T07:04:04.443Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":623.2000122070312,"clientY":314,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1185,"ts":"2026-05-22T07:04:04.450Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":625.6000366210938,"clientY":308.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1186,"ts":"2026-05-22T07:04:04.458Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":626.4000244140625,"clientY":305.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1187,"ts":"2026-05-22T07:04:04.467Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":626.4000244140625,"clientY":302.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1188,"ts":"2026-05-22T07:04:04.478Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":627.2000122070312,"clientY":300.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1189,"ts":"2026-05-22T07:04:04.481Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":628,"clientY":299.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1190,"ts":"2026-05-22T07:04:04.495Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":628,"clientY":298.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1191,"ts":"2026-05-22T07:04:04.524Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":629.6000366210938,"clientY":298,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1192,"ts":"2026-05-22T07:04:04.533Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":630.4000244140625,"clientY":298,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1193,"ts":"2026-05-22T07:04:04.536Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":631.2000122070312,"clientY":298,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1194,"ts":"2026-05-22T07:04:04.553Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":632.7999877929688,"clientY":298,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1195,"ts":"2026-05-22T07:04:04.557Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":633.6000366210938,"clientY":298,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1196,"ts":"2026-05-22T07:04:04.567Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":634.4000244140625,"clientY":298,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1197,"ts":"2026-05-22T07:04:04.574Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":636,"clientY":298,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1198,"ts":"2026-05-22T07:04:04.586Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":638.4000244140625,"clientY":298,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1199,"ts":"2026-05-22T07:04:04.594Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":639.2000122070312,"clientY":298,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1200,"ts":"2026-05-22T07:04:04.603Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":640.7999877929688,"clientY":298,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1201,"ts":"2026-05-22T07:04:04.607Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":642.4000244140625,"clientY":298,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1202,"ts":"2026-05-22T07:04:04.624Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":643.2000122070312,"clientY":298,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1203,"ts":"2026-05-22T07:04:04.634Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":644.7999877929688,"clientY":298,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1204,"ts":"2026-05-22T07:04:04.646Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":646.4000244140625,"clientY":298,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1205,"ts":"2026-05-22T07:04:04.650Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":647.2000122070312,"clientY":298,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1206,"ts":"2026-05-22T07:04:04.658Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":648,"clientY":298,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1207,"ts":"2026-05-22T07:04:04.666Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":649.6000366210938,"clientY":298.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1208,"ts":"2026-05-22T07:04:04.676Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":650.4000244140625,"clientY":298.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1209,"ts":"2026-05-22T07:04:04.680Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":652,"clientY":299.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1210,"ts":"2026-05-22T07:04:04.688Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":653.6000366210938,"clientY":300.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1211,"ts":"2026-05-22T07:04:04.693Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":654.4000244140625,"clientY":300.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1212,"ts":"2026-05-22T07:04:04.701Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":656,"clientY":300.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1213,"ts":"2026-05-22T07:04:04.710Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":657.6000366210938,"clientY":301.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1214,"ts":"2026-05-22T07:04:04.717Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":659.2000122070312,"clientY":301.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1215,"ts":"2026-05-22T07:04:04.726Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":660.7999877929688,"clientY":301.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1216,"ts":"2026-05-22T07:04:04.734Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":662.4000244140625,"clientY":301.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1217,"ts":"2026-05-22T07:04:04.740Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":663.2000122070312,"clientY":301.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1218,"ts":"2026-05-22T07:04:04.744Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":664.7999877929688,"clientY":301.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1219,"ts":"2026-05-22T07:04:04.753Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":666.4000244140625,"clientY":301.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1220,"ts":"2026-05-22T07:04:04.758Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":668,"clientY":301.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1221,"ts":"2026-05-22T07:04:04.767Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":669.6000366210938,"clientY":301.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1222,"ts":"2026-05-22T07:04:04.772Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":670.4000244140625,"clientY":301.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1223,"ts":"2026-05-22T07:04:04.780Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":671.2000122070312,"clientY":301.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1224,"ts":"2026-05-22T07:04:04.789Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":672.7999877929688,"clientY":300.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1225,"ts":"2026-05-22T07:04:04.793Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":673.6000366210938,"clientY":299.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1226,"ts":"2026-05-22T07:04:04.801Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":674.4000244140625,"clientY":299.6000061035156,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1227,"ts":"2026-05-22T07:04:04.810Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":675.2000122070312,"clientY":298.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1228,"ts":"2026-05-22T07:04:04.816Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":676,"clientY":298.8000183105469,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1229,"ts":"2026-05-22T07:04:04.836Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":677.6000366210938,"clientY":298,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1230,"ts":"2026-05-22T07:04:04.854Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":677.6000366210938,"clientY":297.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1231,"ts":"2026-05-22T07:04:04.861Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":678.4000244140625,"clientY":297.20001220703125,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1232,"ts":"2026-05-22T07:04:04.866Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":678.4000244140625,"clientY":296.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1233,"ts":"2026-05-22T07:04:04.873Z","type":"pointer.move","payload":{"pointerId":1,"buttons":0,"clientX":679.2000122070312,"clientY":296.3999938964844,"altKey":false,"ctrlKey":false,"orbitDragActive":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1234,"ts":"2026-05-22T07:04:05.009Z","type":"pointer.down","payload":{"pointerId":1,"button":0,"buttons":1,"clientX":679.2000122070312,"clientY":296.3999938964844,"altKey":false,"ctrlKey":false,"targetInGraph":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1235,"ts":"2026-05-22T07:04:05.100Z","type":"pointer.up","payload":{"pointerId":1,"button":0,"buttons":0,"clientX":679.2000122070312,"clientY":296.3999938964844,"altKey":false,"ctrlKey":false,"hadOrbitDragState":false,"orbitDragMoved":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433443720,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1236,"ts":"2026-05-22T07:04:05.100Z","type":"focus.node-click.suppressed-window","payload":{"duration":220,"suppressNodeClickUntil":1779433445320},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433445320,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1237,"ts":"2026-05-22T07:04:05.100Z","type":"shortcut.radial.menu.hide","payload":{"hadAnchor":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":true,"suppressNodeClickUntil":1779433445320,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1238,"ts":"2026-05-22T07:04:06.292Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433445320,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1239,"ts":"2026-05-22T07:04:06.763Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433445320,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1240,"ts":"2026-05-22T07:04:06.794Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433445320,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1241,"ts":"2026-05-22T07:04:06.824Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433445320,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1242,"ts":"2026-05-22T07:04:06.854Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433445320,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1243,"ts":"2026-05-22T07:04:06.884Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433445320,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1244,"ts":"2026-05-22T07:04:06.914Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433445320,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1245,"ts":"2026-05-22T07:04:06.942Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433445320,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1246,"ts":"2026-05-22T07:04:06.971Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433445320,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1247,"ts":"2026-05-22T07:04:07.001Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433445320,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1248,"ts":"2026-05-22T07:04:07.031Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433445320,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1249,"ts":"2026-05-22T07:04:07.067Z","type":"key.up","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433445320,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1250,"ts":"2026-05-22T07:04:07.871Z","type":"controls.start","payload":{"startPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433445320,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-617.3475530442881,"y":-497.43604429648315,"z":-21.308641505250403},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1251,"ts":"2026-05-22T07:04:07.872Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433445320,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-609.6194363033875,"y":-491.2090109139125,"z":-21.041894405775363},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1252,"ts":"2026-05-22T07:04:07.872Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433445320,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-609.6194363033875,"y":-491.2090109139125,"z":-21.041894405775363},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1253,"ts":"2026-05-22T07:04:07.875Z","type":"controls.start","payload":{"startPosition":{"x":-609.6194363033874,"y":-491.20901091391244,"z":-21.04189440577536},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448192,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-609.6194363033874,"y":-491.20901091391244,"z":-21.04189440577536},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1254,"ts":"2026-05-22T07:04:07.875Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448192,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-601.5820361113849,"y":-484.7327682557502,"z":-20.76447194174994},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1255,"ts":"2026-05-22T07:04:07.875Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448192,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-601.5820361113849,"y":-484.7327682557502,"z":-20.76447194174994},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1256,"ts":"2026-05-22T07:04:07.878Z","type":"controls.start","payload":{"startPosition":{"x":-601.5820361113849,"y":-484.73276825575016,"z":-20.76447194174994},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448195,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-601.5820361113849,"y":-484.73276825575016,"z":-20.76447194174994},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1257,"ts":"2026-05-22T07:04:07.878Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448195,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-593.3535525537528,"y":-478.10255762110376,"z":-20.480453959663837},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1258,"ts":"2026-05-22T07:04:07.878Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448195,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-593.3535525537528,"y":-478.10255762110376,"z":-20.480453959663837},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1259,"ts":"2026-05-22T07:04:07.887Z","type":"controls.start","payload":{"startPosition":{"x":-593.3535525537528,"y":-478.10255762110376,"z":-20.480453959663837},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448198,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-593.3535525537528,"y":-478.10255762110376,"z":-20.480453959663837},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1260,"ts":"2026-05-22T07:04:07.887Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448198,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-582.751422110864,"y":-469.55974927494754,"z":-20.114506130624317},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1261,"ts":"2026-05-22T07:04:07.887Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448198,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-582.751422110864,"y":-469.55974927494754,"z":-20.114506130624317},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1262,"ts":"2026-05-22T07:04:07.894Z","type":"controls.start","payload":{"startPosition":{"x":-582.751422110864,"y":-469.55974927494754,"z":-20.114506130624317},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448208,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-582.751422110864,"y":-469.55974927494754,"z":-20.114506130624317},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1263,"ts":"2026-05-22T07:04:07.894Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448208,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-578.7162915016024,"y":-466.3083888401443,"z":-19.9752277757404},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1264,"ts":"2026-05-22T07:04:07.894Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448208,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-578.7162915016024,"y":-466.3083888401443,"z":-19.9752277757404},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1265,"ts":"2026-05-22T07:04:07.901Z","type":"controls.start","payload":{"startPosition":{"x":-578.7162915016024,"y":-466.3083888401443,"z":-19.9752277757404},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448214,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-578.7162915016024,"y":-466.3083888401443,"z":-19.9752277757404},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1266,"ts":"2026-05-22T07:04:07.901Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448214,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-575.6130262641707,"y":-463.80789138696963,"z":-19.868114098664897},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1267,"ts":"2026-05-22T07:04:07.902Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448214,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-575.6130262641707,"y":-463.80789138696963,"z":-19.868114098664897},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1268,"ts":"2026-05-22T07:04:07.908Z","type":"controls.start","payload":{"startPosition":{"x":-575.6130262641707,"y":-463.80789138696963,"z":-19.868114098664897},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448222,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-575.6130262641707,"y":-463.80789138696963,"z":-19.868114098664897},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1269,"ts":"2026-05-22T07:04:07.908Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448222,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-573.5653089017328,"y":-462.15791574588184,"z":-19.797434179444203},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1270,"ts":"2026-05-22T07:04:07.908Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448222,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-573.5653089017328,"y":-462.15791574588184,"z":-19.797434179444203},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1271,"ts":"2026-05-22T07:04:07.916Z","type":"controls.start","payload":{"startPosition":{"x":-573.5653089017328,"y":-462.1579157458817,"z":-19.797434179444203},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448228,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-573.5653089017328,"y":-462.1579157458817,"z":-19.797434179444203},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1272,"ts":"2026-05-22T07:04:07.916Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448228,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-572.2123796827968,"y":-461.06777494016876,"z":-19.750735875440043},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1273,"ts":"2026-05-22T07:04:07.916Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448228,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-572.2123796827968,"y":-461.06777494016876,"z":-19.750735875440043},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1274,"ts":"2026-05-22T07:04:07.923Z","type":"controls.start","payload":{"startPosition":{"x":-572.2123796827968,"y":-461.06777494016876,"z":-19.750735875440043},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448236,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-572.2123796827968,"y":-461.06777494016876,"z":-19.750735875440043},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1275,"ts":"2026-05-22T07:04:07.924Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448236,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-571.6235398024293,"y":-460.5933093342557,"z":-19.73041121738823},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1276,"ts":"2026-05-22T07:04:07.924Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448236,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-571.6235398024293,"y":-460.5933093342557,"z":-19.73041121738823},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1277,"ts":"2026-05-22T07:04:07.928Z","type":"controls.start","payload":{"startPosition":{"x":-571.6235398024293,"y":-460.5933093342557,"z":-19.73041121738823},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448244,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-571.6235398024293,"y":-460.5933093342557,"z":-19.73041121738823},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1278,"ts":"2026-05-22T07:04:07.928Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448244,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-570.6418683910822,"y":-459.80231447042036,"z":-19.6965274122655},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1279,"ts":"2026-05-22T07:04:07.928Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448244,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-570.6418683910822,"y":-459.80231447042036,"z":-19.6965274122655},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1280,"ts":"2026-05-22T07:04:07.935Z","type":"controls.start","payload":{"startPosition":{"x":-570.6418683910821,"y":-459.80231447042024,"z":-19.696527412265496},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448248,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-570.6418683910821,"y":-459.80231447042024,"z":-19.696527412265496},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1281,"ts":"2026-05-22T07:04:07.935Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448248,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-569.8872879105295,"y":-459.19430116009204,"z":-19.67048197826699},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1282,"ts":"2026-05-22T07:04:07.935Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448248,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-569.8872879105295,"y":-459.19430116009204,"z":-19.67048197826699},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1283,"ts":"2026-05-22T07:04:07.942Z","type":"controls.start","payload":{"startPosition":{"x":-569.8872879105295,"y":-459.19430116009204,"z":-19.67048197826699},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448255,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-569.8872879105295,"y":-459.19430116009204,"z":-19.67048197826699},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1284,"ts":"2026-05-22T07:04:07.942Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448255,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-568.7212614646265,"y":-458.25475976248737,"z":-19.630234893138258},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1285,"ts":"2026-05-22T07:04:07.942Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448255,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-568.7212614646265,"y":-458.25475976248737,"z":-19.630234893138258},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1286,"ts":"2026-05-22T07:04:07.948Z","type":"controls.start","payload":{"startPosition":{"x":-568.7212614646265,"y":-458.25475976248737,"z":-19.630234893138258},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448262,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-568.7212614646265,"y":-458.25475976248737,"z":-19.630234893138258},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1287,"ts":"2026-05-22T07:04:07.949Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448262,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-567.7175194220339,"y":-457.44598119245956,"z":-19.595589288334473},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1288,"ts":"2026-05-22T07:04:07.949Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448262,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-567.7175194220339,"y":-457.44598119245956,"z":-19.595589288334473},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1289,"ts":"2026-05-22T07:04:07.956Z","type":"controls.start","payload":{"startPosition":{"x":-567.7175194220339,"y":-457.44598119245956,"z":-19.595589288334473},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448269,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-567.7175194220339,"y":-457.44598119245956,"z":-19.595589288334473},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1290,"ts":"2026-05-22T07:04:07.956Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448269,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-566.9474774677062,"y":-456.8255095929299,"z":-19.569010179260733},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1291,"ts":"2026-05-22T07:04:07.956Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448269,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-566.9474774677062,"y":-456.8255095929299,"z":-19.569010179260733},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1292,"ts":"2026-05-22T07:04:07.966Z","type":"controls.start","payload":{"startPosition":{"x":-566.9474774677062,"y":-456.8255095929299,"z":-19.569010179260733},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448276,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-566.9474774677062,"y":-456.8255095929299,"z":-19.569010179260733},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1293,"ts":"2026-05-22T07:04:07.966Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448276,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-565.7744069740817,"y":-455.88029235970043,"z":-19.528519958661708},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1294,"ts":"2026-05-22T07:04:07.966Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448276,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-565.7744069740817,"y":-455.88029235970043,"z":-19.528519958661708},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1295,"ts":"2026-05-22T07:04:07.973Z","type":"controls.start","payload":{"startPosition":{"x":-565.7744069740817,"y":-455.8802923597004,"z":-19.528519958661708},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448286,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-565.7744069740817,"y":-455.8802923597004,"z":-19.528519958661708},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1296,"ts":"2026-05-22T07:04:07.973Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448286,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-564.8372381811304,"y":-455.1251560756009,"z":-19.496172225621493},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1297,"ts":"2026-05-22T07:04:07.974Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448286,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-564.8372381811304,"y":-455.1251560756009,"z":-19.496172225621493},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1298,"ts":"2026-05-22T07:04:07.986Z","type":"controls.start","payload":{"startPosition":{"x":-564.8372381811304,"y":-455.1251560756009,"z":-19.496172225621493},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448294,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-564.8372381811304,"y":-455.1251560756009,"z":-19.496172225621493},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1299,"ts":"2026-05-22T07:04:07.986Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448294,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-563.4957736645399,"y":-454.0442531070765,"z":-19.449869642360117},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1300,"ts":"2026-05-22T07:04:07.986Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448294,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-563.4957736645399,"y":-454.0442531070765,"z":-19.449869642360117},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1301,"ts":"2026-05-22T07:04:07.989Z","type":"controls.start","payload":{"startPosition":{"x":-563.4957736645399,"y":-454.0442531070765,"z":-19.449869642360117},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448306,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-563.4957736645399,"y":-454.0442531070765,"z":-19.449869642360117},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1302,"ts":"2026-05-22T07:04:07.989Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448306,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.3452906484611,"y":-453.1172360358555,"z":-19.410159061137897},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1303,"ts":"2026-05-22T07:04:07.989Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448306,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.3452906484611,"y":-453.1172360358555,"z":-19.410159061137897},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1304,"ts":"2026-05-22T07:04:07.992Z","type":"controls.start","payload":{"startPosition":{"x":-562.3452906484611,"y":-453.1172360358555,"z":-19.410159061137897},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448309,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-562.3452906484611,"y":-453.1172360358555,"z":-19.410159061137897},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1305,"ts":"2026-05-22T07:04:07.992Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448309,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-560.409841280698,"y":-451.5577218324079,"z":-19.343354233734185},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1306,"ts":"2026-05-22T07:04:07.992Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448309,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-560.409841280698,"y":-451.5577218324079,"z":-19.343354233734185},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1307,"ts":"2026-05-22T07:04:07.998Z","type":"controls.start","payload":{"startPosition":{"x":-560.409841280698,"y":-451.5577218324079,"z":-19.343354233734185},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448312,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-560.409841280698,"y":-451.5577218324079,"z":-19.343354233734185},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1308,"ts":"2026-05-22T07:04:07.998Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448312,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-557.993432551149,"y":-449.61066819316864,"z":-19.259948400028023},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1309,"ts":"2026-05-22T07:04:07.998Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448312,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-557.993432551149,"y":-449.61066819316864,"z":-19.259948400028023},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1310,"ts":"2026-05-22T07:04:08.005Z","type":"controls.start","payload":{"startPosition":{"x":-557.993432551149,"y":-449.61066819316864,"z":-19.259948400028023},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448318,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-557.993432551149,"y":-449.61066819316864,"z":-19.259948400028023},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1311,"ts":"2026-05-22T07:04:08.005Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448318,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-554.8633169694062,"y":-447.08853571609825,"z":-19.151907944578824},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1312,"ts":"2026-05-22T07:04:08.005Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448318,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-554.8633169694062,"y":-447.08853571609825,"z":-19.151907944578824},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1313,"ts":"2026-05-22T07:04:08.012Z","type":"controls.start","payload":{"startPosition":{"x":-554.8633169694062,"y":-447.08853571609825,"z":-19.151907944578824},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448325,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-554.8633169694062,"y":-447.08853571609825,"z":-19.151907944578824},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1314,"ts":"2026-05-22T07:04:08.013Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448325,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-550.8586206185124,"y":-443.8616980918561,"z":-19.013680072033164},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1315,"ts":"2026-05-22T07:04:08.013Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448325,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-550.8586206185124,"y":-443.8616980918561,"z":-19.013680072033164},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1316,"ts":"2026-05-22T07:04:08.024Z","type":"controls.start","payload":{"startPosition":{"x":-550.8586206185124,"y":-443.86169809185606,"z":-19.013680072033164},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448333,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-550.8586206185124,"y":-443.86169809185606,"z":-19.013680072033164},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1317,"ts":"2026-05-22T07:04:08.025Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448333,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-547.1194137057499,"y":-440.84878213176444,"z":-18.884615950494005},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1318,"ts":"2026-05-22T07:04:08.025Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448333,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-547.1194137057499,"y":-440.84878213176444,"z":-18.884615950494005},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1319,"ts":"2026-05-22T07:04:08.031Z","type":"controls.start","payload":{"startPosition":{"x":-547.1194137057499,"y":-440.84878213176444,"z":-18.884615950494005},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448345,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-547.1194137057499,"y":-440.84878213176444,"z":-18.884615950494005},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1320,"ts":"2026-05-22T07:04:08.031Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448345,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-542.5995331731127,"y":-437.2068279654921,"z":-18.728605752605336},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1321,"ts":"2026-05-22T07:04:08.031Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448345,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-542.5995331731127,"y":-437.2068279654921,"z":-18.728605752605336},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1322,"ts":"2026-05-22T07:04:08.035Z","type":"controls.start","payload":{"startPosition":{"x":-542.5995331731127,"y":-437.2068279654921,"z":-18.728605752605336},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448351,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-542.5995331731127,"y":-437.2068279654921,"z":-18.728605752605336},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1323,"ts":"2026-05-22T07:04:08.035Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448351,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-537.2699010981062,"y":-432.91240566824075,"z":-18.544645811918485},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1324,"ts":"2026-05-22T07:04:08.035Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448351,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-537.2699010981062,"y":-432.91240566824075,"z":-18.544645811918485},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1325,"ts":"2026-05-22T07:04:08.042Z","type":"controls.start","payload":{"startPosition":{"x":-537.2699010981062,"y":-432.91240566824075,"z":-18.544645811918485},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448355,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-537.2699010981062,"y":-432.91240566824075,"z":-18.544645811918485},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1326,"ts":"2026-05-22T07:04:08.042Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448355,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-534.7075700593886,"y":-430.84777317752713,"z":-18.456203259173982},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1327,"ts":"2026-05-22T07:04:08.042Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448355,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-534.7075700593886,"y":-430.84777317752713,"z":-18.456203259173982},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1328,"ts":"2026-05-22T07:04:08.499Z","type":"controls.start","payload":{"startPosition":{"x":-534.7075700593886,"y":-430.8477731775272,"z":-18.456203259173982},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448362,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-534.7075700593886,"y":-430.8477731775272,"z":-18.456203259173982},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1329,"ts":"2026-05-22T07:04:08.499Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448362,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-537.4573074653307,"y":-433.0634108541015,"z":-18.55111441307402},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1330,"ts":"2026-05-22T07:04:08.499Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448362,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-537.4573074653307,"y":-433.0634108541015,"z":-18.55111441307402},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1331,"ts":"2026-05-22T07:04:08.508Z","type":"controls.start","payload":{"startPosition":{"x":-537.4573074653307,"y":-433.0634108541015,"z":-18.55111441307402},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448819,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-537.4573074653307,"y":-433.0634108541015,"z":-18.55111441307402},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1332,"ts":"2026-05-22T07:04:08.508Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448819,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-537.7330577389104,"y":-433.28560032359354,"z":-18.5606323316204},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1333,"ts":"2026-05-22T07:04:08.508Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448819,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-537.7330577389104,"y":-433.28560032359354,"z":-18.5606323316204},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1334,"ts":"2026-05-22T07:04:08.511Z","type":"controls.start","payload":{"startPosition":{"x":-537.7330577389104,"y":-433.28560032359354,"z":-18.5606323316204},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448828,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-537.7330577389104,"y":-433.28560032359354,"z":-18.5606323316204},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1335,"ts":"2026-05-22T07:04:08.511Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448828,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-538.0089494901707,"y":-433.5079037906183,"z":-18.570155133473058},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1336,"ts":"2026-05-22T07:04:08.511Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448828,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-538.0089494901707,"y":-433.5079037906183,"z":-18.570155133473058},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1337,"ts":"2026-05-22T07:04:08.519Z","type":"controls.start","payload":{"startPosition":{"x":-538.0089494901707,"y":-433.5079037906183,"z":-18.570155133473058},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448831,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-538.0089494901707,"y":-433.5079037906183,"z":-18.570155133473058},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1338,"ts":"2026-05-22T07:04:08.519Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448831,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-538.284982791699,"y":-433.73032131366386,"z":-18.579682821137443},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1339,"ts":"2026-05-22T07:04:08.519Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448831,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-538.284982791699,"y":-433.73032131366386,"z":-18.579682821137443},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1340,"ts":"2026-05-22T07:04:08.528Z","type":"controls.start","payload":{"startPosition":{"x":-538.284982791699,"y":-433.73032131366386,"z":-18.579682821137443},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448839,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-538.284982791699,"y":-433.73032131366386,"z":-18.579682821137443},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1341,"ts":"2026-05-22T07:04:08.528Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448839,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-538.5611577161197,"y":-433.95285295124836,"z":-18.58921539712029},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1342,"ts":"2026-05-22T07:04:08.528Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448839,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-538.5611577161197,"y":-433.95285295124836,"z":-18.58921539712029},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1343,"ts":"2026-05-22T07:04:08.535Z","type":"controls.start","payload":{"startPosition":{"x":-538.5611577161197,"y":-433.95285295124836,"z":-18.58921539712029},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448848,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-538.5611577161197,"y":-433.95285295124836,"z":-18.58921539712029},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1344,"ts":"2026-05-22T07:04:08.535Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448848,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-538.8374743360945,"y":-434.17549876191987,"z":-18.598752863929626},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1345,"ts":"2026-05-22T07:04:08.535Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448848,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-538.8374743360945,"y":-434.17549876191987,"z":-18.598752863929626},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1346,"ts":"2026-05-22T07:04:08.544Z","type":"controls.start","payload":{"startPosition":{"x":-538.8374743360945,"y":-434.17549876191987,"z":-18.598752863929626},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448855,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-538.8374743360945,"y":-434.17549876191987,"z":-18.598752863929626},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1347,"ts":"2026-05-22T07:04:08.544Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448855,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-539.3905329535393,"y":-434.62113313686666,"z":-18.617842480066283},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1348,"ts":"2026-05-22T07:04:08.544Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448855,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-539.3905329535393,"y":-434.62113313686666,"z":-18.617842480066283},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1349,"ts":"2026-05-22T07:04:08.548Z","type":"controls.start","payload":{"startPosition":{"x":-539.3905329535393,"y":-434.6211331368666,"z":-18.617842480066283},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448864,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-539.3905329535393,"y":-434.6211331368666,"z":-18.617842480066283},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1350,"ts":"2026-05-22T07:04:08.548Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448864,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-539.6672750965192,"y":-434.8441218183885,"z":-18.627394634416092},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1351,"ts":"2026-05-22T07:04:08.549Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448864,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-539.6672750965192,"y":-434.8441218183885,"z":-18.627394634416092},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1352,"ts":"2026-05-22T07:04:08.565Z","type":"controls.start","payload":{"startPosition":{"x":-539.6672750965192,"y":-434.8441218183885,"z":-18.627394634416092},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448869,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-539.6672750965192,"y":-434.8441218183885,"z":-18.627394634416092},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1353,"ts":"2026-05-22T07:04:08.565Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448869,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-539.944159226073,"y":-435.0672249074904,"z":-18.636951689637353},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1354,"ts":"2026-05-22T07:04:08.565Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448869,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-539.944159226073,"y":-435.0672249074904,"z":-18.636951689637353},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1355,"ts":"2026-05-22T07:04:08.570Z","type":"controls.start","payload":{"startPosition":{"x":-539.944159226073,"y":-435.0672249074904,"z":-18.636951689637353},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448885,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-539.944159226073,"y":-435.0672249074904,"z":-18.636951689637353},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1356,"ts":"2026-05-22T07:04:08.570Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448885,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-540.2211854150488,"y":-435.29044246287083,"z":-18.64651364824453},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1357,"ts":"2026-05-22T07:04:08.570Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448885,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-540.2211854150488,"y":-435.29044246287083,"z":-18.64651364824453},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1358,"ts":"2026-05-22T07:04:08.582Z","type":"controls.start","payload":{"startPosition":{"x":-540.2211854150488,"y":-435.29044246287083,"z":-18.64651364824453},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448891,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-540.2211854150488,"y":-435.29044246287083,"z":-18.64651364824453},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1359,"ts":"2026-05-22T07:04:08.582Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448891,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-540.4983537363322,"y":-435.5137745432584,"z":-18.65608051275337},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1360,"ts":"2026-05-22T07:04:08.582Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448891,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-540.4983537363322,"y":-435.5137745432584,"z":-18.65608051275337},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1361,"ts":"2026-05-22T07:04:08.590Z","type":"controls.start","payload":{"startPosition":{"x":-540.4983537363322,"y":-435.5137745432584,"z":-18.65608051275337},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448902,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-540.4983537363322,"y":-435.5137745432584,"z":-18.65608051275337},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1362,"ts":"2026-05-22T07:04:08.590Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448902,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-540.2211854150488,"y":-435.29044246287083,"z":-18.64651364824453},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1363,"ts":"2026-05-22T07:04:08.590Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448902,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-540.2211854150488,"y":-435.29044246287083,"z":-18.64651364824453},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1364,"ts":"2026-05-22T07:04:08.614Z","type":"controls.start","payload":{"startPosition":{"x":-540.2211854150488,"y":-435.29044246287083,"z":-18.64651364824453},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448910,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-540.2211854150488,"y":-435.29044246287083,"z":-18.64651364824453},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1365,"ts":"2026-05-22T07:04:08.614Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448910,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-538.8374743360946,"y":-434.17549876192,"z":-18.59875286392963},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1366,"ts":"2026-05-22T07:04:08.615Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448910,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-538.8374743360946,"y":-434.17549876192,"z":-18.59875286392963},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1367,"ts":"2026-05-22T07:04:08.618Z","type":"controls.start","payload":{"startPosition":{"x":-538.8374743360946,"y":-434.17549876192,"z":-18.59875286392963},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448935,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-538.8374743360946,"y":-434.17549876192,"z":-18.59875286392963},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1368,"ts":"2026-05-22T07:04:08.618Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448935,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-538.5611577161199,"y":-433.9528529512484,"z":-18.589215397120295},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1369,"ts":"2026-05-22T07:04:08.618Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448935,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-538.5611577161199,"y":-433.9528529512484,"z":-18.589215397120295},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1370,"ts":"2026-05-22T07:04:08.627Z","type":"controls.start","payload":{"startPosition":{"x":-538.5611577161199,"y":-433.9528529512484,"z":-18.589215397120295},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448938,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-538.5611577161199,"y":-433.9528529512484,"z":-18.589215397120295},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1371,"ts":"2026-05-22T07:04:08.627Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448938,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-538.2849827916991,"y":-433.7303213136639,"z":-18.579682821137446},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1372,"ts":"2026-05-22T07:04:08.627Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448938,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-538.2849827916991,"y":-433.7303213136639,"z":-18.579682821137446},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1373,"ts":"2026-05-22T07:04:08.634Z","type":"controls.start","payload":{"startPosition":{"x":-538.2849827916991,"y":-433.7303213136639,"z":-18.579682821137446},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448947,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-538.2849827916991,"y":-433.7303213136639,"z":-18.579682821137446},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1374,"ts":"2026-05-22T07:04:08.635Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448947,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-538.0089494901708,"y":-433.5079037906184,"z":-18.57015513347306},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1375,"ts":"2026-05-22T07:04:08.635Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448947,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-538.0089494901708,"y":-433.5079037906184,"z":-18.57015513347306},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1376,"ts":"2026-05-22T07:04:08.655Z","type":"controls.start","payload":{"startPosition":{"x":-538.0089494901708,"y":-433.5079037906184,"z":-18.57015513347306},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448955,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-538.0089494901708,"y":-433.5079037906184,"z":-18.57015513347306},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1377,"ts":"2026-05-22T07:04:08.655Z","type":"controls.end","payload":{"changed":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448955,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-538.0089494901708,"y":-433.5079037906184,"z":-18.57015513347306},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1378,"ts":"2026-05-22T07:04:08.668Z","type":"controls.start","payload":{"startPosition":{"x":-538.0089494901708,"y":-433.5079037906184,"z":-18.57015513347306},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448955,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-538.0089494901708,"y":-433.5079037906184,"z":-18.57015513347306},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1379,"ts":"2026-05-22T07:04:08.668Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448955,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-537.7330577389106,"y":-433.28560032359366,"z":-18.560632331620408},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1380,"ts":"2026-05-22T07:04:08.668Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448955,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-537.7330577389106,"y":-433.28560032359366,"z":-18.560632331620408},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1381,"ts":"2026-05-22T07:04:08.988Z","type":"controls.start","payload":{"startPosition":{"x":-537.7330577389107,"y":-433.2856003235938,"z":-18.56063233162041},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448988,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-537.7330577389107,"y":-433.2856003235938,"z":-18.56063233162041},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1382,"ts":"2026-05-22T07:04:08.989Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448988,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-539.1139327243225,"y":-434.39825880425667,"z":-18.608295224074766},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1383,"ts":"2026-05-22T07:04:08.989Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433448988,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-539.1139327243225,"y":-434.39825880425667,"z":-18.608295224074766},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1384,"ts":"2026-05-22T07:04:08.997Z","type":"controls.start","payload":{"startPosition":{"x":-539.1139327243225,"y":-434.39825880425667,"z":-18.608295224074766},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449309,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-539.1139327243225,"y":-434.39825880425667,"z":-18.608295224074766},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1385,"ts":"2026-05-22T07:04:08.997Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449309,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-539.944159226073,"y":-435.06722490749047,"z":-18.636951689637353},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1386,"ts":"2026-05-22T07:04:08.997Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449309,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-539.944159226073,"y":-435.06722490749047,"z":-18.636951689637353},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1387,"ts":"2026-05-22T07:04:09.004Z","type":"controls.start","payload":{"startPosition":{"x":-539.944159226073,"y":-435.06722490749047,"z":-18.636951689637353},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449317,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-539.944159226073,"y":-435.06722490749047,"z":-18.636951689637353},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1388,"ts":"2026-05-22T07:04:09.004Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449317,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-535.054537653467,"y":-431.12734695512836,"z":-18.468179346290064},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1389,"ts":"2026-05-22T07:04:09.004Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449317,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-535.054537653467,"y":-431.12734695512836,"z":-18.468179346290064},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1390,"ts":"2026-05-22T07:04:09.008Z","type":"controls.start","payload":{"startPosition":{"x":-535.054537653467,"y":-431.12734695512836,"z":-18.468179346290064},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449324,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-535.054537653467,"y":-431.12734695512836,"z":-18.468179346290064},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1391,"ts":"2026-05-22T07:04:09.008Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449324,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-530.4303734053168,"y":-427.4013647908934,"z":-18.30856964549943},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1392,"ts":"2026-05-22T07:04:09.008Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449324,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-530.4303734053168,"y":-427.4013647908934,"z":-18.30856964549943},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1393,"ts":"2026-05-22T07:04:09.014Z","type":"controls.start","payload":{"startPosition":{"x":-530.4303734053168,"y":-427.4013647908934,"z":-18.30856964549943},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449328,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-530.4303734053168,"y":-427.4013647908934,"z":-18.30856964549943},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1394,"ts":"2026-05-22T07:04:09.014Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449328,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-527.1624941627254,"y":-424.76822740230693,"z":-18.19577407852998},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1395,"ts":"2026-05-22T07:04:09.014Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449328,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-527.1624941627254,"y":-424.76822740230693,"z":-18.19577407852998},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1396,"ts":"2026-05-22T07:04:09.022Z","type":"controls.start","payload":{"startPosition":{"x":-527.1624941627255,"y":-424.76822740230705,"z":-18.195774078529986},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449334,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-527.1624941627255,"y":-424.76822740230705,"z":-18.195774078529986},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1397,"ts":"2026-05-22T07:04:09.022Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449334,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-524.2030130748495,"y":-422.38358594991325,"z":-18.09362331882884},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1398,"ts":"2026-05-22T07:04:09.022Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449334,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-524.2030130748495,"y":-422.38358594991325,"z":-18.09362331882884},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1399,"ts":"2026-05-22T07:04:09.030Z","type":"controls.start","payload":{"startPosition":{"x":-524.2030130748495,"y":-422.38358594991325,"z":-18.09362331882884},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449342,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-524.2030130748495,"y":-422.38358594991325,"z":-18.09362331882884},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1400,"ts":"2026-05-22T07:04:09.030Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449342,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-521.7124501945583,"y":-420.3767816123332,"z":-18.007657947619858},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1401,"ts":"2026-05-22T07:04:09.030Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449342,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-521.7124501945583,"y":-420.3767816123332,"z":-18.007657947619858},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1402,"ts":"2026-05-22T07:04:09.037Z","type":"controls.start","payload":{"startPosition":{"x":-521.7124501945583,"y":-420.3767816123333,"z":-18.007657947619858},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449350,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-521.7124501945583,"y":-420.3767816123333,"z":-18.007657947619858},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1403,"ts":"2026-05-22T07:04:09.037Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449350,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-519.6418920476846,"y":-418.7084017038236,"z":-17.93618964576957},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1404,"ts":"2026-05-22T07:04:09.037Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449350,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-519.6418920476846,"y":-418.7084017038236,"z":-17.93618964576957},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1405,"ts":"2026-05-22T07:04:09.044Z","type":"controls.start","payload":{"startPosition":{"x":-519.6418920476846,"y":-418.7084017038236,"z":-17.93618964576957},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449357,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-519.6418920476846,"y":-418.7084017038236,"z":-17.93618964576957},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1406,"ts":"2026-05-22T07:04:09.044Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449357,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-517.7535828048863,"y":-417.18687128629114,"z":-17.871011927793006},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1407,"ts":"2026-05-22T07:04:09.044Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449357,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-517.7535828048863,"y":-417.18687128629114,"z":-17.871011927793006},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1408,"ts":"2026-05-22T07:04:09.051Z","type":"controls.start","payload":{"startPosition":{"x":-517.7535828048863,"y":-417.1868712862912,"z":-17.871011927793006},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449364,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-517.7535828048863,"y":-417.1868712862912,"z":-17.871011927793006},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1409,"ts":"2026-05-22T07:04:09.052Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449364,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-515.7856806064511,"y":-415.60120778066175,"z":-17.803086944115556},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1410,"ts":"2026-05-22T07:04:09.052Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449364,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-515.7856806064511,"y":-415.60120778066175,"z":-17.803086944115556},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1411,"ts":"2026-05-22T07:04:09.059Z","type":"controls.start","payload":{"startPosition":{"x":-515.7856806064511,"y":-415.60120778066175,"z":-17.803086944115556},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449372,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-515.7856806064511,"y":-415.60120778066175,"z":-17.803086944115556},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1412,"ts":"2026-05-22T07:04:09.059Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449372,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-513.6655333043615,"y":-413.89287074737047,"z":-17.729907001025524},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1413,"ts":"2026-05-22T07:04:09.059Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449372,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-513.6655333043615,"y":-413.89287074737047,"z":-17.729907001025524},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1414,"ts":"2026-05-22T07:04:09.067Z","type":"controls.start","payload":{"startPosition":{"x":-513.6655333043615,"y":-413.8928707473704,"z":-17.729907001025524},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449379,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-513.6655333043615,"y":-413.8928707473704,"z":-17.729907001025524},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1415,"ts":"2026-05-22T07:04:09.068Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449379,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-511.1338817445105,"y":-411.85295865691313,"z":-17.642523394758594},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1416,"ts":"2026-05-22T07:04:09.068Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449379,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-511.1338817445105,"y":-411.85295865691313,"z":-17.642523394758594},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1417,"ts":"2026-05-22T07:04:09.071Z","type":"controls.start","payload":{"startPosition":{"x":-511.1338817445105,"y":-411.85295865691313,"z":-17.642523394758594},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449388,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-511.1338817445105,"y":-411.85295865691313,"z":-17.642523394758594},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1418,"ts":"2026-05-22T07:04:09.071Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449388,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-508.46993814433995,"y":-409.70645048633213,"z":-17.550573537848468},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1419,"ts":"2026-05-22T07:04:09.071Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449388,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-508.46993814433995,"y":-409.70645048633213,"z":-17.550573537848468},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1420,"ts":"2026-05-22T07:04:09.078Z","type":"controls.start","payload":{"startPosition":{"x":-508.46993814433995,"y":-409.70645048633213,"z":-17.550573537848468},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449391,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-508.46993814433995,"y":-409.70645048633213,"z":-17.550573537848468},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1421,"ts":"2026-05-22T07:04:09.078Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449391,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-507.1582995580125,"y":-408.64958015986537,"z":-17.50530043960311},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1422,"ts":"2026-05-22T07:04:09.078Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449391,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-507.1582995580125,"y":-408.64958015986537,"z":-17.50530043960311},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1423,"ts":"2026-05-22T07:04:09.087Z","type":"controls.start","payload":{"startPosition":{"x":-507.1582995580125,"y":-408.64958015986537,"z":-17.50530043960311},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449398,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-507.1582995580125,"y":-408.64958015986537,"z":-17.50530043960311},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1424,"ts":"2026-05-22T07:04:09.087Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449398,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-505.4359676764499,"y":-407.26178822013,"z":-17.44585166972251},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1425,"ts":"2026-05-22T07:04:09.087Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449398,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-505.4359676764499,"y":-407.26178822013,"z":-17.44585166972251},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1426,"ts":"2026-05-22T07:04:09.094Z","type":"controls.start","payload":{"startPosition":{"x":-505.4359676764499,"y":-407.26178822013,"z":-17.44585166972251},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449407,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-505.4359676764499,"y":-407.26178822013,"z":-17.44585166972251},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1427,"ts":"2026-05-22T07:04:09.094Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449407,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-502.9804859403006,"y":-405.2832509834484,"z":-17.361097174818823},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1428,"ts":"2026-05-22T07:04:09.094Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449407,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-502.9804859403006,"y":-405.2832509834484,"z":-17.361097174818823},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1429,"ts":"2026-05-22T07:04:09.097Z","type":"controls.start","payload":{"startPosition":{"x":-502.9804859403006,"y":-405.2832509834484,"z":-17.361097174818823},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449414,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-502.9804859403006,"y":-405.2832509834484,"z":-17.361097174818823},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1430,"ts":"2026-05-22T07:04:09.097Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449414,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-499.81242558990306,"y":-402.730544001744,"z":-17.251747000932614},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1431,"ts":"2026-05-22T07:04:09.098Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449414,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-499.81242558990306,"y":-402.730544001744,"z":-17.251747000932614},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1432,"ts":"2026-05-22T07:04:09.110Z","type":"controls.start","payload":{"startPosition":{"x":-499.81242558990306,"y":-402.730544001744,"z":-17.251747000932614},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449418,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-499.81242558990306,"y":-402.730544001744,"z":-17.251747000932614},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1433,"ts":"2026-05-22T07:04:09.110Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449418,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-497.41897215977866,"y":-400.80198690190963,"z":-17.169133502506106},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1434,"ts":"2026-05-22T07:04:09.110Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449418,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-497.41897215977866,"y":-400.80198690190963,"z":-17.169133502506106},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1435,"ts":"2026-05-22T07:04:09.117Z","type":"controls.start","payload":{"startPosition":{"x":-497.41897215977866,"y":-400.80198690190963,"z":-17.169133502506106},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-497.41897215977866,"y":-400.80198690190963,"z":-17.169133502506106},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1436,"ts":"2026-05-22T07:04:09.117Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-494.6971736148966,"y":-398.6088613361541,"z":-17.075186698705878},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1437,"ts":"2026-05-22T07:04:09.118Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449430,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-494.6971736148966,"y":-398.6088613361541,"z":-17.075186698705878},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1438,"ts":"2026-05-22T07:04:09.120Z","type":"controls.start","payload":{"startPosition":{"x":-494.6971736148966,"y":-398.6088613361541,"z":-17.075186698705878},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449438,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-494.6971736148966,"y":-398.6088613361541,"z":-17.075186698705878},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1439,"ts":"2026-05-22T07:04:09.121Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449438,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-491.5748137134057,"y":-396.0929781021338,"z":-16.9674139417505},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1440,"ts":"2026-05-22T07:04:09.121Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449438,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-491.5748137134057,"y":-396.0929781021338,"z":-16.9674139417505},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1441,"ts":"2026-05-22T07:04:09.128Z","type":"controls.start","payload":{"startPosition":{"x":-491.5748137134057,"y":-396.0929781021338,"z":-16.9674139417505},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449441,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-491.5748137134057,"y":-396.0929781021338,"z":-16.9674139417505},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1442,"ts":"2026-05-22T07:04:09.128Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449441,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-488.30384995649297,"y":-393.4573553248955,"z":-16.8545119083189},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1443,"ts":"2026-05-22T07:04:09.128Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449441,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-488.30384995649297,"y":-393.4573553248955,"z":-16.8545119083189},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1444,"ts":"2026-05-22T07:04:09.135Z","type":"controls.start","payload":{"startPosition":{"x":-488.30384995649297,"y":-393.4573553248955,"z":-16.8545119083189},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449448,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-488.30384995649297,"y":-393.4573553248955,"z":-16.8545119083189},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1445,"ts":"2026-05-22T07:04:09.135Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449448,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-485.56116959293274,"y":-391.2474039545673,"z":-16.75984433841861},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1446,"ts":"2026-05-22T07:04:09.136Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449448,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-485.56116959293274,"y":-391.2474039545673,"z":-16.75984433841861},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1447,"ts":"2026-05-22T07:04:09.143Z","type":"controls.start","payload":{"startPosition":{"x":-485.56116959293274,"y":-391.2474039545673,"z":-16.75984433841861},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449456,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-485.56116959293274,"y":-391.2474039545673,"z":-16.75984433841861},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1448,"ts":"2026-05-22T07:04:09.143Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449456,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-482.50332176989815,"y":-388.78350219023673,"z":-16.654298308929484},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1449,"ts":"2026-05-22T07:04:09.143Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449456,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-482.50332176989815,"y":-388.78350219023673,"z":-16.654298308929484},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1450,"ts":"2026-05-22T07:04:09.151Z","type":"controls.start","payload":{"startPosition":{"x":-482.50332176989815,"y":-388.78350219023673,"z":-16.654298308929484},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449463,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-482.50332176989815,"y":-388.78350219023673,"z":-16.654298308929484},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1451,"ts":"2026-05-22T07:04:09.151Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449463,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-479.0898013125591,"y":-386.03301244576363,"z":-16.536475725301198},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1452,"ts":"2026-05-22T07:04:09.151Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449463,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-479.0898013125591,"y":-386.03301244576363,"z":-16.536475725301198},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1453,"ts":"2026-05-22T07:04:09.154Z","type":"controls.start","payload":{"startPosition":{"x":-479.0898013125591,"y":-386.03301244576363,"z":-16.536475725301198},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449471,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-479.0898013125591,"y":-386.03301244576363,"z":-16.536475725301198},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1454,"ts":"2026-05-22T07:04:09.154Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449471,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-475.77408807538245,"y":-383.3613321765389,"z":-16.422029098993534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1455,"ts":"2026-05-22T07:04:09.155Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449471,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-475.77408807538245,"y":-383.3613321765389,"z":-16.422029098993534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1456,"ts":"2026-05-22T07:04:09.167Z","type":"controls.start","payload":{"startPosition":{"x":-475.77408807538245,"y":-383.3613321765389,"z":-16.422029098993534},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449475,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-475.77408807538245,"y":-383.3613321765389,"z":-16.422029098993534},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1457,"ts":"2026-05-22T07:04:09.167Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449475,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-471.911783615082,"y":-380.2492287218052,"z":-16.28871608799539},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1458,"ts":"2026-05-22T07:04:09.167Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449475,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-471.911783615082,"y":-380.2492287218052,"z":-16.28871608799539},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1459,"ts":"2026-05-22T07:04:09.171Z","type":"controls.start","payload":{"startPosition":{"x":-471.911783615082,"y":-380.2492287218052,"z":-16.28871608799539},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449487,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-471.911783615082,"y":-380.2492287218052,"z":-16.28871608799539},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1460,"ts":"2026-05-22T07:04:09.171Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449487,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-467.7525673299162,"y":-376.8978845947184,"z":-16.14515473697625},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1461,"ts":"2026-05-22T07:04:09.171Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449487,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-467.7525673299162,"y":-376.8978845947184,"z":-16.14515473697625},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1462,"ts":"2026-05-22T07:04:09.179Z","type":"controls.start","payload":{"startPosition":{"x":-467.7525673299162,"y":-376.8978845947184,"z":-16.14515473697625},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449491,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-467.7525673299162,"y":-376.8978845947184,"z":-16.14515473697625},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1463,"ts":"2026-05-22T07:04:09.179Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449491,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-462.0316057178043,"y":-372.2881432911891,"z":-15.94768749270413},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1464,"ts":"2026-05-22T07:04:09.179Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449491,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-462.0316057178043,"y":-372.2881432911891,"z":-15.94768749270413},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1465,"ts":"2026-05-22T07:04:09.187Z","type":"controls.start","payload":{"startPosition":{"x":-462.0316057178043,"y":-372.2881432911891,"z":-15.94768749270413},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449499,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_configure_request_pipeline_routing_auth_antiforgery_static_assets_hubs_225","cameraPosition":{"x":-462.0316057178043,"y":-372.2881432911891,"z":-15.94768749270413},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1466,"ts":"2026-05-22T07:04:09.187Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449499,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_configure_request_pipeline_routing_auth_antiforgery_static_assets_hubs_225","cameraPosition":{"x":-454.30666371239477,"y":-366.06366799418413,"z":-15.681049973805091},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1467,"ts":"2026-05-22T07:04:09.187Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449499,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_configure_request_pipeline_routing_auth_antiforgery_static_assets_hubs_225","cameraPosition":{"x":-454.30666371239477,"y":-366.06366799418413,"z":-15.681049973805091},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1468,"ts":"2026-05-22T07:04:09.191Z","type":"controls.start","payload":{"startPosition":{"x":-454.30666371239477,"y":-366.06366799418413,"z":-15.681049973805091},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449507,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_configure_request_pipeline_routing_auth_antiforgery_static_assets_hubs_225","cameraPosition":{"x":-454.30666371239477,"y":-366.06366799418413,"z":-15.681049973805091},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1469,"ts":"2026-05-22T07:04:09.191Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449507,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_configure_request_pipeline_routing_auth_antiforgery_static_assets_hubs_225","cameraPosition":{"x":-445.8890868480517,"y":-359.28109289963277,"z":-15.39050516341316},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1470,"ts":"2026-05-22T07:04:09.191Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449507,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_configure_request_pipeline_routing_auth_antiforgery_static_assets_hubs_225","cameraPosition":{"x":-445.8890868480517,"y":-359.28109289963277,"z":-15.39050516341316},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1471,"ts":"2026-05-22T07:04:09.200Z","type":"controls.start","payload":{"startPosition":{"x":-445.8890868480517,"y":-359.28109289963277,"z":-15.39050516341316},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449511,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_configure_request_pipeline_routing_auth_antiforgery_static_assets_hubs_225","cameraPosition":{"x":-445.8890868480517,"y":-359.28109289963277,"z":-15.39050516341316},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1472,"ts":"2026-05-22T07:04:09.200Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449511,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_configure_request_pipeline_routing_auth_antiforgery_static_assets_hubs_225","cameraPosition":{"x":-439.4518618299882,"y":-354.09421278090304,"z":-15.168315054256439},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1473,"ts":"2026-05-22T07:04:09.200Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449511,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_configure_request_pipeline_routing_auth_antiforgery_static_assets_hubs_225","cameraPosition":{"x":-439.4518618299882,"y":-354.09421278090304,"z":-15.168315054256439},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1474,"ts":"2026-05-22T07:04:09.207Z","type":"controls.start","payload":{"startPosition":{"x":-439.4518618299882,"y":-354.09421278090304,"z":-15.168315054256439},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449520,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_configure_request_pipeline_routing_auth_antiforgery_static_assets_hubs_225","cameraPosition":{"x":-439.4518618299882,"y":-354.09421278090304,"z":-15.168315054256439},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1475,"ts":"2026-05-22T07:04:09.207Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449520,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_configure_request_pipeline_routing_auth_antiforgery_static_assets_hubs_225","cameraPosition":{"x":-431.39457932664493,"y":-347.6019496845677,"z":-14.890206323568798},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1476,"ts":"2026-05-22T07:04:09.207Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449520,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_configure_request_pipeline_routing_auth_antiforgery_static_assets_hubs_225","cameraPosition":{"x":-431.39457932664493,"y":-347.6019496845677,"z":-14.890206323568798},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1477,"ts":"2026-05-22T07:04:09.211Z","type":"controls.start","payload":{"startPosition":{"x":-431.39457932664493,"y":-347.6019496845677,"z":-14.890206323568798},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449527,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_configure_request_pipeline_routing_auth_antiforgery_static_assets_hubs_225","cameraPosition":{"x":-431.39457932664493,"y":-347.6019496845677,"z":-14.890206323568798},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1478,"ts":"2026-05-22T07:04:09.211Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449527,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_configure_request_pipeline_routing_auth_antiforgery_static_assets_hubs_225","cameraPosition":{"x":-424.9182359567395,"y":-342.3835494308611,"z":-14.666665988058114},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1479,"ts":"2026-05-22T07:04:09.211Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449527,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_configure_request_pipeline_routing_auth_antiforgery_static_assets_hubs_225","cameraPosition":{"x":-424.9182359567395,"y":-342.3835494308611,"z":-14.666665988058114},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1480,"ts":"2026-05-22T07:04:09.222Z","type":"controls.start","payload":{"startPosition":{"x":-424.9182359567395,"y":-342.3835494308611,"z":-14.666665988058114},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449531,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_configure_request_pipeline_routing_auth_antiforgery_static_assets_hubs_225","cameraPosition":{"x":-424.9182359567395,"y":-342.3835494308611,"z":-14.666665988058114},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1481,"ts":"2026-05-22T07:04:09.222Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449531,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_configure_request_pipeline_routing_auth_antiforgery_static_assets_hubs_225","cameraPosition":{"x":-419.07027804148584,"y":-337.6714791582387,"z":-14.464815283152197},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1482,"ts":"2026-05-22T07:04:09.222Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449531,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_configure_request_pipeline_routing_auth_antiforgery_static_assets_hubs_225","cameraPosition":{"x":-419.07027804148584,"y":-337.6714791582387,"z":-14.464815283152197},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1483,"ts":"2026-05-22T07:04:09.230Z","type":"controls.start","payload":{"startPosition":{"x":-419.07027804148584,"y":-337.6714791582387,"z":-14.464815283152197},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449542,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_configure_request_pipeline_routing_auth_antiforgery_static_assets_hubs_225","cameraPosition":{"x":-419.07027804148584,"y":-337.6714791582387,"z":-14.464815283152197},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1484,"ts":"2026-05-22T07:04:09.230Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449542,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_configure_request_pipeline_routing_auth_antiforgery_static_assets_hubs_225","cameraPosition":{"x":-414.8229444087014,"y":-334.2491333002515,"z":-14.318212434743883},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1485,"ts":"2026-05-22T07:04:09.230Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449542,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_configure_request_pipeline_routing_auth_antiforgery_static_assets_hubs_225","cameraPosition":{"x":-414.8229444087014,"y":-334.2491333002515,"z":-14.318212434743883},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1486,"ts":"2026-05-22T07:04:09.237Z","type":"controls.start","payload":{"startPosition":{"x":-414.8229444087014,"y":-334.2491333002515,"z":-14.318212434743883},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449550,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_configure_request_pipeline_routing_auth_antiforgery_static_assets_hubs_225","cameraPosition":{"x":-414.8229444087014,"y":-334.2491333002515,"z":-14.318212434743883},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1487,"ts":"2026-05-22T07:04:09.237Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449550,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_configure_request_pipeline_routing_auth_antiforgery_static_assets_hubs_225","cameraPosition":{"x":-409.6771618109393,"y":-330.10285017720685,"z":-14.140598324023008},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1488,"ts":"2026-05-22T07:04:09.237Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449550,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_configure_request_pipeline_routing_auth_antiforgery_static_assets_hubs_225","cameraPosition":{"x":-409.6771618109393,"y":-330.10285017720685,"z":-14.140598324023008},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1489,"ts":"2026-05-22T07:04:09.240Z","type":"controls.start","payload":{"startPosition":{"x":-409.6771618109393,"y":-330.10285017720685,"z":-14.140598324023008},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449557,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_configure_request_pipeline_routing_auth_antiforgery_static_assets_hubs_225","cameraPosition":{"x":-409.6771618109393,"y":-330.10285017720685,"z":-14.140598324023008},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1490,"ts":"2026-05-22T07:04:09.241Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449557,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_configure_request_pipeline_routing_auth_antiforgery_static_assets_hubs_225","cameraPosition":{"x":-405.5201432211531,"y":-326.75327687255344,"z":-13.99711282963074},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1491,"ts":"2026-05-22T07:04:09.241Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449557,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_configure_request_pipeline_routing_auth_antiforgery_static_assets_hubs_225","cameraPosition":{"x":-405.5201432211531,"y":-326.75327687255344,"z":-13.99711282963074},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1492,"ts":"2026-05-22T07:04:09.248Z","type":"controls.start","payload":{"startPosition":{"x":-405.5201432211531,"y":-326.75327687255344,"z":-13.99711282963074},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449561,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_configure_request_pipeline_routing_auth_antiforgery_static_assets_hubs_225","cameraPosition":{"x":-405.5201432211531,"y":-326.75327687255344,"z":-13.99711282963074},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1493,"ts":"2026-05-22T07:04:09.248Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449561,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_configure_request_pipeline_routing_auth_antiforgery_static_assets_hubs_225","cameraPosition":{"x":-401.940444307998,"y":-323.86888661563677,"z":-13.873554356836916},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1494,"ts":"2026-05-22T07:04:09.248Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449561,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_configure_request_pipeline_routing_auth_antiforgery_static_assets_hubs_225","cameraPosition":{"x":-401.940444307998,"y":-323.86888661563677,"z":-13.873554356836916},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1495,"ts":"2026-05-22T07:04:09.256Z","type":"controls.start","payload":{"startPosition":{"x":-401.940444307998,"y":-323.86888661563677,"z":-13.873554356836916},"startTarget":{"x":0,"y":0,"z":0}},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449568,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_configure_request_pipeline_routing_auth_antiforgery_static_assets_hubs_225","cameraPosition":{"x":-401.940444307998,"y":-323.86888661563677,"z":-13.873554356836916},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1496,"ts":"2026-05-22T07:04:09.256Z","type":"controls.change","payload":{"positionChanged":true,"targetChanged":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449568,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_configure_request_pipeline_routing_auth_antiforgery_static_assets_hubs_225","cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1497,"ts":"2026-05-22T07:04:09.256Z","type":"controls.end","payload":{"changed":true},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449568,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":true,"currentSelectedNodeId":null,"hoveredNodeId":"flow_method_nexusreader_web_program_cs_configure_request_pipeline_routing_auth_antiforgery_static_assets_hubs_225","cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1498,"ts":"2026-05-22T07:04:10.626Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1499,"ts":"2026-05-22T07:04:11.114Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1500,"ts":"2026-05-22T07:04:11.144Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1501,"ts":"2026-05-22T07:04:11.174Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1502,"ts":"2026-05-22T07:04:11.204Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1503,"ts":"2026-05-22T07:04:11.233Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1504,"ts":"2026-05-22T07:04:11.262Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1505,"ts":"2026-05-22T07:04:11.292Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1506,"ts":"2026-05-22T07:04:11.322Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1507,"ts":"2026-05-22T07:04:11.353Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1508,"ts":"2026-05-22T07:04:11.382Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1509,"ts":"2026-05-22T07:04:11.410Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1510,"ts":"2026-05-22T07:04:11.439Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1511,"ts":"2026-05-22T07:04:11.469Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1512,"ts":"2026-05-22T07:04:11.498Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1513,"ts":"2026-05-22T07:04:11.528Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1514,"ts":"2026-05-22T07:04:11.557Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1515,"ts":"2026-05-22T07:04:11.589Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1516,"ts":"2026-05-22T07:04:11.616Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1517,"ts":"2026-05-22T07:04:11.646Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1518,"ts":"2026-05-22T07:04:11.677Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1519,"ts":"2026-05-22T07:04:11.706Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1520,"ts":"2026-05-22T07:04:11.736Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1521,"ts":"2026-05-22T07:04:11.765Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1522,"ts":"2026-05-22T07:04:11.795Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1523,"ts":"2026-05-22T07:04:11.825Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1524,"ts":"2026-05-22T07:04:11.854Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1525,"ts":"2026-05-22T07:04:11.885Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1526,"ts":"2026-05-22T07:04:11.915Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1527,"ts":"2026-05-22T07:04:11.943Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1528,"ts":"2026-05-22T07:04:11.973Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1529,"ts":"2026-05-22T07:04:12.002Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1530,"ts":"2026-05-22T07:04:12.031Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1531,"ts":"2026-05-22T07:04:12.062Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1532,"ts":"2026-05-22T07:04:12.090Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1533,"ts":"2026-05-22T07:04:12.120Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1534,"ts":"2026-05-22T07:04:12.149Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1535,"ts":"2026-05-22T07:04:12.179Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1536,"ts":"2026-05-22T07:04:12.209Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1537,"ts":"2026-05-22T07:04:12.240Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1538,"ts":"2026-05-22T07:04:12.267Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1539,"ts":"2026-05-22T07:04:12.297Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1540,"ts":"2026-05-22T07:04:12.327Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1541,"ts":"2026-05-22T07:04:12.357Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1542,"ts":"2026-05-22T07:04:12.388Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1543,"ts":"2026-05-22T07:04:12.415Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1544,"ts":"2026-05-22T07:04:12.446Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1545,"ts":"2026-05-22T07:04:12.474Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1546,"ts":"2026-05-22T07:04:12.504Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1547,"ts":"2026-05-22T07:04:12.535Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1548,"ts":"2026-05-22T07:04:12.563Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1549,"ts":"2026-05-22T07:04:12.594Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1550,"ts":"2026-05-22T07:04:12.621Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1551,"ts":"2026-05-22T07:04:12.651Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1552,"ts":"2026-05-22T07:04:12.680Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1553,"ts":"2026-05-22T07:04:12.710Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1554,"ts":"2026-05-22T07:04:12.740Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1555,"ts":"2026-05-22T07:04:12.770Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1556,"ts":"2026-05-22T07:04:12.798Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1557,"ts":"2026-05-22T07:04:12.828Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1558,"ts":"2026-05-22T07:04:12.858Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1559,"ts":"2026-05-22T07:04:12.887Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1560,"ts":"2026-05-22T07:04:12.917Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1561,"ts":"2026-05-22T07:04:12.946Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1562,"ts":"2026-05-22T07:04:12.976Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1563,"ts":"2026-05-22T07:04:13.006Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1564,"ts":"2026-05-22T07:04:13.035Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1565,"ts":"2026-05-22T07:04:13.068Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1566,"ts":"2026-05-22T07:04:13.095Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1567,"ts":"2026-05-22T07:04:13.124Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1568,"ts":"2026-05-22T07:04:13.155Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1569,"ts":"2026-05-22T07:04:13.185Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1570,"ts":"2026-05-22T07:04:13.216Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1571,"ts":"2026-05-22T07:04:13.246Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1572,"ts":"2026-05-22T07:04:13.274Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1573,"ts":"2026-05-22T07:04:13.303Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1574,"ts":"2026-05-22T07:04:13.333Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1575,"ts":"2026-05-22T07:04:13.362Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1576,"ts":"2026-05-22T07:04:13.392Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1577,"ts":"2026-05-22T07:04:13.425Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1578,"ts":"2026-05-22T07:04:13.456Z","type":"key.down","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1579,"ts":"2026-05-22T07:04:13.487Z","type":"key.up","payload":{"key":"z","code":"KeyZ","altKey":false,"ctrlKey":false,"metaKey":false,"shiftKey":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1580,"ts":"2026-05-22T07:04:17.307Z","type":"window.blur","payload":{},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} +{"seq":1581,"ts":"2026-05-22T07:04:17.307Z","type":"shortcut.radial.menu.hide","payload":{"hadAnchor":false},"state":{"focusedNodeId":null,"currentPointerMode":"cursor","ctrlModifierPressed":false,"ctrlRadialMenuActive":false,"suppressNodeClickUntil":1779433449576,"hasFocusedNodeRefocusTimer":false,"graphControlsChanged":false,"currentSelectedNodeId":null,"hoveredNodeId":null,"cameraPosition":{"x":-399.0640979733857,"y":-321.5512321021288,"z":-13.774273113091876},"cameraTarget":{"x":0,"y":0,"z":0}}} diff --git a/src/.documentation/.metadata.json b/src/.documentation/.metadata.json new file mode 100644 index 0000000..b1db7c9 --- /dev/null +++ b/src/.documentation/.metadata.json @@ -0,0 +1,37 @@ +{ + "generatedAt": "2026-05-22T06:58:01.149Z", + "runId": "v4-1779429619297-t7x306q1", + "agentVersion": "v4.1-streaming", + "totalDurationMs": 3461851, + "phaseTiming": { + "phase0": 934, + "phase1": 53278, + "pipeline": 3377465, + "phase5": 29989 + }, + "config": { + "llmCandidateCount": 5, + "maxConcurrentLlmCalls": 5, + "featureFlags": { + "architectureMappingMode": false, + "boundedSubsystemMode": false, + "architectureMapPersistence": false, + "chunkPlanning": false, + "sequenceDiagrams": false, + "stateDiagrams": false, + "erDiagrams": false, + "experimentalDiagramFamilies": false, + "publicationCollections": true, + "businessFlowGeneration": true + } + }, + "project": { + "technology": "dotnet", + "totalFiles": 198, + "uniqueFilesSummarized": 189, + "documentsGenerated": 10, + "collectionsPlanned": 4, + "projectArchetype": "web-application", + "candidateEntrypoints": 20 + } +} \ No newline at end of file diff --git a/src/.documentation/artifact-manifest.json b/src/.documentation/artifact-manifest.json new file mode 100644 index 0000000..031dd8a --- /dev/null +++ b/src/.documentation/artifact-manifest.json @@ -0,0 +1,1273 @@ +{ + "version": 1, + "generatedAt": "2026-05-22T06:58:01.262Z", + "root": ".documentation", + "runId": "v4-1779429619297-t7x306q1", + "artifacts": [ + { + "path": ".metadata.json", + "category": "machine", + "kind": "run-metadata" + }, + { + "path": "artifact-manifest.json", + "category": "machine", + "kind": "artifact-manifest" + }, + { + "path": "business/business-overview.md", + "category": "published", + "kind": "document" + }, + { + "path": "business/business-overview.meta.json", + "category": "machine", + "kind": "document-metadata" + }, + { + "path": "business/index.md", + "category": "published", + "kind": "collection-index" + }, + { + "path": "business/top-business-flows.md", + "category": "published", + "kind": "document" + }, + { + "path": "business/top-business-flows.meta.json", + "category": "machine", + "kind": "document-metadata" + }, + { + "path": "cache/summaries/NexusReader.Application__Abstractions__Messaging__ICommand.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__Abstractions__Messaging__ICommandHandler.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__Abstractions__Messaging__IQuery.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__Abstractions__Messaging__IQueryHandler.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__Abstractions__Messaging__ISyncBroadcaster.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__Abstractions__Persistence__IEbookRepository.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__Abstractions__Services__IBillingService.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__Abstractions__Services__IBookStorageService.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__Abstractions__Services__IEpubMetadataExtractor.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__Abstractions__Services__IEpubReader.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__Abstractions__Services__IIdentityService.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__Abstractions__Services__IKnowledgeService.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__Abstractions__Services__INativeStorageService.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__Abstractions__Services__IPlatformService.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__Commands__AI__VerifyGroundednessCommand.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__Commands__Library__IngestEbookCommand.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__Commands__Library__IngestEbookCommandHandler.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__Commands__Library__IngestEbookRequest.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__Commands__Quiz__SubmitAnswerCommand.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__Commands__Quiz__SubmitAnswerCommandHandler.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__Commands__Sync__UpdateReadingProgressCommand.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__Commands__Sync__UpdateReadingProgressCommandHandler.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__Common__AppJsonContext.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__Constants__PlanConstants.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__Constants__StorageKeys.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__DependencyInjection.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__DTOs__AI__GroundedResponseDto.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__DTOs__AI__KnowledgePacket.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__DTOs__AI__RelevantContext.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__DTOs__AI__SemanticSearchResultDto.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__DTOs__User__AuthorDto.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__DTOs__User__SubscriptionPlanDto.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__DTOs__User__UserProfileDto.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__Mappings__MappingConfig.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__NexusReader.Application.csproj.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__Queries__Graph__GetKnowledgeGraphQuery.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__Queries__Graph__GetKnowledgeGraphQueryHandler.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__Queries__Graph__GraphViewModels.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__Queries__Library__AskLibraryQuestionQuery.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__Queries__Library__GetMyEbooksQuery.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__Queries__Library__SearchLibrarySemanticallyQuery.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__Queries__Quiz__QuizViewModels.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__Queries__Reader__GetReaderPageQuery.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__Queries__Reader__GetReaderPageQueryHandler.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__Queries__Reader__LocalEpubMetadata.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__Queries__Reader__ViewModels.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__Queries__System__GetInitializationStatusQuery.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__Queries__System__GetInitializationStatusQueryHandler.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__Queries__User__GetUserProfileQuery.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__Queries__User__GetUserProfileQueryHandler.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__Security__Authorization__ProUserHandler.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Application__Security__Authorization__ProUserRequirement.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Data__Migrations__20260428184727_InitialPostgres.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Data__Migrations__20260428184727_InitialPostgres.Designer.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Data__Migrations__20260428185239_IncreaseHashLength.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Data__Migrations__20260428185239_IncreaseHashLength.Designer.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Data__Migrations__20260429080302_AddQuizResults.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Data__Migrations__20260429080302_AddQuizResults.Designer.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Data__Migrations__20260503175906_FinalNormalizedSubscriptionArchitecture.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Data__Migrations__20260503175906_FinalNormalizedSubscriptionArchitecture.Designer.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Data__Migrations__20260506184227_UpdateSubscriptionPlanIsUnlimitedTokens.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Data__Migrations__20260506184227_UpdateSubscriptionPlanIsUnlimitedTokens.Designer.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Data__Migrations__20260510151022_NormalizeAuthor.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Data__Migrations__20260510151022_NormalizeAuthor.Designer.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Data__Migrations__20260510161155_AddEbookProgressAndChapter.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Data__Migrations__20260510161155_AddEbookProgressAndChapter.Designer.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Data__Migrations__20260510171941_AddEbookLastChapterIndex.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Data__Migrations__20260510171941_AddEbookLastChapterIndex.Designer.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Data__Migrations__AppDbContextModelSnapshot.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Data__NexusReader.Data.csproj.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Data__Persistence__AppDbContext.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Data__Persistence__AppDbContextFactory.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Data__Persistence__DbInitializer.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Data__Persistence__Migrations__20260513181743_AddEbookReadyFlag.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Data__Persistence__Migrations__20260513181743_AddEbookReadyFlag.Designer.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Data__Persistence__Migrations__20260513183726_FixKnowledgeUnitEbookId.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Data__Persistence__Migrations__20260513183726_FixKnowledgeUnitEbookId.Designer.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Data__Persistence__Migrations__20260513185108_MakeKnowledgeUnitEbookIdNullable.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Data__Persistence__Migrations__20260513185108_MakeKnowledgeUnitEbookIdNullable.Designer.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Data__Persistence__Migrations__20260514184243_AddDescriptionToEbook.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Data__Persistence__Migrations__20260514184243_AddDescriptionToEbook.Designer.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Domain__Entities__Author.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Domain__Entities__Ebook.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Domain__Entities__KnowledgeUnit.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Domain__Entities__KnowledgeUnitLink.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Domain__Entities__NexusUser.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Domain__Entities__QuizResult.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Domain__Entities__SemanticKnowledgeCache.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Domain__Entities__SubscriptionPlan.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Domain__Enums__KnowledgeUnitType.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Domain__NexusReader.Domain.csproj.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Infrastructure__Configuration__AiSettings.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Infrastructure__Configuration__StripeSettings.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Infrastructure__DependencyInjection.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Infrastructure__Helpers__ContentHasher.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Infrastructure__Helpers__JsonRepairHelper.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Infrastructure__Identity__TokenLimitHandler.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Infrastructure__Identity__TokenLimitRequirement.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Infrastructure__NexusReader.Infrastructure.csproj.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Infrastructure__Persistence__EbookRepository.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Infrastructure__RealTime__SignalRSyncBroadcaster.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Infrastructure__RealTime__SyncHub.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Infrastructure__Services__BillingService.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Infrastructure__Services__BookStorageService.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Infrastructure__Services__EpubMetadataExtractor.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Infrastructure__Services__EpubReaderService.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Infrastructure__Services__KnowledgeService.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Infrastructure__Services__PromptRegistry.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Infrastructure.Mobile__Class1.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Infrastructure.Mobile__NexusReader.Infrastructure.Mobile.csproj.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Infrastructure.Mobile__Services__MauiPlatformService.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Infrastructure.Mobile__Services__MauiStorageService.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Maui___Imports.razor.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Maui__App.xaml.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Maui__Main.razor.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Maui__MainPage.xaml.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Maui__MauiProgram.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Maui__NexusReader.Maui.csproj.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Maui__Platforms__Android__MainActivity.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Maui__Platforms__Android__MainApplication.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Maui__Services__MauiStorageService.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared___Imports.razor.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Components__Atoms__NexusButton.razor.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Components__Atoms__NexusIcon.razor.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Components__Atoms__NexusSearchBox.razor.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Components__Atoms__NexusTypography.razor.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Components__Molecules__AiAssistantBubble.razor.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Components__Molecules__GroundednessBadge.razor.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Components__Molecules__IntelligenceToolbar.razor.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Components__Molecules__KnowledgeCheck.razor.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Components__Molecules__SelectionAiPanel.razor.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Components__Organisms__BookIngestionModal.razor.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Components__Organisms__CurrentReadingWidget.razor.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Components__Organisms__GlobalIntelligencePanel.razor.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Components__Organisms__KnowledgeGraph.razor.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Components__Organisms__ReaderCanvas.razor.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Components__Organisms__ReaderFooter.razor.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Components__RedirectToLogin.razor.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Layout__AuthLayout.razor.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Layout__MainHubLayout.razor.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Layout__ReaderLayout.razor.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Layout__ReconnectModal.razor.js.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Layout__ReconnectModal.razor.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__NexusReader.UI.Shared.csproj.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Pages__Account__Login.razor.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Pages__Account__Profile.razor.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Pages__Account__Register.razor.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Pages__Dashboard.razor.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Pages__Home.razor.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Pages__Intelligence.razor.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Pages__Library.razor.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Pages__NotFound.razor.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Pages__Settings.razor.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Routes.razor.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Services__FocusModeService.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Services__IdentityService.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Services__IFocusModeService.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Services__IKnowledgeGraphService.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Services__IQuizStateService.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Services__IReaderInteractionService.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Services__IReaderNavigationService.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Services__ISyncService.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Services__IThemeService.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Services__KnowledgeCoordinator.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Services__KnowledgeGraphService.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Services__NexusAuthenticationStateProvider.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Services__QuizStateService.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Services__ReaderInteractionService.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Services__ReaderNavigationService.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Services__SyncService.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Services__ThemeService.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.UI.Shared__Services__WebStorageService.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Web__appsettings.Development.json.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Web__appsettings.json.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Web__Components___Imports.razor.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Web__Components__App.razor.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Web__Components__Error.razor.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Web__Components__Pages__Error.razor.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Web__NexusReader.Web.csproj.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Web__Program.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Web__Properties__launchSettings.json.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Web__Services__NativeStorageService.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Web__Services__ServerIdentityService.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Web.Client__Handlers__AuthenticationHeaderHandler.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Web.Client__NexusReader.Web.Client.csproj.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Web.Client__Program.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Web.Client__Services__WasmEpubService.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Web.Client__Services__WasmKnowledgeService.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "cache/summaries/NexusReader.Web.Client__Services__WebPlatformService.cs.json", + "category": "cache", + "kind": "summary-cache" + }, + { + "path": "collections/index.md", + "category": "published", + "kind": "collection-index" + }, + { + "path": "collections/overview.md", + "category": "published", + "kind": "document" + }, + { + "path": "collections/overview.meta.json", + "category": "machine", + "kind": "document-metadata" + }, + { + "path": "debug/business/business-overview.views.debug.json", + "category": "debug", + "kind": "debug-artifact" + }, + { + "path": "debug/business/top-business-flows.views.debug.json", + "category": "debug", + "kind": "debug-artifact" + }, + { + "path": "debug/collections/overview.views.debug.json", + "category": "debug", + "kind": "debug-artifact" + }, + { + "path": "debug/domains/application-layer.views.debug.json", + "category": "debug", + "kind": "debug-artifact" + }, + { + "path": "debug/domains/data-and-persistence.views.debug.json", + "category": "debug", + "kind": "debug-artifact" + }, + { + "path": "debug/domains/infrastructure-services.views.debug.json", + "category": "debug", + "kind": "debug-artifact" + }, + { + "path": "debug/domains/maui-mobile.views.debug.json", + "category": "debug", + "kind": "debug-artifact" + }, + { + "path": "debug/flows/realtime-and-sync.views.debug.json", + "category": "debug", + "kind": "debug-artifact" + }, + { + "path": "debug/flows/security-identity-auth.views.debug.json", + "category": "debug", + "kind": "debug-artifact" + }, + { + "path": "debug/flows/web-client-wasm.views.debug.json", + "category": "debug", + "kind": "debug-artifact" + }, + { + "path": "debug/planning.debug.json", + "category": "debug", + "kind": "debug-artifact" + }, + { + "path": "debug/semantic-map.debug.json", + "category": "debug", + "kind": "debug-artifact" + }, + { + "path": "domains/application-layer.md", + "category": "published", + "kind": "document" + }, + { + "path": "domains/application-layer.meta.json", + "category": "machine", + "kind": "document-metadata" + }, + { + "path": "domains/data-and-persistence.md", + "category": "published", + "kind": "document" + }, + { + "path": "domains/data-and-persistence.meta.json", + "category": "machine", + "kind": "document-metadata" + }, + { + "path": "domains/index.md", + "category": "published", + "kind": "collection-index" + }, + { + "path": "domains/infrastructure-services.md", + "category": "published", + "kind": "document" + }, + { + "path": "domains/infrastructure-services.meta.json", + "category": "machine", + "kind": "document-metadata" + }, + { + "path": "domains/maui-mobile.md", + "category": "published", + "kind": "document" + }, + { + "path": "domains/maui-mobile.meta.json", + "category": "machine", + "kind": "document-metadata" + }, + { + "path": "flows/index.md", + "category": "published", + "kind": "collection-index" + }, + { + "path": "flows/realtime-and-sync.md", + "category": "published", + "kind": "document" + }, + { + "path": "flows/realtime-and-sync.meta.json", + "category": "machine", + "kind": "document-metadata" + }, + { + "path": "flows/security-identity-auth.md", + "category": "published", + "kind": "document" + }, + { + "path": "flows/security-identity-auth.meta.json", + "category": "machine", + "kind": "document-metadata" + }, + { + "path": "flows/web-client-wasm.md", + "category": "published", + "kind": "document" + }, + { + "path": "flows/web-client-wasm.meta.json", + "category": "machine", + "kind": "document-metadata" + }, + { + "path": "index.md", + "category": "published", + "kind": "root-index" + }, + { + "path": "index.meta.json", + "category": "machine", + "kind": "document-metadata" + }, + { + "path": "machine/business-map.json", + "category": "machine", + "kind": "machine-json" + }, + { + "path": "machine/context-bags/application_layer_md.context-bag.json", + "category": "machine", + "kind": "machine-json" + }, + { + "path": "machine/context-bags/business_overview_md.context-bag.json", + "category": "machine", + "kind": "machine-json" + }, + { + "path": "machine/context-bags/data_and_persistence_md.context-bag.json", + "category": "machine", + "kind": "machine-json" + }, + { + "path": "machine/context-bags/infrastructure_services_md.context-bag.json", + "category": "machine", + "kind": "machine-json" + }, + { + "path": "machine/context-bags/maui_mobile_md.context-bag.json", + "category": "machine", + "kind": "machine-json" + }, + { + "path": "machine/context-bags/overview_md.context-bag.json", + "category": "machine", + "kind": "machine-json" + }, + { + "path": "machine/context-bags/realtime_and_sync_md.context-bag.json", + "category": "machine", + "kind": "machine-json" + }, + { + "path": "machine/context-bags/security_identity_auth_md.context-bag.json", + "category": "machine", + "kind": "machine-json" + }, + { + "path": "machine/context-bags/top_business_flows_md.context-bag.json", + "category": "machine", + "kind": "machine-json" + }, + { + "path": "machine/context-bags/web_client_wasm_md.context-bag.json", + "category": "machine", + "kind": "machine-json" + }, + { + "path": "machine/flow-catalog.json", + "category": "machine", + "kind": "machine-json" + }, + { + "path": "machine/flow-selection.json", + "category": "machine", + "kind": "machine-json" + }, + { + "path": "machine/phase-inputs/business__business-overview.phase-inputs.json", + "category": "machine", + "kind": "machine-json" + }, + { + "path": "machine/phase-inputs/business__top-business-flows.phase-inputs.json", + "category": "machine", + "kind": "machine-json" + }, + { + "path": "machine/phase-inputs/collections__overview.phase-inputs.json", + "category": "machine", + "kind": "machine-json" + }, + { + "path": "machine/phase-inputs/domains__application-layer.phase-inputs.json", + "category": "machine", + "kind": "machine-json" + }, + { + "path": "machine/phase-inputs/domains__data-and-persistence.phase-inputs.json", + "category": "machine", + "kind": "machine-json" + }, + { + "path": "machine/phase-inputs/domains__infrastructure-services.phase-inputs.json", + "category": "machine", + "kind": "machine-json" + }, + { + "path": "machine/phase-inputs/domains__maui-mobile.phase-inputs.json", + "category": "machine", + "kind": "machine-json" + }, + { + "path": "machine/phase-inputs/flows__realtime-and-sync.phase-inputs.json", + "category": "machine", + "kind": "machine-json" + }, + { + "path": "machine/phase-inputs/flows__security-identity-auth.phase-inputs.json", + "category": "machine", + "kind": "machine-json" + }, + { + "path": "machine/phase-inputs/flows__web-client-wasm.phase-inputs.json", + "category": "machine", + "kind": "machine-json" + }, + { + "path": "machine/run-validation.json", + "category": "machine", + "kind": "machine-json" + } + ] +} \ No newline at end of file diff --git a/src/.documentation/business/business-overview.md b/src/.documentation/business/business-overview.md new file mode 100644 index 0000000..4656031 --- /dev/null +++ b/src/.documentation/business/business-overview.md @@ -0,0 +1,341 @@ +## Business Overview + +Business Overview centers on account, ai token usage / limits, ai tokens and currently highlights Authentication (Login/Register) Flow as the most representative business flow. + +### Business Summary + +- Domains: 37 +- Capabilities: 6 +- Flows: 6 +- Source summaries used: 15 +- Technical flow inputs used: 6 + +### Business Domains + +- **account** (high confidence): Business Overview is currently grounded only by document anchors and still lacks a verified cross-file execution narrative. +- **ai token usage / limits** (high confidence): Business Overview is currently grounded only by document anchors and still lacks a verified cross-file execution narrative. +- **ai tokens** (high confidence): Business Overview is currently grounded only by document anchors and still lacks a verified cross-file execution narrative. +- **ai tokens (aitokensused, aitokenlimit)** (high confidence): Business Overview is currently grounded only by document anchors and still lacks a verified cross-file execution narrative. +- **auth** (high confidence): Business Overview is currently grounded only by document anchors and still lacks a verified cross-file execution narrative. +- **authentication** (high confidence): Business Overview is currently grounded only by document anchors and still lacks a verified cross-file execution narrative. +- **author** (high confidence): Business Overview is currently grounded only by document anchors and still lacks a verified cross-file execution narrative. +- **authorization policy** (high confidence): Business Overview is currently grounded only by document anchors and still lacks a verified cross-file execution narrative. +- **command** (high confidence): Business Overview is currently grounded only by document anchors and still lacks a verified cross-file execution narrative. +- **cookie based sign in** (high confidence): Business Overview is currently grounded only by document anchors and still lacks a verified cross-file execution narrative. +- **ebook** (high confidence): Business Overview is currently grounded only by document anchors and still lacks a verified cross-file execution narrative. +- **ebook / epub ingestion** (high confidence): Business Overview is currently grounded only by document anchors and still lacks a verified cross-file execution narrative. +- **embedding** (high confidence): Business Overview is currently grounded only by document anchors and still lacks a verified cross-file execution narrative. +- **external (google) login** (high confidence): Business Overview is currently grounded only by document anchors and still lacks a verified cross-file execution narrative. +- **identity (authenticationstateprovider)** (high confidence): Business Overview is currently grounded only by document anchors and still lacks a verified cross-file execution narrative. +- **jwt** (high confidence): Business Overview is currently grounded only by document anchors and still lacks a verified cross-file execution narrative. +- **knowledge (knowledge service, graph, summary)** (high confidence): Business Overview is currently grounded only by document anchors and still lacks a verified cross-file execution narrative. +- **knowledgegraph / knowledgecoordinator** (high confidence): Business Overview is currently grounded only by document anchors and still lacks a verified cross-file execution narrative. +- **nexususer (identity)** (high confidence): Business Overview is currently grounded only by document anchors and still lacks a verified cross-file execution narrative. +- **pro subscription** (high confidence): Business Overview is currently grounded only by document anchors and still lacks a verified cross-file execution narrative. +- **query** (high confidence): Business Overview is currently grounded only by document anchors and still lacks a verified cross-file execution narrative. +- **quiz state** (high confidence): Business Overview is currently grounded only by document anchors and still lacks a verified cross-file execution narrative. +- **reader navigation** (high confidence): Business Overview is currently grounded only by document anchors and still lacks a verified cross-file execution narrative. +- **real time sync/broadcast** (high confidence): Business Overview is currently grounded only by document anchors and still lacks a verified cross-file execution narrative. +- **result** (high confidence): Business Overview is currently grounded only by document anchors and still lacks a verified cross-file execution narrative. +- **result** (high confidence): Business Overview is currently grounded only by document anchors and still lacks a verified cross-file execution narrative. +- **secure client storage** (high confidence): Business Overview is currently grounded only by document anchors and still lacks a verified cross-file execution narrative. +- **session/cookie sign in orchestration** (high confidence): Business Overview is currently grounded only by document anchors and still lacks a verified cross-file execution narrative. +- **subscription / plan** (high confidence): Business Overview is currently grounded only by document anchors and still lacks a verified cross-file execution narrative. +- **subscriptionplan** (high confidence): Business Overview is currently grounded only by document anchors and still lacks a verified cross-file execution narrative. +- **sync** (high confidence): Business Overview is currently grounded only by document anchors and still lacks a verified cross-file execution narrative. +- **tenantid** (high confidence): Business Overview is currently grounded only by document anchors and still lacks a verified cross-file execution narrative. +- **theme & focus mode** (high confidence): Business Overview is currently grounded only by document anchors and still lacks a verified cross-file execution narrative. +- **token refresh** (high confidence): Business Overview is currently grounded only by document anchors and still lacks a verified cross-file execution narrative. +- **user** (high confidence): Business Overview is currently grounded only by document anchors and still lacks a verified cross-file execution narrative. +- **user registration** (high confidence): Business Overview is currently grounded only by document anchors and still lacks a verified cross-file execution narrative. +- **userprofile** (high confidence): Business Overview is currently grounded only by document anchors and still lacks a verified cross-file execution narrative. + +### Business Capabilities + +- **Authentication (Login/Register) Flow** (high confidence): Authentication (Login/Register) Flow coordinates 5 business-relevant steps beginning at NexusReader.UI.Shared/Pages/Account/Login.razor. Domains: account, ai token usage / limits, ai tokens, ai tokens (aitokensused, aitokenlimit), auth, authentication, author, authorization policy, command, cookie based sign in, ebook, ebook / epub ingestion, embedding, external (google) login, identity (authenticationstateprovider), jwt, knowledge (knowledge service, graph, summary), knowledgegraph / knowledgecoordinator, nexususer (identity), pro subscription, query, quiz state, reader navigation, real time sync/broadcast, result, result, secure client storage, session/cookie sign in orchestration, subscription / plan, subscriptionplan, sync, tenantid, theme & focus mode, token refresh, user, user registration, userprofile. Entrypoints: NexusReader.UI.Shared/Pages/Account/Login.razor, NexusReader.Web.Client/Program.cs, NexusReader.Maui/MauiProgram.cs. +- **HTTP Request + Token Refresh Flow** (high confidence): HTTP Request + Token Refresh Flow coordinates 4 business-relevant steps beginning at NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs. Domains: account, ai token usage / limits, ai tokens, ai tokens (aitokensused, aitokenlimit), auth, authentication, author, authorization policy, command, cookie based sign in, ebook, ebook / epub ingestion, embedding, external (google) login, identity (authenticationstateprovider), jwt, knowledge (knowledge service, graph, summary), knowledgegraph / knowledgecoordinator, nexususer (identity), pro subscription, query, quiz state, reader navigation, real time sync/broadcast, result, result, secure client storage, session/cookie sign in orchestration, subscription / plan, subscriptionplan, sync, tenantid, theme & focus mode, token refresh, user, user registration, userprofile. Entrypoints: NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs, NexusReader.Web.Client/Program.cs, NexusReader.Maui/MauiProgram.cs. +- **Knowledge Query API Flow** (high confidence): Knowledge Query API Flow coordinates 4 business-relevant steps beginning at NexusReader.Web/Program.cs. Domains: account, ai token usage / limits, ai tokens, ai tokens (aitokensused, aitokenlimit), auth, authentication, author, authorization policy, command, cookie based sign in, ebook, ebook / epub ingestion, embedding, external (google) login, identity (authenticationstateprovider), jwt, knowledge (knowledge service, graph, summary), knowledgegraph / knowledgecoordinator, nexususer (identity), pro subscription, query, quiz state, reader navigation, real time sync/broadcast, result, result, secure client storage, session/cookie sign in orchestration, subscription / plan, subscriptionplan, sync, tenantid, theme & focus mode, token refresh, user, user registration, userprofile. Entrypoints: NexusReader.Web/Program.cs, NexusReader.Web.Client/Program.cs, NexusReader.Maui/MauiProgram.cs. +- **Program (top level)** (high confidence): Program (top level) coordinates 8 business-relevant steps beginning at NexusReader.Web/Program.cs. Domains: account, ai token usage / limits, ai tokens, ai tokens (aitokensused, aitokenlimit), auth, authentication, author, authorization policy, command, cookie based sign in, ebook, ebook / epub ingestion, embedding, external (google) login, identity (authenticationstateprovider), jwt, knowledge (knowledge service, graph, summary), knowledgegraph / knowledgecoordinator, nexususer (identity), pro subscription, query, quiz state, reader navigation, real time sync/broadcast, result, result, secure client storage, session/cookie sign in orchestration, subscription / plan, subscriptionplan, sync, tenantid, theme & focus mode, token refresh, user, user registration, userprofile. Entrypoints: NexusReader.Web/Program.cs, NexusReader.Web.Client/Program.cs, NexusReader.Maui/MauiProgram.cs. +- **Ensure Database Initialized** (high confidence): Ensure Database Initialized coordinates 4 business-relevant steps beginning at NexusReader.Web/Program.cs. Domains: account, ai token usage / limits, ai tokens, ai tokens (aitokensused, aitokenlimit), auth, authentication, author, authorization policy, command, cookie based sign in, ebook, ebook / epub ingestion, embedding, external (google) login, identity (authenticationstateprovider), jwt, knowledge (knowledge service, graph, summary), knowledgegraph / knowledgecoordinator, nexususer (identity), pro subscription, query, quiz state, reader navigation, real time sync/broadcast, result, result, secure client storage, session/cookie sign in orchestration, subscription / plan, subscriptionplan, sync, tenantid, theme & focus mode, token refresh, user, user registration, userprofile. Entrypoints: NexusReader.Web/Program.cs, NexusReader.Web.Client/Program.cs, NexusReader.Maui/MauiProgram.cs. +- **Handle Subscription Success** (high confidence): Handle Subscription Success coordinates 4 business-relevant steps beginning at NexusReader.Web/Program.cs. Domains: account, ai token usage / limits, ai tokens, ai tokens (aitokensused, aitokenlimit), auth, authentication, author, authorization policy, command, cookie based sign in, ebook, ebook / epub ingestion, embedding, external (google) login, identity (authenticationstateprovider), jwt, knowledge (knowledge service, graph, summary), knowledgegraph / knowledgecoordinator, nexususer (identity), pro subscription, query, quiz state, reader navigation, real time sync/broadcast, result, result, secure client storage, session/cookie sign in orchestration, subscription / plan, subscriptionplan, sync, tenantid, theme & focus mode, token refresh, user, user registration, userprofile. Entrypoints: NexusReader.Web/Program.cs, NexusReader.Web.Client/Program.cs, NexusReader.Maui/MauiProgram.cs. + +### Major Value Streams + +- **Authentication (Login/Register) Flow** (rank 1, score 0.86, high confidence): Authentication (Login/Register) Flow starts at NexusReader.UI.Shared/Pages/Account/Login.razor and follows 9 grounded steps: Enter Handle Login -> Falls back to alternate path -> Evaluates branch condition -> Reads repository or persistence state -> .... Domains: account, ai token usage / limits, ai tokens, ai tokens (aitokensused, aitokenlimit), auth, authentication, author, authorization policy, command, cookie based sign in, ebook, ebook / epub ingestion, embedding, external (google) login, identity (authenticationstateprovider), jwt, knowledge (knowledge service, graph, summary), knowledgegraph / knowledgecoordinator, nexususer (identity), pro subscription, query, quiz state, reader navigation, real time sync/broadcast, result, result, secure client storage, session/cookie sign in orchestration, subscription / plan, subscriptionplan, sync, tenantid, theme & focus mode, token refresh, user, user registration, userprofile. +- **Ensure Database Initialized** (rank 2, score 0.86, high confidence): Ensure Database Initialized starts at NexusReader.Web/Program.cs and follows 12 grounded steps: Enter Program (top level) -> Falls back to alternate path -> Repeats work over a collection or condition -> Guards early exit or rejection path -> .... Domains: account, ai token usage / limits, ai tokens, ai tokens (aitokensused, aitokenlimit), auth, authentication, author, authorization policy, command, cookie based sign in, ebook, ebook / epub ingestion, embedding, external (google) login, identity (authenticationstateprovider), jwt, knowledge (knowledge service, graph, summary), knowledgegraph / knowledgecoordinator, nexususer (identity), pro subscription, query, quiz state, reader navigation, real time sync/broadcast, result, result, secure client storage, session/cookie sign in orchestration, subscription / plan, subscriptionplan, sync, tenantid, theme & focus mode, token refresh, user, user registration, userprofile. +- **Handle Subscription Success** (rank 3, score 0.86, high confidence): Handle Subscription Success starts at NexusReader.Web/Program.cs and follows 12 grounded steps: Enter Program (top level) -> Falls back to alternate path -> Repeats work over a collection or condition -> Guards early exit or rejection path -> .... Domains: account, ai token usage / limits, ai tokens, ai tokens (aitokensused, aitokenlimit), auth, authentication, author, authorization policy, command, cookie based sign in, ebook, ebook / epub ingestion, embedding, external (google) login, identity (authenticationstateprovider), jwt, knowledge (knowledge service, graph, summary), knowledgegraph / knowledgecoordinator, nexususer (identity), pro subscription, query, quiz state, reader navigation, real time sync/broadcast, result, result, secure client storage, session/cookie sign in orchestration, subscription / plan, subscriptionplan, sync, tenantid, theme & focus mode, token refresh, user, user registration, userprofile. +- **Knowledge Query API Flow** (rank 4, score 0.86, high confidence): Knowledge Query API Flow starts at NexusReader.Web/Program.cs and follows 12 grounded steps: Enter Program (top level) -> Falls back to alternate path -> Repeats work over a collection or condition -> Guards early exit or rejection path -> .... Domains: account, ai token usage / limits, ai tokens, ai tokens (aitokensused, aitokenlimit), auth, authentication, author, authorization policy, command, cookie based sign in, ebook, ebook / epub ingestion, embedding, external (google) login, identity (authenticationstateprovider), jwt, knowledge (knowledge service, graph, summary), knowledgegraph / knowledgecoordinator, nexususer (identity), pro subscription, query, quiz state, reader navigation, real time sync/broadcast, result, result, secure client storage, session/cookie sign in orchestration, subscription / plan, subscriptionplan, sync, tenantid, theme & focus mode, token refresh, user, user registration, userprofile. +- **Program (top level)** (rank 5, score 0.86, high confidence): Program (top level) starts at NexusReader.Web/Program.cs and follows 12 grounded steps: Enter Program (top level) -> Falls back to alternate path -> Repeats work over a collection or condition -> Guards early exit or rejection path -> .... Domains: account, ai token usage / limits, ai tokens, ai tokens (aitokensused, aitokenlimit), auth, authentication, author, authorization policy, command, cookie based sign in, ebook, ebook / epub ingestion, embedding, external (google) login, identity (authenticationstateprovider), jwt, knowledge (knowledge service, graph, summary), knowledgegraph / knowledgecoordinator, nexususer (identity), pro subscription, query, quiz state, reader navigation, real time sync/broadcast, result, result, secure client storage, session/cookie sign in orchestration, subscription / plan, subscriptionplan, sync, tenantid, theme & focus mode, token refresh, user, user registration, userprofile. + +### Diagrams + +Business interpretation diagrams grounded in the selected evidence for this overview scope. + +#### Dependency and Model Map + +```mermaid +--- +config: + flowchart: + defaultRenderer: "elk" +--- +flowchart TD + flow_file_nexusreader_maui_mauiprogram_cs_file_1["MauiProgram"] + flow_file_nexusreader_web_client_program_cs_file_1["Program.cs"] + flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53[/"Handlers from NexusReader.Application assembly"/] + flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38[/"HttpClient (configured)"/] + flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28[/"MauiPlatformService"/] + flow_type_nexusreader_maui_mauiprogram_cs_mauiprogram_10[/"MauiProgram"/] + flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29[/"MauiStorageService"/] + flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32[/"NexusAuthenticationStateProvider"/] + flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33[/"NexusAuthenticationStateProvider (via factory)"/] + flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51[/"NexusReader.Application registrations"/] + flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1[/"ThemeService, FocusModeService, QuizStateService, ReaderNavigationService, KnowledgeGraphService, ReaderInteractionService, KnowledgeCoordinator, SyncService, IdentityService"/] + flow_type_nexusreader_web_client_program_cs_configured_httpclient_40[/"configured HttpClient"/] + flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33[/"NexusAuthenticationStateProvider"/] + flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74[/"ThrowingBookStorageService"/] + flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61[/"ThrowingDbContextFactory"/] + flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84[/"ThrowingEbookRepository"/] + flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66[/"ThrowingEmbeddingGenerator"/] + flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94[/"ThrowingSyncBroadcaster"/] + flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38[/"WasmKnowledgeService"/] + flow_type_nexusreader_web_client_program_cs_webplatformservice_18[/"WebPlatformService"/] + flow_file_nexusreader_maui_mauiprogram_cs_file_1 -->|MediatR handlers| flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53 + flow_file_nexusreader_maui_mauiprogram_cs_file_1 -->|HttpClient| flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38 + flow_file_nexusreader_maui_mauiprogram_cs_file_1 -->|IPlatformService| flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28 + flow_file_nexusreader_maui_mauiprogram_cs_file_1 -->|model MauiProgram| flow_type_nexusreader_maui_mauiprogram_cs_mauiprogram_10 + flow_file_nexusreader_maui_mauiprogram_cs_file_1 -->|INativeStorageService| flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29 + flow_file_nexusreader_maui_mauiprogram_cs_file_1 -->|NexusAuthenticationStateProvider| flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32 + flow_file_nexusreader_maui_mauiprogram_cs_file_1 -->|Microsoft.AspNetCore.Components.Authorization.AuthenticationStateProvider| flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33 + flow_file_nexusreader_maui_mauiprogram_cs_file_1 -->|Application layer services extension| flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51 + flow_file_nexusreader_maui_mauiprogram_cs_file_1 -->|UI and app state services| flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1 + flow_file_nexusreader_web_client_program_cs_file_1 -->|uses| flow_type_nexusreader_web_client_program_cs_configured_httpclient_40 + flow_file_nexusreader_web_client_program_cs_file_1 -->|NexusAuthenticationStateProvider| flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33 + flow_file_nexusreader_web_client_program_cs_file_1 -->|model ThrowingBookStorageService| flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74 + flow_file_nexusreader_web_client_program_cs_file_1 -->|model ThrowingDbContextFactory| flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61 + flow_file_nexusreader_web_client_program_cs_file_1 -->|model ThrowingEbookRepository| flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84 + flow_file_nexusreader_web_client_program_cs_file_1 -->|model ThrowingEmbeddingGenerator| flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66 + flow_file_nexusreader_web_client_program_cs_file_1 -->|model ThrowingSyncBroadcaster| flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94 + flow_file_nexusreader_web_client_program_cs_file_1 -->|IKnowledgeService| flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38 + flow_file_nexusreader_web_client_program_cs_file_1 -->|IPlatformService| flow_type_nexusreader_web_client_program_cs_webplatformservice_18 + click flow_file_nexusreader_maui_mauiprogram_cs_file_1 href "vscode://file/NexusReader.Maui/MauiProgram.cs:1:1" "Open source" + click flow_type_nexusreader_maui_mauiprogram_cs_mauiprogram_10 href "vscode://file/NexusReader.Maui/MauiProgram.cs:10:1" "Open source" + click flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28 href "vscode://file/NexusReader.Maui/MauiProgram.cs:28:1" "Open source" + click flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29 href "vscode://file/NexusReader.Maui/MauiProgram.cs:29:1" "Open source" + click flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32 href "vscode://file/NexusReader.Maui/MauiProgram.cs:32:1" "Open source" + click flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33 href "vscode://file/NexusReader.Maui/MauiProgram.cs:33:1" "Open source" + click flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38 href "vscode://file/NexusReader.Maui/MauiProgram.cs:38:1" "Open source" + click flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1 href "vscode://file/NexusReader.Maui/MauiProgram.cs:1:1" "Open source" + click flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51 href "vscode://file/NexusReader.Maui/MauiProgram.cs:51:1" "Open source" + click flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53 href "vscode://file/NexusReader.Maui/MauiProgram.cs:53:1" "Open source" + click flow_file_nexusreader_web_client_program_cs_file_1 href "vscode://file/NexusReader.Web.Client/Program.cs:1:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61 href "vscode://file/NexusReader.Web.Client/Program.cs:61:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66 href "vscode://file/NexusReader.Web.Client/Program.cs:66:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74 href "vscode://file/NexusReader.Web.Client/Program.cs:74:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84 href "vscode://file/NexusReader.Web.Client/Program.cs:84:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94 href "vscode://file/NexusReader.Web.Client/Program.cs:94:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_webplatformservice_18 href "vscode://file/NexusReader.Web.Client/Program.cs:18:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33 href "vscode://file/NexusReader.Web.Client/Program.cs:33:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38 href "vscode://file/NexusReader.Web.Client/Program.cs:38:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_configured_httpclient_40 href "vscode://file/NexusReader.Web.Client/Program.cs:40:1" "Open source" +``` + +This dependency-map view is included as a grounded technical anchor for the published business interpretation. + +#### Startup and Service Registration Flow + +```mermaid +--- +config: + flowchart: + defaultRenderer: "elk" +--- +flowchart TD + subgraph flow_1_nexusreader_web_client_program_cs["Program.cs"] + end + subgraph flow_2_nexusreader_maui_mauiprogram_cs["MauiProgram"] + end + subgraph Node_xref_business_overview_md_authentication_login_register_flow["Authentication (Login/Register) Flow"] + end + subgraph Node_xref_business_overview_md_http_request_token_refresh_flow["HTTP Request + Token Refresh Flow"] + end + subgraph Node_xref_business_overview_md_knowledge_query_api_flow["Knowledge Query API Flow"] + end + flow_file_nexusreader_maui_mauiprogram_cs_file_1["MauiProgram"] + flow_file_nexusreader_web_client_program_cs_file_1["Program.cs"] + flow_method_nexusreader_maui_mauiprogram_cs_create_and_build_mauiapp_16["Create and build MauiApp"] + flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53[/"Handlers from NexusReader.Application assembly"/] + flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38[/"HttpClient (configured)"/] + flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28[/"MauiPlatformService"/] + flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29[/"MauiStorageService"/] + flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32[/"NexusAuthenticationStateProvider"/] + flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33[/"NexusAuthenticationStateProvider (via factory)"/] + flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51[/"NexusReader.Application registrations"/] + flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1[/"ThemeService, FocusModeService, QuizStateService, ReaderNavigationService, KnowledgeGraphService, ReaderInteractionService, KnowledgeCoordinator, SyncService, IdentityService"/] + flow_type_nexusreader_web_client_program_cs_configured_httpclient_40[/"configured HttpClient"/] + flow_type_nexusreader_web_client_program_cs_n_a_55[/"N/A"/] + flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33[/"NexusAuthenticationStateProvider"/] + flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49[/"ThrowingDbContextFactory"/] + flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38[/"WasmKnowledgeService"/] + flow_type_nexusreader_web_client_program_cs_webplatformservice_18[/"WebPlatformService"/] + flow_file_nexusreader_maui_mauiprogram_cs_file_1 -->|unknown| flow_method_nexusreader_maui_mauiprogram_cs_create_and_build_mauiapp_16 + flow_file_nexusreader_maui_mauiprogram_cs_file_1 -->|MediatR handlers| flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53 + flow_file_nexusreader_maui_mauiprogram_cs_file_1 -->|HttpClient| flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38 + flow_file_nexusreader_maui_mauiprogram_cs_file_1 -->|IPlatformService| flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28 + flow_file_nexusreader_maui_mauiprogram_cs_file_1 -->|INativeStorageService| flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29 + flow_file_nexusreader_maui_mauiprogram_cs_file_1 -->|NexusAuthenticationStateProvider| flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32 + flow_file_nexusreader_maui_mauiprogram_cs_file_1 -->|Microsoft.AspNetCore.Components.Authorization.AuthenticationStateProvider| flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33 + flow_file_nexusreader_maui_mauiprogram_cs_file_1 -->|Application layer services extension| flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51 + flow_file_nexusreader_maui_mauiprogram_cs_file_1 -->|UI and app state services| flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1 + flow_file_nexusreader_web_client_program_cs_file_1 -->|uses| flow_type_nexusreader_web_client_program_cs_configured_httpclient_40 + flow_file_nexusreader_web_client_program_cs_file_1 -->|application services via extension| flow_type_nexusreader_web_client_program_cs_n_a_55 + flow_file_nexusreader_web_client_program_cs_file_1 -->|NexusAuthenticationStateProvider| flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33 + flow_file_nexusreader_web_client_program_cs_file_1 -->|IDbContextFactory AppDbContext>| flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49 + flow_file_nexusreader_web_client_program_cs_file_1 -->|IKnowledgeService| flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38 + flow_file_nexusreader_web_client_program_cs_file_1 -->|IPlatformService| flow_type_nexusreader_web_client_program_cs_webplatformservice_18 + click flow_file_nexusreader_maui_mauiprogram_cs_file_1 href "vscode://file/NexusReader.Maui/MauiProgram.cs:1:1" "Open source" + click flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28 href "vscode://file/NexusReader.Maui/MauiProgram.cs:28:1" "Open source" + click flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29 href "vscode://file/NexusReader.Maui/MauiProgram.cs:29:1" "Open source" + click flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32 href "vscode://file/NexusReader.Maui/MauiProgram.cs:32:1" "Open source" + click flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33 href "vscode://file/NexusReader.Maui/MauiProgram.cs:33:1" "Open source" + click flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38 href "vscode://file/NexusReader.Maui/MauiProgram.cs:38:1" "Open source" + click flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1 href "vscode://file/NexusReader.Maui/MauiProgram.cs:1:1" "Open source" + click flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51 href "vscode://file/NexusReader.Maui/MauiProgram.cs:51:1" "Open source" + click flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53 href "vscode://file/NexusReader.Maui/MauiProgram.cs:53:1" "Open source" + click flow_method_nexusreader_maui_mauiprogram_cs_create_and_build_mauiapp_16 href "vscode://file/NexusReader.Maui/MauiProgram.cs:16:1" "Open source" + click flow_file_nexusreader_web_client_program_cs_file_1 href "vscode://file/NexusReader.Web.Client/Program.cs:1:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_webplatformservice_18 href "vscode://file/NexusReader.Web.Client/Program.cs:18:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33 href "vscode://file/NexusReader.Web.Client/Program.cs:33:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38 href "vscode://file/NexusReader.Web.Client/Program.cs:38:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_configured_httpclient_40 href "vscode://file/NexusReader.Web.Client/Program.cs:40:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49 href "vscode://file/NexusReader.Web.Client/Program.cs:49:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_n_a_55 href "vscode://file/NexusReader.Web.Client/Program.cs:55:1" "Open source" +``` + +This primary-runtime view is included as a grounded technical anchor for the published business interpretation. + +#### Program.cs Flow + +```mermaid +--- +config: + flowchart: + defaultRenderer: "elk" +--- +flowchart TD + subgraph flow_1_nexusreader_web_client_program_cs["Program.cs"] + end + subgraph flow_2_nexusreader_maui_mauiprogram_cs["MauiProgram"] + end + subgraph flow_0_nexusreader_web_program_cs["Program.cs"] + end + flow_file_nexusreader_web_client_program_cs_file_1["Program.cs"] + flow_file_nexusreader_web_program_cs_file_1["Program.cs"] + flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88["FindAuthorByNameAsync"] + flow_method_nexusreader_web_client_program_cs_getservice_71["GetService"] + flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15["Program (top-level startup)"] + flow_method_nexusreader_web_client_program_cs_run_wasm_host_59["Run WASM Host"] + flow_method_nexusreader_web_program_cs_program_top_level_29["Program (top-level)"] + flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88["Reads repository or persistence state"] + flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62{"Evaluates branch condition"} + flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66{"Falls back to alternate path"} + flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125["Reads repository or persistence state"] + flow_type_nexusreader_web_client_program_cs_configured_httpclient_40[/"configured HttpClient"/] + flow_type_nexusreader_web_client_program_cs_n_a_55[/"N/A"/] + flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33[/"NexusAuthenticationStateProvider"/] + flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74[/"ThrowingBookStorageService"/] + flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49[/"ThrowingDbContextFactory"/] + flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61[/"ThrowingDbContextFactory"/] + flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84[/"ThrowingEbookRepository"/] + flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66[/"ThrowingEmbeddingGenerator"/] + flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94[/"ThrowingSyncBroadcaster"/] + flow_type_nexusreader_web_client_program_cs_wasmepubreader_56[/"WasmEpubReader"/] + flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38[/"WasmKnowledgeService"/] + flow_type_nexusreader_web_client_program_cs_webplatformservice_18[/"WebPlatformService"/] + flow_action_nexusreader_web_client_program_cs_getservice_return_71_71(["returns null"]) + flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62 -->|fallback| flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66 + flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66 -->|Reads repository or persistence state| flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125 + flow_file_nexusreader_web_client_program_cs_file_1 -->|FindAuthorByNameAsync| flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88 + flow_file_nexusreader_web_client_program_cs_file_1 -->|GetService| flow_method_nexusreader_web_client_program_cs_getservice_71 + flow_file_nexusreader_web_client_program_cs_file_1 -->|Program top-level startup| flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15 + flow_file_nexusreader_web_client_program_cs_file_1 -->|unknown| flow_method_nexusreader_web_client_program_cs_run_wasm_host_59 + flow_file_nexusreader_web_client_program_cs_file_1 -->|uses| flow_type_nexusreader_web_client_program_cs_configured_httpclient_40 + flow_file_nexusreader_web_client_program_cs_file_1 -->|application services via extension| flow_type_nexusreader_web_client_program_cs_n_a_55 + flow_file_nexusreader_web_client_program_cs_file_1 -->|NexusAuthenticationStateProvider| flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33 + flow_file_nexusreader_web_client_program_cs_file_1 -->|model ThrowingBookStorageService| flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74 + flow_file_nexusreader_web_client_program_cs_file_1 -->|IDbContextFactory AppDbContext>| flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49 + flow_file_nexusreader_web_client_program_cs_file_1 -->|model ThrowingDbContextFactory| flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61 + flow_file_nexusreader_web_client_program_cs_file_1 -->|model ThrowingEbookRepository| flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84 + flow_file_nexusreader_web_client_program_cs_file_1 -->|model ThrowingEmbeddingGenerator| flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66 + flow_file_nexusreader_web_client_program_cs_file_1 -->|model ThrowingSyncBroadcaster| flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94 + flow_file_nexusreader_web_client_program_cs_file_1 -->|IEpubReader| flow_type_nexusreader_web_client_program_cs_wasmepubreader_56 + flow_file_nexusreader_web_client_program_cs_file_1 -->|IKnowledgeService| flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38 + flow_file_nexusreader_web_client_program_cs_file_1 -->|IPlatformService| flow_type_nexusreader_web_client_program_cs_webplatformservice_18 + flow_file_nexusreader_web_program_cs_file_1 -->|Program top-level| flow_method_nexusreader_web_program_cs_program_top_level_29 + flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88 -->|Reads repository or persistence state| flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88 + flow_method_nexusreader_web_client_program_cs_getservice_71 -->|returns null| flow_action_nexusreader_web_client_program_cs_getservice_return_71_71 + flow_method_nexusreader_web_program_cs_program_top_level_29 -->|true / false| flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62 + click flow_file_nexusreader_web_client_program_cs_file_1 href "vscode://file/NexusReader.Web.Client/Program.cs:1:1" "Open source" + click flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15 href "vscode://file/NexusReader.Web.Client/Program.cs:15:1" "Open source" + click flow_method_nexusreader_web_client_program_cs_getservice_71 href "vscode://file/NexusReader.Web.Client/Program.cs:71:1" "Open source" + click flow_action_nexusreader_web_client_program_cs_getservice_return_71_71 href "vscode://file/NexusReader.Web.Client/Program.cs:71:1" "Open source" + click flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88 href "vscode://file/NexusReader.Web.Client/Program.cs:88:1" "Open source" + click flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88 href "vscode://file/NexusReader.Web.Client/Program.cs:88:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61 href "vscode://file/NexusReader.Web.Client/Program.cs:61:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66 href "vscode://file/NexusReader.Web.Client/Program.cs:66:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74 href "vscode://file/NexusReader.Web.Client/Program.cs:74:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84 href "vscode://file/NexusReader.Web.Client/Program.cs:84:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94 href "vscode://file/NexusReader.Web.Client/Program.cs:94:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_webplatformservice_18 href "vscode://file/NexusReader.Web.Client/Program.cs:18:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33 href "vscode://file/NexusReader.Web.Client/Program.cs:33:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38 href "vscode://file/NexusReader.Web.Client/Program.cs:38:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_configured_httpclient_40 href "vscode://file/NexusReader.Web.Client/Program.cs:40:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49 href "vscode://file/NexusReader.Web.Client/Program.cs:49:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_n_a_55 href "vscode://file/NexusReader.Web.Client/Program.cs:55:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_wasmepubreader_56 href "vscode://file/NexusReader.Web.Client/Program.cs:56:1" "Open source" + click flow_method_nexusreader_web_client_program_cs_run_wasm_host_59 href "vscode://file/NexusReader.Web.Client/Program.cs:59:1" "Open source" + click flow_file_nexusreader_web_program_cs_file_1 href "vscode://file/NexusReader.Web/Program.cs:1:1" "Open source" + click flow_method_nexusreader_web_program_cs_program_top_level_29 href "vscode://file/NexusReader.Web/Program.cs:29:1" "Open source" + click flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62 href "vscode://file/NexusReader.Web/Program.cs:62:1" "Open source" + click flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66 href "vscode://file/NexusReader.Web/Program.cs:66:1" "Open source" + click flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125 href "vscode://file/NexusReader.Web/Program.cs:125:1" "Open source" +``` + +This primary-runtime view is included as a grounded technical anchor for the published business interpretation. + + +### Unknowns and Gaps + +- Business flow HTTP Request + Token Refresh Flow is ambiguous relative to another candidate flow in the same scope. +- Business flow Knowledge Query API Flow is ambiguous relative to another candidate flow in the same scope. + +### Key Files + +- NexusReader.Maui/MauiProgram.cs +- NexusReader.Web.Client/Program.cs +- NexusReader.Web/Program.cs +- NexusReader.Application/DTOs/User/AuthorDto.cs +- NexusReader.Application/Security/Authorization/ProUserHandler.cs +- NexusReader.Application/Security/Authorization/ProUserRequirement.cs +- NexusReader.Domain/Entities/Author.cs +- NexusReader.UI.Shared/Layout/AuthLayout.razor + + + +--- + +## See Also + +- [Top Business Flows](top-business-flows.md) +- [Security, Identity and Authorization](../flows/security-identity-auth.md) +- [Infrastructure Services: Knowledge, AI, Billing, Storage, Epub](../domains/infrastructure-services.md) +- [Project Overview and Architecture](../collections/overview.md) diff --git a/src/.documentation/business/business-overview.meta.json b/src/.documentation/business/business-overview.meta.json new file mode 100644 index 0000000..d43e5b5 --- /dev/null +++ b/src/.documentation/business/business-overview.meta.json @@ -0,0 +1,33521 @@ +{ + "generatedAt": "2026-05-22T06:56:57.946Z", + "targetPath": "business/business-overview.md", + "targetKind": "folder", + "metadataDraft": { + "sectionProvenance": [ + { + "sectionId": "dependency_map_graph", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs", + "NexusReader.Web.Client/Program.cs", + "NexusReader.Web/Program.cs", + "NexusReader.Application/DependencyInjection.cs", + "NexusReader.Infrastructure/DependencyInjection.cs", + "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "NexusReader.Application/DTOs/User/AuthorDto.cs", + "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "NexusReader.Domain/Entities/Author.cs", + "NexusReader.UI.Shared/Layout/AuthLayout.razor", + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "NexusReader.UI.Shared/Pages/Account/Login.razor", + "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "NexusReader.UI.Shared/Pages/Account/Register.razor", + "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "NexusReader.Infrastructure/Services/BookStorageService.cs", + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs" + ] + }, + { + "sectionId": "startup_runtime_graph", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs", + "NexusReader.Web.Client/Program.cs", + "NexusReader.Web/Program.cs", + "NexusReader.Application/DependencyInjection.cs", + "NexusReader.Infrastructure/DependencyInjection.cs", + "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "NexusReader.Application/DTOs/User/AuthorDto.cs", + "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "NexusReader.Domain/Entities/Author.cs", + "NexusReader.UI.Shared/Layout/AuthLayout.razor", + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "NexusReader.UI.Shared/Pages/Account/Login.razor", + "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "NexusReader.UI.Shared/Pages/Account/Register.razor", + "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "NexusReader.Infrastructure/Services/BookStorageService.cs", + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs" + ] + }, + { + "sectionId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs", + "NexusReader.Web.Client/Program.cs", + "NexusReader.Web/Program.cs", + "NexusReader.Application/DependencyInjection.cs", + "NexusReader.Infrastructure/DependencyInjection.cs", + "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "NexusReader.Application/DTOs/User/AuthorDto.cs", + "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "NexusReader.Domain/Entities/Author.cs", + "NexusReader.UI.Shared/Layout/AuthLayout.razor", + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "NexusReader.UI.Shared/Pages/Account/Login.razor", + "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "NexusReader.UI.Shared/Pages/Account/Register.razor", + "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "NexusReader.Infrastructure/Services/BookStorageService.cs", + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs" + ] + }, + { + "sectionId": "control_flow_flow_1_nexusreader_web_client_program_cs", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs", + "NexusReader.Web.Client/Program.cs", + "NexusReader.Web/Program.cs", + "NexusReader.Application/DependencyInjection.cs", + "NexusReader.Infrastructure/DependencyInjection.cs", + "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "NexusReader.Application/DTOs/User/AuthorDto.cs", + "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "NexusReader.Domain/Entities/Author.cs", + "NexusReader.UI.Shared/Layout/AuthLayout.razor", + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "NexusReader.UI.Shared/Pages/Account/Login.razor", + "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "NexusReader.UI.Shared/Pages/Account/Register.razor", + "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "NexusReader.Infrastructure/Services/BookStorageService.cs", + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs" + ] + }, + { + "sectionId": "contracts_flow_1_nexusreader_web_client_program_cs", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs", + "NexusReader.Web.Client/Program.cs", + "NexusReader.Web/Program.cs", + "NexusReader.Application/DependencyInjection.cs", + "NexusReader.Infrastructure/DependencyInjection.cs", + "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "NexusReader.Application/DTOs/User/AuthorDto.cs", + "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "NexusReader.Domain/Entities/Author.cs", + "NexusReader.UI.Shared/Layout/AuthLayout.razor", + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "NexusReader.UI.Shared/Pages/Account/Login.razor", + "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "NexusReader.UI.Shared/Pages/Account/Register.razor", + "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "NexusReader.Infrastructure/Services/BookStorageService.cs", + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs" + ] + }, + { + "sectionId": "layer_flow_1_nexusreader_web_client_program_cs", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs", + "NexusReader.Web.Client/Program.cs", + "NexusReader.Web/Program.cs", + "NexusReader.Application/DependencyInjection.cs", + "NexusReader.Infrastructure/DependencyInjection.cs", + "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "NexusReader.Application/DTOs/User/AuthorDto.cs", + "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "NexusReader.Domain/Entities/Author.cs", + "NexusReader.UI.Shared/Layout/AuthLayout.razor", + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "NexusReader.UI.Shared/Pages/Account/Login.razor", + "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "NexusReader.UI.Shared/Pages/Account/Register.razor", + "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "NexusReader.Infrastructure/Services/BookStorageService.cs", + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs" + ] + }, + { + "sectionId": "failure_flow_1_nexusreader_web_client_program_cs", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs", + "NexusReader.Web.Client/Program.cs", + "NexusReader.Web/Program.cs", + "NexusReader.Application/DependencyInjection.cs", + "NexusReader.Infrastructure/DependencyInjection.cs", + "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "NexusReader.Application/DTOs/User/AuthorDto.cs", + "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "NexusReader.Domain/Entities/Author.cs", + "NexusReader.UI.Shared/Layout/AuthLayout.razor", + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "NexusReader.UI.Shared/Pages/Account/Login.razor", + "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "NexusReader.UI.Shared/Pages/Account/Register.razor", + "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "NexusReader.Infrastructure/Services/BookStorageService.cs", + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs" + ] + }, + { + "sectionId": "method_flows_graph", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs", + "NexusReader.Web.Client/Program.cs", + "NexusReader.Web/Program.cs", + "NexusReader.Application/DependencyInjection.cs", + "NexusReader.Infrastructure/DependencyInjection.cs", + "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "NexusReader.Application/DTOs/User/AuthorDto.cs", + "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "NexusReader.Domain/Entities/Author.cs", + "NexusReader.UI.Shared/Layout/AuthLayout.razor", + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "NexusReader.UI.Shared/Pages/Account/Login.razor", + "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "NexusReader.UI.Shared/Pages/Account/Register.razor", + "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "NexusReader.Infrastructure/Services/BookStorageService.cs", + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs" + ] + } + ], + "claimGrounding": [], + "nodeMetadata": [ + { + "id": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "label": "MauiProgram", + "diagramId": "dependency_map_graph", + "nodeRole": "class", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "Static host for MAUI app startup logic and DI composition.", + "responsibility": "Static host for MAUI app startup logic and DI composition.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Composition Root", + "Service Registration" + ], + "detailItems": [ + { + "label": "Owner", + "value": "MauiProgram" + }, + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "0" + }, + { + "label": "Domain", + "value": "Identity (AuthenticationStateProvider), Sync, KnowledgeGraph / KnowledgeCoordinator" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Maui/MauiProgram.cs:1:1", + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 1, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 1, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_mauiprogram_10", + "label": "MauiProgram", + "diagramId": "dependency_map_graph", + "nodeRole": "class", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "Static host for MAUI app startup logic and DI composition.", + "responsibility": "Static host for MAUI app startup logic and DI composition.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Composition Root", + "Service Registration" + ], + "detailItems": [ + { + "label": "Owner", + "value": "MauiProgram" + }, + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "0" + }, + { + "label": "Domain", + "value": "Identity (AuthenticationStateProvider), Sync, KnowledgeGraph / KnowledgeCoordinator" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Maui/MauiProgram.cs:10:1", + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 10, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 10, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28", + "label": "MauiPlatformService", + "diagramId": "dependency_map_graph", + "nodeRole": "dependency", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "Creates and configures the MAUI application builder: registers DI services (platform, storage, identity, UI state, network), composes the Application layer and MediatR, and returns the built MauiApp inside a try/catch to aid debugging.", + "responsibility": "Sets HttpClient BaseAddress to http://10.0.2.2:5000 (typical Android emulator -> host routing); composes Application layer via AddApplication() and registers MediatR scanning the Application assembly; startup protected by try/catch that writes Debug output and rethrows.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Composition Root", + "Service Registration" + ], + "detailItems": [ + { + "label": "Owner", + "value": "MauiProgram" + }, + { + "label": "Domain", + "value": "Identity (AuthenticationStateProvider), Sync, KnowledgeGraph / KnowledgeCoordinator" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Maui/MauiProgram.cs:28:1", + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 28, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 28, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29", + "label": "MauiStorageService", + "diagramId": "dependency_map_graph", + "nodeRole": "dependency", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "Creates and configures the MAUI application builder: registers DI services (platform, storage, identity, UI state, network), composes the Application layer and MediatR, and returns the built MauiApp inside a try/catch to aid debugging.", + "responsibility": "Sets HttpClient BaseAddress to http://10.0.2.2:5000 (typical Android emulator -> host routing); composes Application layer via AddApplication() and registers MediatR scanning the Application assembly; startup protected by try/catch that writes Debug output and rethrows.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Composition Root", + "Service Registration" + ], + "detailItems": [ + { + "label": "Owner", + "value": "MauiProgram" + }, + { + "label": "Domain", + "value": "Identity (AuthenticationStateProvider), Sync, KnowledgeGraph / KnowledgeCoordinator" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Maui/MauiProgram.cs:29:1", + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 29, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 29, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32", + "label": "NexusAuthenticationStateProvider", + "diagramId": "dependency_map_graph", + "nodeRole": "dependency", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "Creates and configures the MAUI application builder: registers DI services (platform, storage, identity, UI state, network), composes the Application layer and MediatR, and returns the built MauiApp inside a try/catch to aid debugging.", + "responsibility": "Sets HttpClient BaseAddress to http://10.0.2.2:5000 (typical Android emulator -> host routing); composes Application layer via AddApplication() and registers MediatR scanning the Application assembly; startup protected by try/catch that writes Debug output and rethrows.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Composition Root", + "Service Registration" + ], + "detailItems": [ + { + "label": "Owner", + "value": "MauiProgram" + }, + { + "label": "Domain", + "value": "Identity (AuthenticationStateProvider), Sync, KnowledgeGraph / KnowledgeCoordinator" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Maui/MauiProgram.cs:32:1", + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 32, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 32, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33", + "label": "NexusAuthenticationStateProvider (via factory)", + "diagramId": "dependency_map_graph", + "nodeRole": "dependency", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "Creates and configures the MAUI application builder: registers DI services (platform, storage, identity, UI state, network), composes the Application layer and MediatR, and returns the built MauiApp inside a try/catch to aid debugging.", + "responsibility": "Sets HttpClient BaseAddress to http://10.0.2.2:5000 (typical Android emulator -> host routing); composes Application layer via AddApplication() and registers MediatR scanning the Application assembly; startup protected by try/catch that writes Debug output and rethrows.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Composition Root", + "Service Registration" + ], + "detailItems": [ + { + "label": "Owner", + "value": "MauiProgram" + }, + { + "label": "Domain", + "value": "Identity (AuthenticationStateProvider), Sync, KnowledgeGraph / KnowledgeCoordinator" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Maui/MauiProgram.cs:33:1", + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 33, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 33, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38", + "label": "HttpClient (configured)", + "diagramId": "dependency_map_graph", + "nodeRole": "dependency", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "Creates and configures the MAUI application builder: registers DI services (platform, storage, identity, UI state, network), composes the Application layer and MediatR, and returns the built MauiApp inside a try/catch to aid debugging.", + "responsibility": "Sets HttpClient BaseAddress to http://10.0.2.2:5000 (typical Android emulator -> host routing); composes Application layer via AddApplication() and registers MediatR scanning the Application assembly; startup protected by try/catch that writes Debug output and rethrows.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Composition Root", + "Service Registration" + ], + "detailItems": [ + { + "label": "Owner", + "value": "MauiProgram" + }, + { + "label": "Domain", + "value": "Identity (AuthenticationStateProvider), Sync, KnowledgeGraph / KnowledgeCoordinator" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Maui/MauiProgram.cs:38:1", + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 38, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 38, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1", + "label": "ThemeService, FocusModeService, QuizStateService, ReaderNavigationService, KnowledgeGraphService, ReaderInteractionService, KnowledgeCoordinator, SyncService, IdentityService", + "diagramId": "dependency_map_graph", + "nodeRole": "dependency", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "Creates and configures the MAUI application builder: registers DI services (platform, storage, identity, UI state, network), composes the Application layer and MediatR, and returns the built MauiApp inside a try/catch to aid debugging.", + "responsibility": "Sets HttpClient BaseAddress to http://10.0.2.2:5000 (typical Android emulator -> host routing); composes Application layer via AddApplication() and registers MediatR scanning the Application assembly; startup protected by try/catch that writes Debug output and rethrows.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Composition Root", + "Service Registration" + ], + "detailItems": [ + { + "label": "Owner", + "value": "MauiProgram" + }, + { + "label": "Domain", + "value": "Identity (AuthenticationStateProvider), Sync, KnowledgeGraph / KnowledgeCoordinator" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Maui/MauiProgram.cs:1:1", + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 1, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 1, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51", + "label": "NexusReader.Application registrations", + "diagramId": "dependency_map_graph", + "nodeRole": "dependency", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "Creates and configures the MAUI application builder: registers DI services (platform, storage, identity, UI state, network), composes the Application layer and MediatR, and returns the built MauiApp inside a try/catch to aid debugging.", + "responsibility": "Sets HttpClient BaseAddress to http://10.0.2.2:5000 (typical Android emulator -> host routing); composes Application layer via AddApplication() and registers MediatR scanning the Application assembly; startup protected by try/catch that writes Debug output and rethrows.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Composition Root", + "Service Registration" + ], + "detailItems": [ + { + "label": "Owner", + "value": "MauiProgram" + }, + { + "label": "Domain", + "value": "Identity (AuthenticationStateProvider), Sync, KnowledgeGraph / KnowledgeCoordinator" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Maui/MauiProgram.cs:51:1", + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 51, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 51, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53", + "label": "Handlers from NexusReader.Application assembly", + "diagramId": "dependency_map_graph", + "nodeRole": "dependency", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "Creates and configures the MAUI application builder: registers DI services (platform, storage, identity, UI state, network), composes the Application layer and MediatR, and returns the built MauiApp inside a try/catch to aid debugging.", + "responsibility": "Sets HttpClient BaseAddress to http://10.0.2.2:5000 (typical Android emulator -> host routing); composes Application layer via AddApplication() and registers MediatR scanning the Application assembly; startup protected by try/catch that writes Debug output and rethrows.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Composition Root", + "Service Registration" + ], + "detailItems": [ + { + "label": "Owner", + "value": "MauiProgram" + }, + { + "label": "Domain", + "value": "Identity (AuthenticationStateProvider), Sync, KnowledgeGraph / KnowledgeCoordinator" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Maui/MauiProgram.cs:53:1", + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 53, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 53, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "flow_file_nexusreader_web_client_program_cs_file_1", + "label": "Program.cs", + "diagramId": "dependency_map_graph", + "nodeRole": "service", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:1:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 1, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 1, + "sourceTargetKind": "service", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61", + "label": "ThrowingDbContextFactory", + "diagramId": "dependency_map_graph", + "nodeRole": "class", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.", + "responsibility": "IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Signature", + "value": "() -> AppDbContext" + }, + { + "label": "Calls", + "value": "0" + }, + { + "label": "Action:mapping", + "value": "NotSupportedException @L63" + }, + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "0" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:61:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 61, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 61, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66", + "label": "ThrowingEmbeddingGenerator", + "diagramId": "dependency_map_graph", + "nodeRole": "class", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "IEmbeddingGenerator implementation that disables local embedding generation in WASM (throws on GenerateAsync).", + "responsibility": "IEmbeddingGenerator implementation that disables local embedding generation in WASM (throws on GenerateAsync).", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "0" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:66:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 66, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 66, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74", + "label": "ThrowingBookStorageService", + "diagramId": "dependency_map_graph", + "nodeRole": "class", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "IBookStorageService implementation that throws for all file storage operations in WASM.", + "responsibility": "IBookStorageService implementation that throws for all file storage operations in WASM.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "1" + }, + { + "label": "ErrorMessage", + "value": "string required" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:74:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 74, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 74, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84", + "label": "ThrowingEbookRepository", + "diagramId": "dependency_map_graph", + "nodeRole": "class", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "IEbookRepository implementation that throws for all repository operations in WASM.", + "responsibility": "IEbookRepository implementation that throws for all repository operations in WASM.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "1" + }, + { + "label": "ErrorMessage", + "value": "string required" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:84:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 84, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 84, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94", + "label": "ThrowingSyncBroadcaster", + "diagramId": "dependency_map_graph", + "nodeRole": "class", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "ISyncBroadcaster implementation that throws because real-time broadcasting must run on the server.", + "responsibility": "ISyncBroadcaster implementation that throws because real-time broadcasting must run on the server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "0" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:94:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 94, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 94, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_webplatformservice_18", + "label": "WebPlatformService", + "diagramId": "dependency_map_graph", + "nodeRole": "dependency", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:18:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 18, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 18, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33", + "label": "NexusAuthenticationStateProvider", + "diagramId": "dependency_map_graph", + "nodeRole": "dependency", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:33:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 33, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 33, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38", + "label": "WasmKnowledgeService", + "diagramId": "dependency_map_graph", + "nodeRole": "dependency", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:38:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 38, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 38, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_configured_httpclient_40", + "label": "configured HttpClient", + "diagramId": "dependency_map_graph", + "nodeRole": "dependency", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:40:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 40, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 40, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "label": "MauiProgram", + "diagramId": "startup_runtime_graph", + "nodeRole": "class", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Static host for MAUI app startup logic and DI composition.", + "responsibility": "Static host for MAUI app startup logic and DI composition.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Composition Root", + "Service Registration" + ], + "detailItems": [ + { + "label": "Owner", + "value": "MauiProgram" + }, + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "0" + }, + { + "label": "Domain", + "value": "Identity (AuthenticationStateProvider), Sync, KnowledgeGraph / KnowledgeCoordinator" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Maui/MauiProgram.cs:1:1", + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 1, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 1, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28", + "label": "MauiPlatformService", + "diagramId": "startup_runtime_graph", + "nodeRole": "dependency", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Creates and configures the MAUI application builder: registers DI services (platform, storage, identity, UI state, network), composes the Application layer and MediatR, and returns the built MauiApp inside a try/catch to aid debugging.", + "responsibility": "Sets HttpClient BaseAddress to http://10.0.2.2:5000 (typical Android emulator -> host routing); composes Application layer via AddApplication() and registers MediatR scanning the Application assembly; startup protected by try/catch that writes Debug output and rethrows.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Composition Root", + "Service Registration" + ], + "detailItems": [ + { + "label": "Owner", + "value": "MauiProgram" + }, + { + "label": "Domain", + "value": "Identity (AuthenticationStateProvider), Sync, KnowledgeGraph / KnowledgeCoordinator" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Maui/MauiProgram.cs:28:1", + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 28, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 28, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29", + "label": "MauiStorageService", + "diagramId": "startup_runtime_graph", + "nodeRole": "dependency", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Creates and configures the MAUI application builder: registers DI services (platform, storage, identity, UI state, network), composes the Application layer and MediatR, and returns the built MauiApp inside a try/catch to aid debugging.", + "responsibility": "Sets HttpClient BaseAddress to http://10.0.2.2:5000 (typical Android emulator -> host routing); composes Application layer via AddApplication() and registers MediatR scanning the Application assembly; startup protected by try/catch that writes Debug output and rethrows.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Composition Root", + "Service Registration" + ], + "detailItems": [ + { + "label": "Owner", + "value": "MauiProgram" + }, + { + "label": "Domain", + "value": "Identity (AuthenticationStateProvider), Sync, KnowledgeGraph / KnowledgeCoordinator" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Maui/MauiProgram.cs:29:1", + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 29, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 29, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32", + "label": "NexusAuthenticationStateProvider", + "diagramId": "startup_runtime_graph", + "nodeRole": "dependency", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Creates and configures the MAUI application builder: registers DI services (platform, storage, identity, UI state, network), composes the Application layer and MediatR, and returns the built MauiApp inside a try/catch to aid debugging.", + "responsibility": "Sets HttpClient BaseAddress to http://10.0.2.2:5000 (typical Android emulator -> host routing); composes Application layer via AddApplication() and registers MediatR scanning the Application assembly; startup protected by try/catch that writes Debug output and rethrows.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Composition Root", + "Service Registration" + ], + "detailItems": [ + { + "label": "Owner", + "value": "MauiProgram" + }, + { + "label": "Domain", + "value": "Identity (AuthenticationStateProvider), Sync, KnowledgeGraph / KnowledgeCoordinator" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Maui/MauiProgram.cs:32:1", + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 32, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 32, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33", + "label": "NexusAuthenticationStateProvider (via factory)", + "diagramId": "startup_runtime_graph", + "nodeRole": "dependency", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Creates and configures the MAUI application builder: registers DI services (platform, storage, identity, UI state, network), composes the Application layer and MediatR, and returns the built MauiApp inside a try/catch to aid debugging.", + "responsibility": "Sets HttpClient BaseAddress to http://10.0.2.2:5000 (typical Android emulator -> host routing); composes Application layer via AddApplication() and registers MediatR scanning the Application assembly; startup protected by try/catch that writes Debug output and rethrows.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Composition Root", + "Service Registration" + ], + "detailItems": [ + { + "label": "Owner", + "value": "MauiProgram" + }, + { + "label": "Domain", + "value": "Identity (AuthenticationStateProvider), Sync, KnowledgeGraph / KnowledgeCoordinator" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Maui/MauiProgram.cs:33:1", + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 33, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 33, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38", + "label": "HttpClient (configured)", + "diagramId": "startup_runtime_graph", + "nodeRole": "dependency", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Creates and configures the MAUI application builder: registers DI services (platform, storage, identity, UI state, network), composes the Application layer and MediatR, and returns the built MauiApp inside a try/catch to aid debugging.", + "responsibility": "Sets HttpClient BaseAddress to http://10.0.2.2:5000 (typical Android emulator -> host routing); composes Application layer via AddApplication() and registers MediatR scanning the Application assembly; startup protected by try/catch that writes Debug output and rethrows.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Composition Root", + "Service Registration" + ], + "detailItems": [ + { + "label": "Owner", + "value": "MauiProgram" + }, + { + "label": "Domain", + "value": "Identity (AuthenticationStateProvider), Sync, KnowledgeGraph / KnowledgeCoordinator" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Maui/MauiProgram.cs:38:1", + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 38, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 38, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1", + "label": "ThemeService, FocusModeService, QuizStateService, ReaderNavigationService, KnowledgeGraphService, ReaderInteractionService, KnowledgeCoordinator, SyncService, IdentityService", + "diagramId": "startup_runtime_graph", + "nodeRole": "dependency", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Creates and configures the MAUI application builder: registers DI services (platform, storage, identity, UI state, network), composes the Application layer and MediatR, and returns the built MauiApp inside a try/catch to aid debugging.", + "responsibility": "Sets HttpClient BaseAddress to http://10.0.2.2:5000 (typical Android emulator -> host routing); composes Application layer via AddApplication() and registers MediatR scanning the Application assembly; startup protected by try/catch that writes Debug output and rethrows.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Composition Root", + "Service Registration" + ], + "detailItems": [ + { + "label": "Owner", + "value": "MauiProgram" + }, + { + "label": "Domain", + "value": "Identity (AuthenticationStateProvider), Sync, KnowledgeGraph / KnowledgeCoordinator" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Maui/MauiProgram.cs:1:1", + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 1, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 1, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51", + "label": "NexusReader.Application registrations", + "diagramId": "startup_runtime_graph", + "nodeRole": "dependency", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Creates and configures the MAUI application builder: registers DI services (platform, storage, identity, UI state, network), composes the Application layer and MediatR, and returns the built MauiApp inside a try/catch to aid debugging.", + "responsibility": "Sets HttpClient BaseAddress to http://10.0.2.2:5000 (typical Android emulator -> host routing); composes Application layer via AddApplication() and registers MediatR scanning the Application assembly; startup protected by try/catch that writes Debug output and rethrows.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Composition Root", + "Service Registration" + ], + "detailItems": [ + { + "label": "Owner", + "value": "MauiProgram" + }, + { + "label": "Domain", + "value": "Identity (AuthenticationStateProvider), Sync, KnowledgeGraph / KnowledgeCoordinator" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Maui/MauiProgram.cs:51:1", + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 51, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 51, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53", + "label": "Handlers from NexusReader.Application assembly", + "diagramId": "startup_runtime_graph", + "nodeRole": "dependency", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Creates and configures the MAUI application builder: registers DI services (platform, storage, identity, UI state, network), composes the Application layer and MediatR, and returns the built MauiApp inside a try/catch to aid debugging.", + "responsibility": "Sets HttpClient BaseAddress to http://10.0.2.2:5000 (typical Android emulator -> host routing); composes Application layer via AddApplication() and registers MediatR scanning the Application assembly; startup protected by try/catch that writes Debug output and rethrows.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Composition Root", + "Service Registration" + ], + "detailItems": [ + { + "label": "Owner", + "value": "MauiProgram" + }, + { + "label": "Domain", + "value": "Identity (AuthenticationStateProvider), Sync, KnowledgeGraph / KnowledgeCoordinator" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Maui/MauiProgram.cs:53:1", + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 53, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 53, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "flow_method_nexusreader_maui_mauiprogram_cs_create_and_build_mauiapp_16", + "label": "Create and build MauiApp", + "diagramId": "startup_runtime_graph", + "nodeRole": "method", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Creates and configures the MAUI application builder: registers DI services (platform, storage, identity, UI state, network), composes the Application layer and MediatR, and returns the built MauiApp inside a try/catch to aid debugging.", + "responsibility": "Sets HttpClient BaseAddress to http://10.0.2.2:5000 (typical Android emulator -> host routing); composes Application layer via AddApplication() and registers MediatR scanning the Application assembly; startup protected by try/catch that writes Debug output and rethrows.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Composition Root", + "Service Registration" + ], + "detailItems": [ + { + "label": "Owner", + "value": "MauiProgram" + }, + { + "label": "Domain", + "value": "Identity (AuthenticationStateProvider), Sync, KnowledgeGraph / KnowledgeCoordinator" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Maui/MauiProgram.cs:16:1", + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 16, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 16, + "sourceTargetKind": "method", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "flow_file_nexusreader_web_client_program_cs_file_1", + "label": "Program.cs", + "diagramId": "startup_runtime_graph", + "nodeRole": "service", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:1:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 1, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 1, + "sourceTargetKind": "service", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_webplatformservice_18", + "label": "WebPlatformService", + "diagramId": "startup_runtime_graph", + "nodeRole": "dependency", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:18:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 18, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 18, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33", + "label": "NexusAuthenticationStateProvider", + "diagramId": "startup_runtime_graph", + "nodeRole": "dependency", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:33:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 33, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 33, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38", + "label": "WasmKnowledgeService", + "diagramId": "startup_runtime_graph", + "nodeRole": "dependency", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:38:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 38, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 38, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_configured_httpclient_40", + "label": "configured HttpClient", + "diagramId": "startup_runtime_graph", + "nodeRole": "dependency", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:40:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 40, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 40, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49", + "label": "ThrowingDbContextFactory", + "diagramId": "startup_runtime_graph", + "nodeRole": "class", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.", + "responsibility": "IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "0" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:49:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 49, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 49, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_n_a_55", + "label": "N/A", + "diagramId": "startup_runtime_graph", + "nodeRole": "dependency", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:55:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 55, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 55, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_file_nexusreader_web_client_program_cs_file_1", + "label": "Program.cs", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "service", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:1:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 1, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 1, + "sourceTargetKind": "service", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15", + "label": "Program (top-level startup)", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "method", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Create the WebAssemblyHostBuilder, register application and platform services, add HTTP client and dummy server-only stubs, then build and run the WASM host.", + "responsibility": "Create the WebAssemblyHostBuilder, register application and platform services, add HTTP client and dummy server-only stubs, then build and run the WASM host.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Signature", + "value": "(args: string[]) -> Task" + }, + { + "label": "Calls", + "value": "6" + }, + { + "label": "Action:mapping", + "value": "AddScoped platform & UI services @L18" + }, + { + "label": "Action:mapping", + "value": "AddScoped auth services and auth state provider @L30" + }, + { + "label": "Action:mapping", + "value": "AddHttpClient with auth message handler @L40" + }, + { + "label": "Action:mapping", + "value": "Register throw-only stubs for server-only services @L48" + }, + { + "label": "Action:mapping", + "value": "Build and run WASM host @L59" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:15:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 15, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 15, + "sourceTargetKind": "method", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_method_nexusreader_web_client_program_cs_getservice_71", + "label": "GetService", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "method", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Fallback service resolver stub that always returns null.", + "responsibility": "Fallback service resolver stub that always returns null.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Signature", + "value": "(Type serviceType, object? serviceKey = null) -> object?" + }, + { + "label": "Calls", + "value": "0" + }, + { + "label": "Action:return", + "value": "returns null @L71" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:71:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 71, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 71, + "sourceTargetKind": "method", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_action_nexusreader_web_client_program_cs_getservice_return_71_71", + "label": "returns null", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "return", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "public object? GetService(...) => null", + "responsibility": "public object? GetService(...) => null", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Action", + "value": "return" + }, + { + "label": "Signature", + "value": "(Type serviceType, object? serviceKey = null) -> object?" + }, + { + "label": "Calls", + "value": "0" + }, + { + "label": "Action:return", + "value": "returns null @L71" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:71:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 71, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 71, + "sourceTargetKind": "return", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88", + "label": "FindAuthorByNameAsync", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "method", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Repository lookup stub that throws because repository access is unsupported in WASM.", + "responsibility": "Repository lookup stub that throws because repository access is unsupported in WASM.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Signature", + "value": "(string name, CancellationToken cancellationToken = default) -> Task" + }, + { + "label": "Calls", + "value": "0" + }, + { + "label": "Action:mapping", + "value": "NotSupportedException @L88" + }, + { + "label": "Action:repository-read", + "value": "Reads repository or persistence state @L88" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:88:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 88, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 88, + "sourceTargetKind": "method", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88", + "label": "Reads repository or persistence state", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "step", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "public Task FindAuthorByNameAsync(string name, CancellationToken cancellationToken = default) => throw new NotSupportedException(ErrorMessage);", + "responsibility": "public Task FindAuthorByNameAsync(string name, CancellationToken cancellationToken = default) => throw new NotSupportedException(ErrorMessage);", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Action", + "value": "repository-read" + }, + { + "label": "Signature", + "value": "(string name, CancellationToken cancellationToken = default) -> Task" + }, + { + "label": "Calls", + "value": "0" + }, + { + "label": "Action:mapping", + "value": "NotSupportedException @L88" + }, + { + "label": "Action:repository-read", + "value": "Reads repository or persistence state @L88" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:88:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 88, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 88, + "sourceTargetKind": "step", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61", + "label": "ThrowingDbContextFactory", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "class", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.", + "responsibility": "IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Signature", + "value": "() -> AppDbContext" + }, + { + "label": "Calls", + "value": "0" + }, + { + "label": "Action:mapping", + "value": "NotSupportedException @L63" + }, + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "0" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:61:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 61, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 61, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66", + "label": "ThrowingEmbeddingGenerator", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "class", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "IEmbeddingGenerator implementation that disables local embedding generation in WASM (throws on GenerateAsync).", + "responsibility": "IEmbeddingGenerator implementation that disables local embedding generation in WASM (throws on GenerateAsync).", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "0" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:66:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 66, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 66, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74", + "label": "ThrowingBookStorageService", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "class", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "IBookStorageService implementation that throws for all file storage operations in WASM.", + "responsibility": "IBookStorageService implementation that throws for all file storage operations in WASM.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "1" + }, + { + "label": "ErrorMessage", + "value": "string required" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:74:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 74, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 74, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84", + "label": "ThrowingEbookRepository", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "class", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "IEbookRepository implementation that throws for all repository operations in WASM.", + "responsibility": "IEbookRepository implementation that throws for all repository operations in WASM.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "1" + }, + { + "label": "ErrorMessage", + "value": "string required" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:84:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 84, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 84, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94", + "label": "ThrowingSyncBroadcaster", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "class", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "ISyncBroadcaster implementation that throws because real-time broadcasting must run on the server.", + "responsibility": "ISyncBroadcaster implementation that throws because real-time broadcasting must run on the server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "0" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:94:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 94, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 94, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_webplatformservice_18", + "label": "WebPlatformService", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "dependency", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:18:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 18, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 18, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33", + "label": "NexusAuthenticationStateProvider", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "dependency", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:33:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 33, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 33, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38", + "label": "WasmKnowledgeService", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "dependency", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:38:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 38, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 38, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_configured_httpclient_40", + "label": "configured HttpClient", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "dependency", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:40:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 40, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 40, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49", + "label": "ThrowingDbContextFactory", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "class", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.", + "responsibility": "IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "0" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:49:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 49, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 49, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_n_a_55", + "label": "N/A", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "dependency", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:55:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 55, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 55, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_wasmepubreader_56", + "label": "WasmEpubReader", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "dependency", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:56:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 56, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 56, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_method_nexusreader_web_client_program_cs_run_wasm_host_59", + "label": "Run WASM Host", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "method", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:59:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 59, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 59, + "sourceTargetKind": "method", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_file_nexusreader_web_program_cs_file_1", + "label": "Program.cs", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "service", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Program bootstrap for the NexusReader.Web ASP.NET app: registers services, configures authentication/authorization, initializes DB, maps Minimal API endpoints (including knowledge, library, identity, Stripe webhooks), and starts the web host.", + "responsibility": "Program.cs is the composition root and runtime bootstrap: it registers DI services and policies, configures authentication (including Google), ensures DB migrations and seeding with retry/backoff, maps a set of Minimal API endpoints for knowledge features (protected by token-availability policy), handles Stripe webhooks to update subscription state, and supports both Server and WASM Blazor render modes.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Minimal APIs", + "Mediator/CQRS (MediatR)", + "Retry with exponential backoff" + ], + "detailItems": [ + { + "label": "Domain", + "value": "SubscriptionPlan, Knowledge (knowledge service, graph, summary), Ebook / EPUB ingestion" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web/Program.cs:1:1", + "path": "NexusReader.Web/Program.cs", + "line": 1, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 1, + "sourceTargetKind": "service", + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ] + }, + { + "id": "flow_method_nexusreader_web_program_cs_program_top_level_29", + "label": "Program (top-level)", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "method", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Top-level program: build host, register services and middleware, map routes/endpoints, run the app.", + "responsibility": "Top-level program: build host, register services and middleware, map routes/endpoints, run the app.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Minimal APIs", + "Mediator/CQRS (MediatR)", + "Retry with exponential backoff" + ], + "detailItems": [ + { + "label": "Signature", + "value": "(args) -> Task" + }, + { + "label": "Calls", + "value": "6" + }, + { + "label": "Action:mapping", + "value": "Registers many scoped services and HTTP client @L33" + }, + { + "label": "Action:branch", + "value": "Evaluates branch condition @L62" + }, + { + "label": "Action:fallback", + "value": "Falls back to alternate path @L66" + }, + { + "label": "Action:mapping", + "value": "Adds policies including 'ProUser' and 'HasAvailableTokens' @L86" + }, + { + "label": "Action:mapping", + "value": "Configures authentication and Identity endpoints @L96" + }, + { + "label": "Action:repository-read", + "value": "Reads repository or persistence state @L125" + }, + { + "label": "Domain", + "value": "SubscriptionPlan, Knowledge (knowledge service, graph, summary), Ebook / EPUB ingestion" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web/Program.cs:29:1", + "path": "NexusReader.Web/Program.cs", + "line": 29, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 29, + "sourceTargetKind": "method", + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "label": "Evaluates branch condition", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "step", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "if (!string.IsNullOrEmpty(apiBaseUrl))", + "responsibility": "if (!string.IsNullOrEmpty(apiBaseUrl))", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Minimal APIs", + "Mediator/CQRS (MediatR)", + "Retry with exponential backoff" + ], + "detailItems": [ + { + "label": "Action", + "value": "branch" + }, + { + "label": "Condition", + "value": "!string.IsNullOrEmpty(apiBaseUrl)" + }, + { + "label": "Outcomes", + "value": "true, false" + }, + { + "label": "Domain", + "value": "SubscriptionPlan, Knowledge (knowledge service, graph, summary), Ebook / EPUB ingestion" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web/Program.cs:62:1", + "path": "NexusReader.Web/Program.cs", + "line": 62, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 62, + "sourceTargetKind": "step", + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "label": "Falls back to alternate path", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "step", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "else", + "responsibility": "else", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Minimal APIs", + "Mediator/CQRS (MediatR)", + "Retry with exponential backoff" + ], + "detailItems": [ + { + "label": "Action", + "value": "fallback" + }, + { + "label": "Outcomes", + "value": "fallback" + }, + { + "label": "Domain", + "value": "SubscriptionPlan, Knowledge (knowledge service, graph, summary), Ebook / EPUB ingestion" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web/Program.cs:66:1", + "path": "NexusReader.Web/Program.cs", + "line": 66, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 66, + "sourceTargetKind": "step", + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125", + "label": "Reads repository or persistence state", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "step", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "var isApiRequest = context.Request.Path.StartsWithSegments(\"/api\") ||", + "responsibility": "var isApiRequest = context.Request.Path.StartsWithSegments(\"/api\") ||", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Minimal APIs", + "Mediator/CQRS (MediatR)", + "Retry with exponential backoff" + ], + "detailItems": [ + { + "label": "Action", + "value": "repository-read" + }, + { + "label": "Domain", + "value": "SubscriptionPlan, Knowledge (knowledge service, graph, summary), Ebook / EPUB ingestion" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web/Program.cs:125:1", + "path": "NexusReader.Web/Program.cs", + "line": 125, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 125, + "sourceTargetKind": "step", + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ] + }, + { + "id": "flow_file_nexusreader_web_client_program_cs_file_1", + "label": "Program.cs", + "diagramId": "control_flow_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "service", + "diagramFamily": "control-flow", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:1:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 1, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 1, + "sourceTargetKind": "service", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15", + "label": "Program (top-level startup)", + "diagramId": "control_flow_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "method", + "diagramFamily": "control-flow", + "architecturalLayer": "backend", + "summary": "Create the WebAssemblyHostBuilder, register application and platform services, add HTTP client and dummy server-only stubs, then build and run the WASM host.", + "responsibility": "Create the WebAssemblyHostBuilder, register application and platform services, add HTTP client and dummy server-only stubs, then build and run the WASM host.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Signature", + "value": "(args: string[]) -> Task" + }, + { + "label": "Calls", + "value": "6" + }, + { + "label": "Action:mapping", + "value": "AddScoped platform & UI services @L18" + }, + { + "label": "Action:mapping", + "value": "AddScoped auth services and auth state provider @L30" + }, + { + "label": "Action:mapping", + "value": "AddHttpClient with auth message handler @L40" + }, + { + "label": "Action:mapping", + "value": "Register throw-only stubs for server-only services @L48" + }, + { + "label": "Action:mapping", + "value": "Build and run WASM host @L59" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:15:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 15, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 15, + "sourceTargetKind": "method", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_method_nexusreader_web_client_program_cs_getservice_71", + "label": "GetService", + "diagramId": "control_flow_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "method", + "diagramFamily": "control-flow", + "architecturalLayer": "backend", + "summary": "Fallback service resolver stub that always returns null.", + "responsibility": "Fallback service resolver stub that always returns null.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Signature", + "value": "(Type serviceType, object? serviceKey = null) -> object?" + }, + { + "label": "Calls", + "value": "0" + }, + { + "label": "Action:return", + "value": "returns null @L71" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:71:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 71, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 71, + "sourceTargetKind": "method", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_action_nexusreader_web_client_program_cs_getservice_return_71_71", + "label": "returns null", + "diagramId": "control_flow_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "return", + "diagramFamily": "control-flow", + "architecturalLayer": "backend", + "summary": "public object? GetService(...) => null", + "responsibility": "public object? GetService(...) => null", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Action", + "value": "return" + }, + { + "label": "Signature", + "value": "(Type serviceType, object? serviceKey = null) -> object?" + }, + { + "label": "Calls", + "value": "0" + }, + { + "label": "Action:return", + "value": "returns null @L71" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:71:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 71, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 71, + "sourceTargetKind": "return", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88", + "label": "FindAuthorByNameAsync", + "diagramId": "control_flow_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "method", + "diagramFamily": "control-flow", + "architecturalLayer": "backend", + "summary": "Repository lookup stub that throws because repository access is unsupported in WASM.", + "responsibility": "Repository lookup stub that throws because repository access is unsupported in WASM.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Signature", + "value": "(string name, CancellationToken cancellationToken = default) -> Task" + }, + { + "label": "Calls", + "value": "0" + }, + { + "label": "Action:mapping", + "value": "NotSupportedException @L88" + }, + { + "label": "Action:repository-read", + "value": "Reads repository or persistence state @L88" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:88:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 88, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 88, + "sourceTargetKind": "method", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88", + "label": "Reads repository or persistence state", + "diagramId": "control_flow_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "step", + "diagramFamily": "control-flow", + "architecturalLayer": "backend", + "summary": "public Task FindAuthorByNameAsync(string name, CancellationToken cancellationToken = default) => throw new NotSupportedException(ErrorMessage);", + "responsibility": "public Task FindAuthorByNameAsync(string name, CancellationToken cancellationToken = default) => throw new NotSupportedException(ErrorMessage);", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Action", + "value": "repository-read" + }, + { + "label": "Signature", + "value": "(string name, CancellationToken cancellationToken = default) -> Task" + }, + { + "label": "Calls", + "value": "0" + }, + { + "label": "Action:mapping", + "value": "NotSupportedException @L88" + }, + { + "label": "Action:repository-read", + "value": "Reads repository or persistence state @L88" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:88:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 88, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 88, + "sourceTargetKind": "step", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_method_nexusreader_web_client_program_cs_run_wasm_host_59", + "label": "Run WASM Host", + "diagramId": "control_flow_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "method", + "diagramFamily": "control-flow", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:59:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 59, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 59, + "sourceTargetKind": "method", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_file_nexusreader_web_program_cs_file_1", + "label": "Program.cs", + "diagramId": "control_flow_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "service", + "diagramFamily": "control-flow", + "architecturalLayer": "backend", + "summary": "Program bootstrap for the NexusReader.Web ASP.NET app: registers services, configures authentication/authorization, initializes DB, maps Minimal API endpoints (including knowledge, library, identity, Stripe webhooks), and starts the web host.", + "responsibility": "Program.cs is the composition root and runtime bootstrap: it registers DI services and policies, configures authentication (including Google), ensures DB migrations and seeding with retry/backoff, maps a set of Minimal API endpoints for knowledge features (protected by token-availability policy), handles Stripe webhooks to update subscription state, and supports both Server and WASM Blazor render modes.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Minimal APIs", + "Mediator/CQRS (MediatR)", + "Retry with exponential backoff" + ], + "detailItems": [ + { + "label": "Domain", + "value": "SubscriptionPlan, Knowledge (knowledge service, graph, summary), Ebook / EPUB ingestion" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web/Program.cs:1:1", + "path": "NexusReader.Web/Program.cs", + "line": 1, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 1, + "sourceTargetKind": "service", + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ] + }, + { + "id": "flow_method_nexusreader_web_program_cs_program_top_level_29", + "label": "Program (top-level)", + "diagramId": "control_flow_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "method", + "diagramFamily": "control-flow", + "architecturalLayer": "backend", + "summary": "Top-level program: build host, register services and middleware, map routes/endpoints, run the app.", + "responsibility": "Top-level program: build host, register services and middleware, map routes/endpoints, run the app.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Minimal APIs", + "Mediator/CQRS (MediatR)", + "Retry with exponential backoff" + ], + "detailItems": [ + { + "label": "Signature", + "value": "(args) -> Task" + }, + { + "label": "Calls", + "value": "6" + }, + { + "label": "Action:mapping", + "value": "Registers many scoped services and HTTP client @L33" + }, + { + "label": "Action:branch", + "value": "Evaluates branch condition @L62" + }, + { + "label": "Action:fallback", + "value": "Falls back to alternate path @L66" + }, + { + "label": "Action:mapping", + "value": "Adds policies including 'ProUser' and 'HasAvailableTokens' @L86" + }, + { + "label": "Action:mapping", + "value": "Configures authentication and Identity endpoints @L96" + }, + { + "label": "Action:repository-read", + "value": "Reads repository or persistence state @L125" + }, + { + "label": "Domain", + "value": "SubscriptionPlan, Knowledge (knowledge service, graph, summary), Ebook / EPUB ingestion" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web/Program.cs:29:1", + "path": "NexusReader.Web/Program.cs", + "line": 29, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 29, + "sourceTargetKind": "method", + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "label": "Evaluates branch condition", + "diagramId": "control_flow_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "step", + "diagramFamily": "control-flow", + "architecturalLayer": "backend", + "summary": "if (!string.IsNullOrEmpty(apiBaseUrl))", + "responsibility": "if (!string.IsNullOrEmpty(apiBaseUrl))", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Minimal APIs", + "Mediator/CQRS (MediatR)", + "Retry with exponential backoff" + ], + "detailItems": [ + { + "label": "Action", + "value": "branch" + }, + { + "label": "Condition", + "value": "!string.IsNullOrEmpty(apiBaseUrl)" + }, + { + "label": "Outcomes", + "value": "true, false" + }, + { + "label": "Domain", + "value": "SubscriptionPlan, Knowledge (knowledge service, graph, summary), Ebook / EPUB ingestion" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web/Program.cs:62:1", + "path": "NexusReader.Web/Program.cs", + "line": 62, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 62, + "sourceTargetKind": "step", + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "label": "Falls back to alternate path", + "diagramId": "control_flow_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "step", + "diagramFamily": "control-flow", + "architecturalLayer": "backend", + "summary": "else", + "responsibility": "else", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Minimal APIs", + "Mediator/CQRS (MediatR)", + "Retry with exponential backoff" + ], + "detailItems": [ + { + "label": "Action", + "value": "fallback" + }, + { + "label": "Outcomes", + "value": "fallback" + }, + { + "label": "Domain", + "value": "SubscriptionPlan, Knowledge (knowledge service, graph, summary), Ebook / EPUB ingestion" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web/Program.cs:66:1", + "path": "NexusReader.Web/Program.cs", + "line": 66, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 66, + "sourceTargetKind": "step", + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125", + "label": "Reads repository or persistence state", + "diagramId": "control_flow_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "step", + "diagramFamily": "control-flow", + "architecturalLayer": "backend", + "summary": "var isApiRequest = context.Request.Path.StartsWithSegments(\"/api\") ||", + "responsibility": "var isApiRequest = context.Request.Path.StartsWithSegments(\"/api\") ||", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Minimal APIs", + "Mediator/CQRS (MediatR)", + "Retry with exponential backoff" + ], + "detailItems": [ + { + "label": "Action", + "value": "repository-read" + }, + { + "label": "Domain", + "value": "SubscriptionPlan, Knowledge (knowledge service, graph, summary), Ebook / EPUB ingestion" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web/Program.cs:125:1", + "path": "NexusReader.Web/Program.cs", + "line": 125, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 125, + "sourceTargetKind": "step", + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_126_126", + "label": "Reads repository or persistence state", + "diagramId": "control_flow_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "step", + "diagramFamily": "control-flow", + "architecturalLayer": "backend", + "summary": "context.Request.Path.StartsWithSegments(\"/identity\") ||", + "responsibility": "context.Request.Path.StartsWithSegments(\"/identity\") ||", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Minimal APIs", + "Mediator/CQRS (MediatR)", + "Retry with exponential backoff" + ], + "detailItems": [ + { + "label": "Action", + "value": "repository-read" + }, + { + "label": "Domain", + "value": "SubscriptionPlan, Knowledge (knowledge service, graph, summary), Ebook / EPUB ingestion" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web/Program.cs:126:1", + "path": "NexusReader.Web/Program.cs", + "line": 126, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 126, + "sourceTargetKind": "step", + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ] + }, + { + "id": "flow_method_nexusreader_application_dependencyinjection_cs_addapplication_8", + "label": "AddApplication", + "diagramId": "control_flow_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "method", + "diagramFamily": "control-flow", + "architecturalLayer": "backend", + "summary": "Extension method that registers application mapping configuration and MediatR handlers, returning the IServiceCollection for chaining.", + "responsibility": "Extension method that registers application mapping configuration and MediatR handlers, returning the IServiceCollection for chaining.", + "technologyHints": [ + "csharp", + "Dependency Injection extension", + "Service registration" + ], + "detailItems": [ + { + "label": "Owner", + "value": "DependencyInjection" + }, + { + "label": "Signature", + "value": "(services: IServiceCollection) -> IServiceCollection" + }, + { + "label": "Calls", + "value": "1" + }, + { + "label": "Action:mapping", + "value": "Register mapping configuration @L10" + }, + { + "label": "Action:mapping", + "value": "Register MediatR handlers @L11" + }, + { + "label": "Action:return", + "value": "Return IServiceCollection @L13" + }, + { + "label": "Action:return", + "value": "Returns result @L13" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Application/DependencyInjection.cs:8:1", + "path": "NexusReader.Application/DependencyInjection.cs", + "line": 8, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Application/DependencyInjection.cs", + "sourceLine": 8, + "sourceTargetKind": "method", + "evidencePaths": [ + "NexusReader.Application/DependencyInjection.cs" + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_31", + "label": "AddInfrastructure", + "diagramId": "control_flow_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "method", + "diagramFamily": "control-flow", + "architecturalLayer": "backend", + "summary": "Configures and registers infrastructure services and external clients (DBs, AI, vector/graph stores, job processing, authorization, and app-layer implementations) into the DI container.", + "responsibility": "Configures and registers infrastructure services and external clients (DBs, AI, vector/graph stores, job processing, authorization, and app-layer implementations) into the DI container.", + "technologyHints": [ + "csharp", + "Dependency Injection / Service Registration", + "Factory (DbContextFactory)", + "Resilience (retry pipeline)", + "Repository" + ], + "detailItems": [ + { + "label": "Owner", + "value": "DependencyInjection" + }, + { + "label": "Signature", + "value": "(this IServiceCollection services, IConfiguration configuration) -> IServiceCollection" + }, + { + "label": "Calls", + "value": "12" + }, + { + "label": "Action:branch", + "value": "Selects DB provider @L33" + }, + { + "label": "Action:branch", + "value": "Evaluates branch condition @L34" + }, + { + "label": "Action:fallback", + "value": "Falls back to alternate path @L44" + }, + { + "label": "Action:mapping", + "value": "Qdrant client registration @L56" + }, + { + "label": "Action:mapping", + "value": "Neo4j driver registration @L60" + }, + { + "label": "Action:branch", + "value": "Evaluates branch condition @L64" + }, + { + "label": "Domain", + "value": "Ebook / Epub processing, AI (chat/embeddings), Vector store (Qdrant)" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Infrastructure/DependencyInjection.cs:31:1", + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 31, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 31, + "sourceTargetKind": "method", + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ] + }, + { + "id": "flow_file_nexusreader_web_client_program_cs_file_1", + "label": "Program.cs", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "service", + "diagramFamily": "class-diagram", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:1:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 1, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 1, + "sourceTargetKind": "service", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61", + "label": "ThrowingDbContextFactory", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "class", + "diagramFamily": "class-diagram", + "architecturalLayer": "backend", + "summary": "IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.", + "responsibility": "IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Signature", + "value": "() -> AppDbContext" + }, + { + "label": "Calls", + "value": "0" + }, + { + "label": "Action:mapping", + "value": "NotSupportedException @L63" + }, + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "0" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:61:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 61, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 61, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66", + "label": "ThrowingEmbeddingGenerator", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "class", + "diagramFamily": "class-diagram", + "architecturalLayer": "backend", + "summary": "IEmbeddingGenerator implementation that disables local embedding generation in WASM (throws on GenerateAsync).", + "responsibility": "IEmbeddingGenerator implementation that disables local embedding generation in WASM (throws on GenerateAsync).", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "0" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:66:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 66, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 66, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74", + "label": "ThrowingBookStorageService", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "class", + "diagramFamily": "class-diagram", + "architecturalLayer": "backend", + "summary": "IBookStorageService implementation that throws for all file storage operations in WASM.", + "responsibility": "IBookStorageService implementation that throws for all file storage operations in WASM.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "1" + }, + { + "label": "ErrorMessage", + "value": "string required" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:74:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 74, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 74, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84", + "label": "ThrowingEbookRepository", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "class", + "diagramFamily": "class-diagram", + "architecturalLayer": "backend", + "summary": "IEbookRepository implementation that throws for all repository operations in WASM.", + "responsibility": "IEbookRepository implementation that throws for all repository operations in WASM.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "1" + }, + { + "label": "ErrorMessage", + "value": "string required" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:84:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 84, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 84, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94", + "label": "ThrowingSyncBroadcaster", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "class", + "diagramFamily": "class-diagram", + "architecturalLayer": "backend", + "summary": "ISyncBroadcaster implementation that throws because real-time broadcasting must run on the server.", + "responsibility": "ISyncBroadcaster implementation that throws because real-time broadcasting must run on the server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "0" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:94:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 94, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 94, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_webplatformservice_18", + "label": "WebPlatformService", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "dependency", + "diagramFamily": "class-diagram", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:18:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 18, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 18, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33", + "label": "NexusAuthenticationStateProvider", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "dependency", + "diagramFamily": "class-diagram", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:33:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 33, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 33, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38", + "label": "WasmKnowledgeService", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "dependency", + "diagramFamily": "class-diagram", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:38:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 38, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 38, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_configured_httpclient_40", + "label": "configured HttpClient", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "dependency", + "diagramFamily": "class-diagram", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:40:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 40, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 40, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49", + "label": "ThrowingDbContextFactory", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "class", + "diagramFamily": "class-diagram", + "architecturalLayer": "backend", + "summary": "IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.", + "responsibility": "IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "0" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:49:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 49, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 49, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_n_a_55", + "label": "N/A", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "dependency", + "diagramFamily": "class-diagram", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:55:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 55, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 55, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_wasmepubreader_56", + "label": "WasmEpubReader", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "dependency", + "diagramFamily": "class-diagram", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:56:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 56, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 56, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_file_nexusreader_web_program_cs_file_1", + "label": "Program.cs", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "service", + "diagramFamily": "class-diagram", + "architecturalLayer": "backend", + "summary": "Program bootstrap for the NexusReader.Web ASP.NET app: registers services, configures authentication/authorization, initializes DB, maps Minimal API endpoints (including knowledge, library, identity, Stripe webhooks), and starts the web host.", + "responsibility": "Program.cs is the composition root and runtime bootstrap: it registers DI services and policies, configures authentication (including Google), ensures DB migrations and seeding with retry/backoff, maps a set of Minimal API endpoints for knowledge features (protected by token-availability policy), handles Stripe webhooks to update subscription state, and supports both Server and WASM Blazor render modes.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Minimal APIs", + "Mediator/CQRS (MediatR)", + "Retry with exponential backoff" + ], + "detailItems": [ + { + "label": "Domain", + "value": "SubscriptionPlan, Knowledge (knowledge service, graph, summary), Ebook / EPUB ingestion" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web/Program.cs:1:1", + "path": "NexusReader.Web/Program.cs", + "line": 1, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 1, + "sourceTargetKind": "service", + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_program_cs_knowledgerequest_566", + "label": "KnowledgeRequest", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "dto", + "diagramFamily": "class-diagram", + "architecturalLayer": "backend", + "summary": "Request DTO carrying free-text input and optional ebook context for knowledge APIs.", + "responsibility": "Request DTO carrying free-text input and optional ebook context for knowledge APIs.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Minimal APIs", + "Mediator/CQRS (MediatR)", + "Retry with exponential backoff" + ], + "detailItems": [ + { + "label": "Shape", + "value": "dto" + }, + { + "label": "Fields", + "value": "2" + }, + { + "label": "Text", + "value": "string required" + }, + { + "label": "EbookId", + "value": "Guid?" + }, + { + "label": "Domain", + "value": "SubscriptionPlan, Knowledge (knowledge service, graph, summary), Ebook / EPUB ingestion" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web/Program.cs:566:1", + "path": "NexusReader.Web/Program.cs", + "line": 566, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 566, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_program_cs_groundednessrequest_567", + "label": "GroundednessRequest", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "dto", + "diagramFamily": "class-diagram", + "architecturalLayer": "backend", + "summary": "Request DTO for verifying answer groundedness in a context.", + "responsibility": "Request DTO for verifying answer groundedness in a context.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Minimal APIs", + "Mediator/CQRS (MediatR)", + "Retry with exponential backoff" + ], + "detailItems": [ + { + "label": "Shape", + "value": "dto" + }, + { + "label": "Fields", + "value": "2" + }, + { + "label": "Answer", + "value": "string required" + }, + { + "label": "Context", + "value": "string required" + }, + { + "label": "Domain", + "value": "SubscriptionPlan, Knowledge (knowledge service, graph, summary), Ebook / EPUB ingestion" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web/Program.cs:567:1", + "path": "NexusReader.Web/Program.cs", + "line": 567, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 567, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_program_cs_semanticsearchrequest_568", + "label": "SemanticSearchRequest", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "dto", + "diagramFamily": "class-diagram", + "architecturalLayer": "backend", + "summary": "DTO for semantic search requests with a limit.", + "responsibility": "DTO for semantic search requests with a limit.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Minimal APIs", + "Mediator/CQRS (MediatR)", + "Retry with exponential backoff" + ], + "detailItems": [ + { + "label": "Shape", + "value": "dto" + }, + { + "label": "Fields", + "value": "2" + }, + { + "label": "QueryText", + "value": "string required" + }, + { + "label": "Limit", + "value": "int" + }, + { + "label": "Domain", + "value": "SubscriptionPlan, Knowledge (knowledge service, graph, summary), Ebook / EPUB ingestion" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web/Program.cs:568:1", + "path": "NexusReader.Web/Program.cs", + "line": 568, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 568, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_program_cs_askquestionrequest_569", + "label": "AskQuestionRequest", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "dto", + "diagramFamily": "class-diagram", + "architecturalLayer": "backend", + "summary": "DTO for question-asking APIs including optional ebook context and limit.", + "responsibility": "DTO for question-asking APIs including optional ebook context and limit.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Minimal APIs", + "Mediator/CQRS (MediatR)", + "Retry with exponential backoff" + ], + "detailItems": [ + { + "label": "Shape", + "value": "dto" + }, + { + "label": "Fields", + "value": "3" + }, + { + "label": "Question", + "value": "string required" + }, + { + "label": "EbookId", + "value": "Guid?" + }, + { + "label": "Limit", + "value": "int" + }, + { + "label": "Domain", + "value": "SubscriptionPlan, Knowledge (knowledge service, graph, summary), Ebook / EPUB ingestion" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web/Program.cs:569:1", + "path": "NexusReader.Web/Program.cs", + "line": 569, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 569, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ] + }, + { + "id": "flow_file_nexusreader_web_client_program_cs_file_1", + "label": "Program.cs", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "service", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:1:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 1, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 1, + "sourceTargetKind": "service", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_action_nexusreader_web_client_program_cs_getservice_return_71_71", + "label": "returns null", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "return", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "public object? GetService(...) => null", + "responsibility": "public object? GetService(...) => null", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Action", + "value": "return" + }, + { + "label": "Signature", + "value": "(Type serviceType, object? serviceKey = null) -> object?" + }, + { + "label": "Calls", + "value": "0" + }, + { + "label": "Action:return", + "value": "returns null @L71" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:71:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 71, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 71, + "sourceTargetKind": "return", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88", + "label": "Reads repository or persistence state", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "step", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "public Task FindAuthorByNameAsync(string name, CancellationToken cancellationToken = default) => throw new NotSupportedException(ErrorMessage);", + "responsibility": "public Task FindAuthorByNameAsync(string name, CancellationToken cancellationToken = default) => throw new NotSupportedException(ErrorMessage);", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Action", + "value": "repository-read" + }, + { + "label": "Signature", + "value": "(string name, CancellationToken cancellationToken = default) -> Task" + }, + { + "label": "Calls", + "value": "0" + }, + { + "label": "Action:mapping", + "value": "NotSupportedException @L88" + }, + { + "label": "Action:repository-read", + "value": "Reads repository or persistence state @L88" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:88:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 88, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 88, + "sourceTargetKind": "step", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61", + "label": "ThrowingDbContextFactory", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "class", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.", + "responsibility": "IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Signature", + "value": "() -> AppDbContext" + }, + { + "label": "Calls", + "value": "0" + }, + { + "label": "Action:mapping", + "value": "NotSupportedException @L63" + }, + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "0" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:61:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 61, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 61, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66", + "label": "ThrowingEmbeddingGenerator", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "class", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "IEmbeddingGenerator implementation that disables local embedding generation in WASM (throws on GenerateAsync).", + "responsibility": "IEmbeddingGenerator implementation that disables local embedding generation in WASM (throws on GenerateAsync).", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "0" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:66:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 66, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 66, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74", + "label": "ThrowingBookStorageService", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "class", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "IBookStorageService implementation that throws for all file storage operations in WASM.", + "responsibility": "IBookStorageService implementation that throws for all file storage operations in WASM.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "1" + }, + { + "label": "ErrorMessage", + "value": "string required" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:74:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 74, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 74, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84", + "label": "ThrowingEbookRepository", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "class", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "IEbookRepository implementation that throws for all repository operations in WASM.", + "responsibility": "IEbookRepository implementation that throws for all repository operations in WASM.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "1" + }, + { + "label": "ErrorMessage", + "value": "string required" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:84:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 84, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 84, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94", + "label": "ThrowingSyncBroadcaster", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "class", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "ISyncBroadcaster implementation that throws because real-time broadcasting must run on the server.", + "responsibility": "ISyncBroadcaster implementation that throws because real-time broadcasting must run on the server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "0" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:94:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 94, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 94, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_webplatformservice_18", + "label": "WebPlatformService", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "dependency", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:18:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 18, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 18, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33", + "label": "NexusAuthenticationStateProvider", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "dependency", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:33:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 33, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 33, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38", + "label": "WasmKnowledgeService", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "dependency", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:38:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 38, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 38, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_configured_httpclient_40", + "label": "configured HttpClient", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "dependency", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:40:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 40, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 40, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49", + "label": "ThrowingDbContextFactory", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "class", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.", + "responsibility": "IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "0" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:49:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 49, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 49, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_n_a_55", + "label": "N/A", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "dependency", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:55:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 55, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 55, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_wasmepubreader_56", + "label": "WasmEpubReader", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "dependency", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:56:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 56, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 56, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_file_nexusreader_web_program_cs_file_1", + "label": "Program.cs", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "service", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "Program bootstrap for the NexusReader.Web ASP.NET app: registers services, configures authentication/authorization, initializes DB, maps Minimal API endpoints (including knowledge, library, identity, Stripe webhooks), and starts the web host.", + "responsibility": "Program.cs is the composition root and runtime bootstrap: it registers DI services and policies, configures authentication (including Google), ensures DB migrations and seeding with retry/backoff, maps a set of Minimal API endpoints for knowledge features (protected by token-availability policy), handles Stripe webhooks to update subscription state, and supports both Server and WASM Blazor render modes.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Minimal APIs", + "Mediator/CQRS (MediatR)", + "Retry with exponential backoff" + ], + "detailItems": [ + { + "label": "Domain", + "value": "SubscriptionPlan, Knowledge (knowledge service, graph, summary), Ebook / EPUB ingestion" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web/Program.cs:1:1", + "path": "NexusReader.Web/Program.cs", + "line": 1, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 1, + "sourceTargetKind": "service", + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "label": "Evaluates branch condition", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "step", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "if (!string.IsNullOrEmpty(apiBaseUrl))", + "responsibility": "if (!string.IsNullOrEmpty(apiBaseUrl))", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Minimal APIs", + "Mediator/CQRS (MediatR)", + "Retry with exponential backoff" + ], + "detailItems": [ + { + "label": "Action", + "value": "branch" + }, + { + "label": "Condition", + "value": "!string.IsNullOrEmpty(apiBaseUrl)" + }, + { + "label": "Outcomes", + "value": "true, false" + }, + { + "label": "Domain", + "value": "SubscriptionPlan, Knowledge (knowledge service, graph, summary), Ebook / EPUB ingestion" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web/Program.cs:62:1", + "path": "NexusReader.Web/Program.cs", + "line": 62, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 62, + "sourceTargetKind": "step", + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "label": "Falls back to alternate path", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "step", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "else", + "responsibility": "else", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Minimal APIs", + "Mediator/CQRS (MediatR)", + "Retry with exponential backoff" + ], + "detailItems": [ + { + "label": "Action", + "value": "fallback" + }, + { + "label": "Outcomes", + "value": "fallback" + }, + { + "label": "Domain", + "value": "SubscriptionPlan, Knowledge (knowledge service, graph, summary), Ebook / EPUB ingestion" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web/Program.cs:66:1", + "path": "NexusReader.Web/Program.cs", + "line": 66, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 66, + "sourceTargetKind": "step", + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ] + }, + { + "id": "flow_method_nexusreader_web_client_program_cs_getservice_71", + "label": "GetService", + "diagramId": "failure_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "method", + "diagramFamily": "control-flow", + "architecturalLayer": "backend", + "summary": "Fallback service resolver stub that always returns null.", + "responsibility": "Fallback service resolver stub that always returns null.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Signature", + "value": "(Type serviceType, object? serviceKey = null) -> object?" + }, + { + "label": "Calls", + "value": "0" + }, + { + "label": "Action:return", + "value": "returns null @L71" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:71:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 71, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 71, + "sourceTargetKind": "method", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_action_nexusreader_web_client_program_cs_getservice_return_71_71", + "label": "returns null", + "diagramId": "failure_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "return", + "diagramFamily": "control-flow", + "architecturalLayer": "backend", + "summary": "public object? GetService(...) => null", + "responsibility": "public object? GetService(...) => null", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Action", + "value": "return" + }, + { + "label": "Signature", + "value": "(Type serviceType, object? serviceKey = null) -> object?" + }, + { + "label": "Calls", + "value": "0" + }, + { + "label": "Action:return", + "value": "returns null @L71" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:71:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 71, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 71, + "sourceTargetKind": "return", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_method_nexusreader_web_program_cs_program_top_level_29", + "label": "Program (top-level)", + "diagramId": "failure_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "method", + "diagramFamily": "control-flow", + "architecturalLayer": "backend", + "summary": "Top-level program: build host, register services and middleware, map routes/endpoints, run the app.", + "responsibility": "Top-level program: build host, register services and middleware, map routes/endpoints, run the app.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Minimal APIs", + "Mediator/CQRS (MediatR)", + "Retry with exponential backoff" + ], + "detailItems": [ + { + "label": "Signature", + "value": "(args) -> Task" + }, + { + "label": "Calls", + "value": "6" + }, + { + "label": "Action:mapping", + "value": "Registers many scoped services and HTTP client @L33" + }, + { + "label": "Action:branch", + "value": "Evaluates branch condition @L62" + }, + { + "label": "Action:fallback", + "value": "Falls back to alternate path @L66" + }, + { + "label": "Action:mapping", + "value": "Adds policies including 'ProUser' and 'HasAvailableTokens' @L86" + }, + { + "label": "Action:mapping", + "value": "Configures authentication and Identity endpoints @L96" + }, + { + "label": "Action:repository-read", + "value": "Reads repository or persistence state @L125" + }, + { + "label": "Domain", + "value": "SubscriptionPlan, Knowledge (knowledge service, graph, summary), Ebook / EPUB ingestion" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web/Program.cs:29:1", + "path": "NexusReader.Web/Program.cs", + "line": 29, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 29, + "sourceTargetKind": "method", + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "label": "Evaluates branch condition", + "diagramId": "failure_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "step", + "diagramFamily": "control-flow", + "architecturalLayer": "backend", + "summary": "if (!string.IsNullOrEmpty(apiBaseUrl))", + "responsibility": "if (!string.IsNullOrEmpty(apiBaseUrl))", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Minimal APIs", + "Mediator/CQRS (MediatR)", + "Retry with exponential backoff" + ], + "detailItems": [ + { + "label": "Action", + "value": "branch" + }, + { + "label": "Condition", + "value": "!string.IsNullOrEmpty(apiBaseUrl)" + }, + { + "label": "Outcomes", + "value": "true, false" + }, + { + "label": "Domain", + "value": "SubscriptionPlan, Knowledge (knowledge service, graph, summary), Ebook / EPUB ingestion" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web/Program.cs:62:1", + "path": "NexusReader.Web/Program.cs", + "line": 62, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 62, + "sourceTargetKind": "step", + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "label": "Falls back to alternate path", + "diagramId": "failure_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "step", + "diagramFamily": "control-flow", + "architecturalLayer": "backend", + "summary": "else", + "responsibility": "else", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Minimal APIs", + "Mediator/CQRS (MediatR)", + "Retry with exponential backoff" + ], + "detailItems": [ + { + "label": "Action", + "value": "fallback" + }, + { + "label": "Outcomes", + "value": "fallback" + }, + { + "label": "Domain", + "value": "SubscriptionPlan, Knowledge (knowledge service, graph, summary), Ebook / EPUB ingestion" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web/Program.cs:66:1", + "path": "NexusReader.Web/Program.cs", + "line": 66, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 66, + "sourceTargetKind": "step", + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_237_237", + "label": "Evaluates branch condition", + "diagramId": "method_flows_graph", + "nodeRole": "step", + "diagramFamily": "method-flow", + "architecturalLayer": "backend", + "summary": "if (!app.Environment.IsDevelopment())", + "responsibility": "if (!app.Environment.IsDevelopment())", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Minimal APIs", + "Mediator/CQRS (MediatR)", + "Retry with exponential backoff" + ], + "detailItems": [ + { + "label": "Action", + "value": "branch" + }, + { + "label": "Condition", + "value": "!app.Environment.IsDevelopment()" + }, + { + "label": "Outcomes", + "value": "true, false" + }, + { + "label": "Domain", + "value": "SubscriptionPlan, Knowledge (knowledge service, graph, summary), Ebook / EPUB ingestion" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web/Program.cs:237:1", + "path": "NexusReader.Web/Program.cs", + "line": 237, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 237, + "sourceTargetKind": "step", + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ] + }, + { + "id": "flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1", + "label": "SyncHub", + "diagramId": "method_flows_graph", + "nodeRole": "class", + "diagramFamily": "method-flow", + "architecturalLayer": "backend", + "summary": "SignalR hub that mediates client realtime interactions for syncing reading progress and manages user groups.", + "responsibility": "SignalR hub that mediates client realtime interactions for syncing reading progress and manages user groups.", + "technologyHints": [ + "csharp", + "Mediator", + "SignalR Hub", + "Per-user group (User_{userId})" + ], + "detailItems": [ + { + "label": "Owner", + "value": "SyncHub" + }, + { + "label": "Signature", + "value": "(mediator: IMediator) -> void" + }, + { + "label": "Calls", + "value": "0" + }, + { + "label": "Action:mapping", + "value": "Depends on IMediator @L14" + }, + { + "label": "Action:mapping", + "value": "Stores mediator @L16" + }, + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "1" + }, + { + "label": "_mediator", + "value": "IMediator required" + }, + { + "label": "Domain", + "value": "ReadingProgress, User, Ebook" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Infrastructure/RealTime/SyncHub.cs:1:1", + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 1, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 1, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_synchub_14", + "label": "SyncHub", + "diagramId": "method_flows_graph", + "nodeRole": "class", + "diagramFamily": "method-flow", + "architecturalLayer": "backend", + "summary": "SignalR hub that mediates client realtime interactions for syncing reading progress and manages user groups.", + "responsibility": "SignalR hub that mediates client realtime interactions for syncing reading progress and manages user groups.", + "technologyHints": [ + "csharp", + "Mediator", + "SignalR Hub", + "Per-user group (User_{userId})" + ], + "detailItems": [ + { + "label": "Owner", + "value": "SyncHub" + }, + { + "label": "Signature", + "value": "(mediator: IMediator) -> void" + }, + { + "label": "Calls", + "value": "0" + }, + { + "label": "Action:mapping", + "value": "Depends on IMediator @L14" + }, + { + "label": "Action:mapping", + "value": "Stores mediator @L16" + }, + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "1" + }, + { + "label": "_mediator", + "value": "IMediator required" + }, + { + "label": "Domain", + "value": "ReadingProgress, User, Ebook" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Infrastructure/RealTime/SyncHub.cs:14:1", + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 14, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 14, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ] + }, + { + "id": "flow_file_nexusreader_web_client_handlers_authenticationheaderhandler_cs_file_1", + "label": "AuthenticationHeaderHandler", + "diagramId": "method_flows_graph", + "nodeRole": "class", + "diagramFamily": "method-flow", + "architecturalLayer": "backend", + "summary": "DelegatingHandler that attaches JWTs to trusted requests and orchestrates token refresh and retry behavior.", + "responsibility": "DelegatingHandler that attaches JWTs to trusted requests and orchestrates token refresh and retry behavior.", + "technologyHints": [ + "csharp", + "DelegatingHandler", + "Token auto-refresh", + "Semaphore-based concurrency guard", + "Scoped service resolution for transient operations" + ], + "detailItems": [ + { + "label": "Owner", + "value": "AuthenticationHeaderHandler" + }, + { + "label": "Signature", + "value": "(INativeStorageService storageService, IServiceProvider serviceProvider) -> AuthenticationHeaderHandler" + }, + { + "label": "Calls", + "value": "0" + }, + { + "label": "Action:mapping", + "value": "Store injected services @L23" + }, + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "4" + }, + { + "label": "_storageService", + "value": "INativeStorageService required" + }, + { + "label": "_serviceProvider", + "value": "IServiceProvider required" + }, + { + "label": "TokenKey", + "value": "const string required" + }, + { + "label": "_refreshSemaphore", + "value": "SemaphoreSlim required" + }, + { + "label": "Domain", + "value": "Authentication, JWT, Token refresh" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs:1:1", + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 1, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 1, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ] + }, + { + "id": "flow_method_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_112", + "label": "CloneHttpRequestMessageAsync", + "diagramId": "method_flows_graph", + "nodeRole": "method", + "diagramFamily": "method-flow", + "architecturalLayer": "backend", + "summary": "Creates a deep-ish clone of an HttpRequestMessage including method, URI, version, headers and buffered content to allow safe retry.", + "responsibility": "Creates a deep-ish clone of an HttpRequestMessage including method, URI, version, headers and buffered content to allow safe retry.", + "technologyHints": [ + "csharp", + "DelegatingHandler", + "Token auto-refresh", + "Semaphore-based concurrency guard", + "Scoped service resolution for transient operations" + ], + "detailItems": [ + { + "label": "Owner", + "value": "AuthenticationHeaderHandler" + }, + { + "label": "Signature", + "value": "(HttpRequestMessage req) -> Task" + }, + { + "label": "Calls", + "value": "0" + }, + { + "label": "Action:mapping", + "value": "Create new HttpRequestMessage clone @L114" + }, + { + "label": "Action:mapping", + "value": "Copy request content stream and headers @L119" + }, + { + "label": "Action:branch", + "value": "Evaluates branch condition @L119" + }, + { + "label": "Action:loop", + "value": "Repeats work over a collection or condition @L126" + }, + { + "label": "Action:mapping", + "value": "Copy request headers @L132" + }, + { + "label": "Action:loop", + "value": "Repeats work over a collection or condition @L132" + }, + { + "label": "Domain", + "value": "Authentication, JWT, Token refresh" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs:112:1", + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 112, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 112, + "sourceTargetKind": "method", + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ] + }, + { + "id": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_branch_119_119", + "label": "Evaluates branch condition", + "diagramId": "method_flows_graph", + "nodeRole": "step", + "diagramFamily": "method-flow", + "architecturalLayer": "backend", + "summary": "if (req.Content != null)", + "responsibility": "if (req.Content != null)", + "technologyHints": [ + "csharp", + "DelegatingHandler", + "Token auto-refresh", + "Semaphore-based concurrency guard", + "Scoped service resolution for transient operations" + ], + "detailItems": [ + { + "label": "Owner", + "value": "AuthenticationHeaderHandler" + }, + { + "label": "Action", + "value": "branch" + }, + { + "label": "Condition", + "value": "req.Content != null" + }, + { + "label": "Outcomes", + "value": "true, false" + }, + { + "label": "Domain", + "value": "Authentication, JWT, Token refresh" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs:119:1", + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 119, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 119, + "sourceTargetKind": "step", + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ] + }, + { + "id": "flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1", + "label": "EpubReaderService", + "diagramId": "method_flows_graph", + "nodeRole": "service", + "diagramFamily": "method-flow", + "architecturalLayer": "backend", + "summary": "Service that locates EPUB files recorded in the database, parses a requested chapter, splits the chapter into sanitized content blocks, injects AI-action trigger blocks at thresholds, and returns a ReaderPageViewModel for consumption by the application.", + "responsibility": "Important behaviors: DB lookup with user guard, file path resolution that handles dev/prod layouts, EPUB parsing via external library, paragraph extraction and HTML sanitization, word-count-based insertion of AI trigger blocks (WordThreshold = 1000), recursive navigation-title lookup, and robust error logging with Result-based failure propagation.", + "technologyHints": [ + "csharp", + "Service", + "Repository-access (via DbContext)", + "Factory (CreateAiTrigger)", + "Parsing & sanitization pipeline" + ], + "detailItems": [ + { + "label": "Owner", + "value": "EpubReaderService" + }, + { + "label": "Domain", + "value": "Ebook, Chapter/ReadingOrder, ContentBlock (TextSegmentBlock, AiActionTriggerBlock)" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Infrastructure/Services/EpubReaderService.cs:1:1", + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 1, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 1, + "sourceTargetKind": "service", + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_19", + "label": "UpdateProgress", + "diagramId": "method_flows_graph", + "nodeRole": "method", + "diagramFamily": "method-flow", + "architecturalLayer": "backend", + "summary": "Receives client progress updates, obtains the calling user id and forwards an UpdateReadingProgressCommand via MediatR when user is present.", + "responsibility": "Receives client progress updates, obtains the calling user id and forwards an UpdateReadingProgressCommand via MediatR when user is present.", + "technologyHints": [ + "csharp", + "Mediator", + "SignalR Hub", + "Per-user group (User_{userId})" + ], + "detailItems": [ + { + "label": "Owner", + "value": "SyncHub" + }, + { + "label": "Signature", + "value": "(pageId: string, ebookId: Guid, progress: double, chapterTitle: string? , chapterIndex: int) -> Task" + }, + { + "label": "Calls", + "value": "1" + }, + { + "label": "Action:repository-read", + "value": "Reads repository or persistence state @L21" + }, + { + "label": "Action:external-call", + "value": "Reads user id from connection context @L21" + }, + { + "label": "Action:guard-clause", + "value": "Requires authenticated user id @L21" + }, + { + "label": "Action:branch", + "value": "Evaluates branch condition @L22" + }, + { + "label": "Action:external-call", + "value": "Dispatches command to application layer @L24" + }, + { + "label": "Action:mapping", + "value": "Includes connection id in command @L24" + }, + { + "label": "Domain", + "value": "ReadingProgress, User, Ebook" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Infrastructure/RealTime/SyncHub.cs:19:1", + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 19, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 19, + "sourceTargetKind": "method", + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_repository_read_21_21", + "label": "Reads repository or persistence state", + "diagramId": "method_flows_graph", + "nodeRole": "step", + "diagramFamily": "method-flow", + "architecturalLayer": "backend", + "summary": "var userId = Context.User?.FindFirst(ClaimTypes.NameIdentifier)?.Value;", + "responsibility": "var userId = Context.User?.FindFirst(ClaimTypes.NameIdentifier)?.Value;", + "technologyHints": [ + "csharp", + "Mediator", + "SignalR Hub", + "Per-user group (User_{userId})" + ], + "detailItems": [ + { + "label": "Owner", + "value": "SyncHub" + }, + { + "label": "Action", + "value": "repository-read" + }, + { + "label": "Domain", + "value": "ReadingProgress, User, Ebook" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Infrastructure/RealTime/SyncHub.cs:21:1", + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 21, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 21, + "sourceTargetKind": "step", + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_28", + "label": "OnConnectedAsync", + "diagramId": "method_flows_graph", + "nodeRole": "method", + "diagramFamily": "method-flow", + "architecturalLayer": "backend", + "summary": "When a client connects, adds their connection to a per-user SignalR group (User_{userId}) and calls base connection logic.", + "responsibility": "When a client connects, adds their connection to a per-user SignalR group (User_{userId}) and calls base connection logic.", + "technologyHints": [ + "csharp", + "Mediator", + "SignalR Hub", + "Per-user group (User_{userId})" + ], + "detailItems": [ + { + "label": "Owner", + "value": "SyncHub" + }, + { + "label": "Signature", + "value": "() -> Task" + }, + { + "label": "Calls", + "value": "0" + }, + { + "label": "Action:external-call", + "value": "Reads Context.UserIdentifier @L30" + }, + { + "label": "Action:repository-read", + "value": "Reads repository or persistence state @L30" + }, + { + "label": "Action:branch", + "value": "Evaluates branch condition @L31" + }, + { + "label": "Action:guard-clause", + "value": "Only add to group if userId present @L31" + }, + { + "label": "Action:external-call", + "value": "Adds connection to per-user group @L33" + }, + { + "label": "Action:repository-read", + "value": "Reads repository or persistence state @L33" + }, + { + "label": "Domain", + "value": "ReadingProgress, User, Ebook" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Infrastructure/RealTime/SyncHub.cs:28:1", + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 28, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 28, + "sourceTargetKind": "method", + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_repository_read_30_30", + "label": "Reads repository or persistence state", + "diagramId": "method_flows_graph", + "nodeRole": "step", + "diagramFamily": "method-flow", + "architecturalLayer": "backend", + "summary": "var userId = Context.UserIdentifier;", + "responsibility": "var userId = Context.UserIdentifier;", + "technologyHints": [ + "csharp", + "Mediator", + "SignalR Hub", + "Per-user group (User_{userId})" + ], + "detailItems": [ + { + "label": "Owner", + "value": "SyncHub" + }, + { + "label": "Action", + "value": "repository-read" + }, + { + "label": "Domain", + "value": "ReadingProgress, User, Ebook" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Infrastructure/RealTime/SyncHub.cs:30:1", + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 30, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 30, + "sourceTargetKind": "step", + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_38", + "label": "OnDisconnectedAsync", + "diagramId": "method_flows_graph", + "nodeRole": "method", + "diagramFamily": "method-flow", + "architecturalLayer": "backend", + "summary": "When a client disconnects, removes their connection from the per-user SignalR group and invokes base disconnect logic.", + "responsibility": "When a client disconnects, removes their connection from the per-user SignalR group and invokes base disconnect logic.", + "technologyHints": [ + "csharp", + "Mediator", + "SignalR Hub", + "Per-user group (User_{userId})" + ], + "detailItems": [ + { + "label": "Owner", + "value": "SyncHub" + }, + { + "label": "Signature", + "value": "(exception: Exception?) -> Task" + }, + { + "label": "Calls", + "value": "0" + }, + { + "label": "Action:external-call", + "value": "Reads Context.UserIdentifier @L40" + }, + { + "label": "Action:repository-read", + "value": "Reads repository or persistence state @L40" + }, + { + "label": "Action:branch", + "value": "Evaluates branch condition @L41" + }, + { + "label": "Action:guard-clause", + "value": "Only remove from group if userId present @L41" + }, + { + "label": "Action:repository-read", + "value": "Reads repository or persistence state @L43" + }, + { + "label": "Action:external-call", + "value": "Removes connection from per-user group @L43" + }, + { + "label": "Domain", + "value": "ReadingProgress, User, Ebook" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Infrastructure/RealTime/SyncHub.cs:38:1", + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 38, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 38, + "sourceTargetKind": "method", + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_repository_read_40_40", + "label": "Reads repository or persistence state", + "diagramId": "method_flows_graph", + "nodeRole": "step", + "diagramFamily": "method-flow", + "architecturalLayer": "backend", + "summary": "var userId = Context.UserIdentifier;", + "responsibility": "var userId = Context.UserIdentifier;", + "technologyHints": [ + "csharp", + "Mediator", + "SignalR Hub", + "Per-user group (User_{userId})" + ], + "detailItems": [ + { + "label": "Owner", + "value": "SyncHub" + }, + { + "label": "Action", + "value": "repository-read" + }, + { + "label": "Domain", + "value": "ReadingProgress, User, Ebook" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Infrastructure/RealTime/SyncHub.cs:40:1", + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 40, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 40, + "sourceTargetKind": "step", + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_175", + "label": "CountWords", + "diagramId": "method_flows_graph", + "nodeRole": "method", + "diagramFamily": "method-flow", + "architecturalLayer": "backend", + "summary": "Count words in a string using whitespace separators; returns 0 for null/whitespace.", + "responsibility": "Count words in a string using whitespace separators; returns 0 for null/whitespace.", + "technologyHints": [ + "csharp", + "Service", + "Repository-access (via DbContext)", + "Factory (CreateAiTrigger)", + "Parsing & sanitization pipeline" + ], + "detailItems": [ + { + "label": "Owner", + "value": "EpubReaderService" + }, + { + "label": "Signature", + "value": "(text: string) -> int" + }, + { + "label": "Calls", + "value": "0" + }, + { + "label": "Action:guard-clause", + "value": "Empty text check @L177" + }, + { + "label": "Action:guard-clause", + "value": "Guards early exit or rejection path @L177" + }, + { + "label": "Action:return", + "value": "Returns result @L178" + }, + { + "label": "Action:mapping", + "value": "Split and count words @L178" + }, + { + "label": "Domain", + "value": "Ebook, Chapter/ReadingOrder, ContentBlock (TextSegmentBlock, AiActionTriggerBlock)" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Infrastructure/Services/EpubReaderService.cs:175:1", + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 175, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 175, + "sourceTargetKind": "method", + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_guard_clause_177_177", + "label": "Empty text check", + "diagramId": "method_flows_graph", + "nodeRole": "step", + "diagramFamily": "method-flow", + "architecturalLayer": "backend", + "summary": "Empty text check", + "responsibility": "Important behaviors: DB lookup with user guard, file path resolution that handles dev/prod layouts, EPUB parsing via external library, paragraph extraction and HTML sanitization, word-count-based insertion of AI trigger blocks (WordThreshold = 1000), recursive navigation-title lookup, and robust error logging with Result-based failure propagation.", + "technologyHints": [ + "csharp", + "Service", + "Repository-access (via DbContext)", + "Factory (CreateAiTrigger)", + "Parsing & sanitization pipeline" + ], + "detailItems": [ + { + "label": "Owner", + "value": "EpubReaderService" + }, + { + "label": "Action", + "value": "guard-clause" + }, + { + "label": "Condition", + "value": "string.IsNullOrWhiteSpace(text)" + }, + { + "label": "Outcomes", + "value": "return 0, continue" + }, + { + "label": "Domain", + "value": "Ebook, Chapter/ReadingOrder, ContentBlock (TextSegmentBlock, AiActionTriggerBlock)" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Infrastructure/Services/EpubReaderService.cs:177:1", + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 177, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 177, + "sourceTargetKind": "step", + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ] + } + ], + "edgeMetadata": [ + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauiprogram_10_defines_type_10", + "diagramId": "dependency_map_graph", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_mauiprogram_10", + "relation": "transforms", + "label": "model MauiProgram", + "semanticLabel": "model MauiProgram", + "semanticTitle": "model MauiProgram", + "collapsedLabel": "model MauiProgram", + "expandedLabel": "defines-type", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 10, + "sourceTargetKind": "call-site", + "outputSummary": "Static host for MAUI app startup logic and DI composition.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28_registers_service_28", + "diagramId": "dependency_map_graph", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28", + "relation": "uses", + "label": "IPlatformService", + "semanticLabel": "IPlatformService", + "semanticTitle": "IPlatformService", + "collapsedLabel": "IPlatformService", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 28, + "sourceTargetKind": "call-site", + "outputSummary": "Registers platform abstraction implemented for MAUI", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29_registers_service_29", + "diagramId": "dependency_map_graph", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29", + "relation": "uses", + "label": "INativeStorageService", + "semanticLabel": "INativeStorageService", + "semanticTitle": "INativeStorageService", + "collapsedLabel": "INativeStorageService", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 29, + "sourceTargetKind": "call-site", + "outputSummary": "Registers platform native storage implementation", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32_registers_service_32", + "diagramId": "dependency_map_graph", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32", + "relation": "uses", + "label": "NexusAuthenticationStateProvider", + "semanticLabel": "NexusAuthenticationStateProvider", + "semanticTitle": "NexusAuthenticationStateProvider", + "collapsedLabel": "NexusAuthenticationStateProvider", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 32, + "sourceTargetKind": "call-site", + "outputSummary": "Concrete auth state provider registered", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33_registers_service_33", + "diagramId": "dependency_map_graph", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33", + "relation": "uses", + "label": "Microsoft.AspNetCore.Components.Authorization.AuthenticationStateProvider", + "semanticLabel": "Microsoft.AspNetCore.Components.Authorization.AuthenticationStateProvider", + "semanticTitle": "Microsoft.AspNetCore.Components.Authorization.AuthenticationStateProvider", + "collapsedLabel": "Microsoft.AspNetCore.Components.Authorization.AuthenticationStateProvider", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 33, + "sourceTargetKind": "call-site", + "outputSummary": "Maps framework AuthenticationStateProvider to NexusAuthenticationStateProvider via service locator factory", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38_registers_service_38", + "diagramId": "dependency_map_graph", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38", + "relation": "uses", + "label": "HttpClient", + "semanticLabel": "HttpClient", + "semanticTitle": "HttpClient", + "collapsedLabel": "HttpClient", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 38, + "sourceTargetKind": "call-site", + "outputSummary": "Registers HttpClient with BaseAddress = http://10.0.2.2:5000 (Android emulator to local server)", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1_registers_service_1", + "diagramId": "dependency_map_graph", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1", + "relation": "uses", + "label": "UI and app state services", + "semanticLabel": "UI and app state services", + "semanticTitle": "UI and app state services", + "collapsedLabel": "UI and app state services", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 1, + "sourceTargetKind": "call-site", + "outputSummary": "Registers multiple scoped services handling UI state, knowledge coordination, sync and identity", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51_registers_service_51", + "diagramId": "dependency_map_graph", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51", + "relation": "uses", + "label": "Application layer services extension", + "semanticLabel": "Application layer services (extension)", + "semanticTitle": "Application layer services (extension)", + "collapsedLabel": "Application layer services extension", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 51, + "sourceTargetKind": "call-site", + "outputSummary": "Calls AddApplication() extension to register Application-layer services", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53_registers_service_53", + "diagramId": "dependency_map_graph", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53", + "relation": "uses", + "label": "MediatR handlers", + "semanticLabel": "MediatR handlers", + "semanticTitle": "MediatR handlers", + "collapsedLabel": "MediatR handlers", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 53, + "sourceTargetKind": "call-site", + "outputSummary": "Registers MediatR and scans NexusReader.Application assembly for handlers", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61_defines_type_61", + "diagramId": "dependency_map_graph", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61", + "relation": "transforms", + "label": "model ThrowingDbContextFactory", + "semanticLabel": "model ThrowingDbContextFactory", + "semanticTitle": "model ThrowingDbContextFactory", + "collapsedLabel": "model ThrowingDbContextFactory", + "expandedLabel": "defines-type", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 61, + "sourceTargetKind": "call-site", + "outputSummary": "IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66_defines_type_66", + "diagramId": "dependency_map_graph", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66", + "relation": "transforms", + "label": "model ThrowingEmbeddingGenerator", + "semanticLabel": "model ThrowingEmbeddingGenerator", + "semanticTitle": "model ThrowingEmbeddingGenerator", + "collapsedLabel": "model ThrowingEmbeddingGenerator", + "expandedLabel": "defines-type", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 66, + "sourceTargetKind": "call-site", + "outputSummary": "IEmbeddingGenerator implementation that disables local embedding generation in WASM (throws on GenerateAsync).", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74_defines_type_74", + "diagramId": "dependency_map_graph", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74", + "relation": "transforms", + "label": "model ThrowingBookStorageService", + "semanticLabel": "model ThrowingBookStorageService", + "semanticTitle": "model ThrowingBookStorageService", + "collapsedLabel": "model ThrowingBookStorageService", + "expandedLabel": "defines-type", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 74, + "sourceTargetKind": "call-site", + "outputSummary": "IBookStorageService implementation that throws for all file storage operations in WASM.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84_defines_type_84", + "diagramId": "dependency_map_graph", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84", + "relation": "transforms", + "label": "model ThrowingEbookRepository", + "semanticLabel": "model ThrowingEbookRepository", + "semanticTitle": "model ThrowingEbookRepository", + "collapsedLabel": "model ThrowingEbookRepository", + "expandedLabel": "defines-type", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 84, + "sourceTargetKind": "call-site", + "outputSummary": "IEbookRepository implementation that throws for all repository operations in WASM.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94_defines_type_94", + "diagramId": "dependency_map_graph", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94", + "relation": "transforms", + "label": "model ThrowingSyncBroadcaster", + "semanticLabel": "model ThrowingSyncBroadcaster", + "semanticTitle": "model ThrowingSyncBroadcaster", + "collapsedLabel": "model ThrowingSyncBroadcaster", + "expandedLabel": "defines-type", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 94, + "sourceTargetKind": "call-site", + "outputSummary": "ISyncBroadcaster implementation that throws because real-time broadcasting must run on the server.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_webplatformservice_18_registers_service_18", + "diagramId": "dependency_map_graph", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_webplatformservice_18", + "relation": "uses", + "label": "IPlatformService", + "semanticLabel": "IPlatformService", + "semanticTitle": "IPlatformService", + "collapsedLabel": "IPlatformService", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 18, + "sourceTargetKind": "call-site", + "outputSummary": "Registers platform abstraction for browser.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33_registers_service_33", + "diagramId": "dependency_map_graph", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33", + "relation": "uses", + "label": "NexusAuthenticationStateProvider", + "semanticLabel": "NexusAuthenticationStateProvider", + "semanticTitle": "NexusAuthenticationStateProvider", + "collapsedLabel": "NexusAuthenticationStateProvider", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 33, + "sourceTargetKind": "call-site", + "outputSummary": "Authentication state provider and wiring to AuthenticationStateProvider.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38_registers_service_38", + "diagramId": "dependency_map_graph", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38", + "relation": "uses", + "label": "IKnowledgeService", + "semanticLabel": "IKnowledgeService", + "semanticTitle": "IKnowledgeService", + "collapsedLabel": "IKnowledgeService", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 38, + "sourceTargetKind": "call-site", + "outputSummary": "Registers a WASM-specific knowledge service implementation.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_configured_httpclient_40_registers_service_40", + "diagramId": "dependency_map_graph", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_configured_httpclient_40", + "relation": "uses", + "label": "uses", + "semanticLabel": "HttpClient (named 'NexusAPI')", + "semanticTitle": "HttpClient (named 'NexusAPI')", + "collapsedLabel": "uses", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 40, + "sourceTargetKind": "call-site", + "outputSummary": "Adds named HTTP client with base address and authentication header handler.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28_registers_service_28", + "diagramId": "startup_runtime_graph", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28", + "relation": "uses", + "label": "IPlatformService", + "semanticLabel": "IPlatformService", + "semanticTitle": "IPlatformService", + "collapsedLabel": "IPlatformService", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 28, + "sourceTargetKind": "call-site", + "outputSummary": "Registers platform abstraction implemented for MAUI", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29_registers_service_29", + "diagramId": "startup_runtime_graph", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29", + "relation": "uses", + "label": "INativeStorageService", + "semanticLabel": "INativeStorageService", + "semanticTitle": "INativeStorageService", + "collapsedLabel": "INativeStorageService", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 29, + "sourceTargetKind": "call-site", + "outputSummary": "Registers platform native storage implementation", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32_registers_service_32", + "diagramId": "startup_runtime_graph", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32", + "relation": "uses", + "label": "NexusAuthenticationStateProvider", + "semanticLabel": "NexusAuthenticationStateProvider", + "semanticTitle": "NexusAuthenticationStateProvider", + "collapsedLabel": "NexusAuthenticationStateProvider", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 32, + "sourceTargetKind": "call-site", + "outputSummary": "Concrete auth state provider registered", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33_registers_service_33", + "diagramId": "startup_runtime_graph", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33", + "relation": "uses", + "label": "Microsoft.AspNetCore.Components.Authorization.AuthenticationStateProvider", + "semanticLabel": "Microsoft.AspNetCore.Components.Authorization.AuthenticationStateProvider", + "semanticTitle": "Microsoft.AspNetCore.Components.Authorization.AuthenticationStateProvider", + "collapsedLabel": "Microsoft.AspNetCore.Components.Authorization.AuthenticationStateProvider", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 33, + "sourceTargetKind": "call-site", + "outputSummary": "Maps framework AuthenticationStateProvider to NexusAuthenticationStateProvider via service locator factory", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38_registers_service_38", + "diagramId": "startup_runtime_graph", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38", + "relation": "uses", + "label": "HttpClient", + "semanticLabel": "HttpClient", + "semanticTitle": "HttpClient", + "collapsedLabel": "HttpClient", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 38, + "sourceTargetKind": "call-site", + "outputSummary": "Registers HttpClient with BaseAddress = http://10.0.2.2:5000 (Android emulator to local server)", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1_registers_service_1", + "diagramId": "startup_runtime_graph", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1", + "relation": "uses", + "label": "UI and app state services", + "semanticLabel": "UI and app state services", + "semanticTitle": "UI and app state services", + "collapsedLabel": "UI and app state services", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 1, + "sourceTargetKind": "call-site", + "outputSummary": "Registers multiple scoped services handling UI state, knowledge coordination, sync and identity", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51_registers_service_51", + "diagramId": "startup_runtime_graph", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51", + "relation": "uses", + "label": "Application layer services extension", + "semanticLabel": "Application layer services (extension)", + "semanticTitle": "Application layer services (extension)", + "collapsedLabel": "Application layer services extension", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 51, + "sourceTargetKind": "call-site", + "outputSummary": "Calls AddApplication() extension to register Application-layer services", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53_registers_service_53", + "diagramId": "startup_runtime_graph", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53", + "relation": "uses", + "label": "MediatR handlers", + "semanticLabel": "MediatR handlers", + "semanticTitle": "MediatR handlers", + "collapsedLabel": "MediatR handlers", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 53, + "sourceTargetKind": "call-site", + "outputSummary": "Registers MediatR and scans NexusReader.Application assembly for handlers", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_method_nexusreader_maui_mauiprogram_cs_create_and_build_mauiapp_16_configures_pipeline_16", + "diagramId": "startup_runtime_graph", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_method_nexusreader_maui_mauiprogram_cs_create_and_build_mauiapp_16", + "relation": "calls", + "label": "unknown", + "semanticLabel": "unknown", + "semanticTitle": "unknown", + "collapsedLabel": "unknown", + "expandedLabel": "configures-pipeline", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 16, + "sourceTargetKind": "call-site", + "outputSummary": "unknown", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_webplatformservice_18_registers_service_18", + "diagramId": "startup_runtime_graph", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_webplatformservice_18", + "relation": "uses", + "label": "IPlatformService", + "semanticLabel": "IPlatformService", + "semanticTitle": "IPlatformService", + "collapsedLabel": "IPlatformService", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 18, + "sourceTargetKind": "call-site", + "outputSummary": "Registers platform abstraction for browser.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33_registers_service_33", + "diagramId": "startup_runtime_graph", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33", + "relation": "uses", + "label": "NexusAuthenticationStateProvider", + "semanticLabel": "NexusAuthenticationStateProvider", + "semanticTitle": "NexusAuthenticationStateProvider", + "collapsedLabel": "NexusAuthenticationStateProvider", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 33, + "sourceTargetKind": "call-site", + "outputSummary": "Authentication state provider and wiring to AuthenticationStateProvider.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38_registers_service_38", + "diagramId": "startup_runtime_graph", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38", + "relation": "uses", + "label": "IKnowledgeService", + "semanticLabel": "IKnowledgeService", + "semanticTitle": "IKnowledgeService", + "collapsedLabel": "IKnowledgeService", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 38, + "sourceTargetKind": "call-site", + "outputSummary": "Registers a WASM-specific knowledge service implementation.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_configured_httpclient_40_registers_service_40", + "diagramId": "startup_runtime_graph", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_configured_httpclient_40", + "relation": "uses", + "label": "uses", + "semanticLabel": "HttpClient (named 'NexusAPI')", + "semanticTitle": "HttpClient (named 'NexusAPI')", + "collapsedLabel": "uses", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 40, + "sourceTargetKind": "call-site", + "outputSummary": "Adds named HTTP client with base address and authentication header handler.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49_registers_service_49", + "diagramId": "startup_runtime_graph", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49", + "relation": "uses", + "label": "IDbContextFactory AppDbContext>", + "semanticLabel": "IDbContextFactory", + "semanticTitle": "IDbContextFactory", + "collapsedLabel": "IDbContextFactory AppDbContext>", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 49, + "sourceTargetKind": "call-site", + "outputSummary": "Registers throw-only stub to avoid using DbContext in WASM.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_n_a_55_registers_service_55", + "diagramId": "startup_runtime_graph", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_n_a_55", + "relation": "uses", + "label": "application services via extension", + "semanticLabel": "application services (via extension)", + "semanticTitle": "application services (via extension)", + "collapsedLabel": "application services via extension", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 55, + "sourceTargetKind": "call-site", + "outputSummary": "Calls AddApplication() to register application-layer services.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15_invokes_15", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15", + "relation": "calls", + "label": "Program top-level startup", + "semanticLabel": "Program (top-level startup)", + "semanticTitle": "Program (top-level startup)", + "collapsedLabel": "Program top-level startup", + "expandedLabel": "handles-route", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 15, + "sourceTargetKind": "call-site", + "outputSummary": "Create the WebAssemblyHostBuilder, register application and platform services, add HTTP client and dummy server-only stubs, then build and run the WASM host.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_getservice_71_invokes_71", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_method_nexusreader_web_client_program_cs_getservice_71", + "relation": "calls", + "label": "GetService", + "semanticLabel": "GetService", + "semanticTitle": "GetService", + "collapsedLabel": "GetService", + "expandedLabel": "handles-route", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 71, + "sourceTargetKind": "call-site", + "outputSummary": "Fallback service resolver stub that always returns null.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_method_nexusreader_web_client_program_cs_getservice_71_flow_action_nexusreader_web_client_program_cs_getservice_return_71_71_returns_71", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "from": "flow_method_nexusreader_web_client_program_cs_getservice_71", + "to": "flow_action_nexusreader_web_client_program_cs_getservice_return_71_71", + "relation": "returns", + "label": "returns null", + "semanticLabel": "returns null", + "semanticTitle": "returns null", + "collapsedLabel": "returns null", + "expandedLabel": "returns", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 71, + "sourceTargetKind": "return-source", + "outputSummary": "public object? GetService(...) => null", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88_invokes_88", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88", + "relation": "calls", + "label": "FindAuthorByNameAsync", + "semanticLabel": "FindAuthorByNameAsync", + "semanticTitle": "FindAuthorByNameAsync", + "collapsedLabel": "FindAuthorByNameAsync", + "expandedLabel": "handles-route", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 88, + "sourceTargetKind": "call-site", + "outputSummary": "Repository lookup stub that throws because repository access is unsupported in WASM.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88_flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88_invokes_88", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "from": "flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88", + "to": "flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88", + "relation": "calls", + "label": "Reads repository or persistence state", + "semanticLabel": "Reads repository or persistence state", + "semanticTitle": "Reads repository or persistence state", + "collapsedLabel": "Reads repository or persistence state", + "expandedLabel": "invokes", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 88, + "sourceTargetKind": "call-site", + "outputSummary": "public Task FindAuthorByNameAsync(string name, CancellationToken cancellationToken = default) => throw new NotSupportedException(ErrorMessage);", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61_defines_type_61", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61", + "relation": "transforms", + "label": "model ThrowingDbContextFactory", + "semanticLabel": "model ThrowingDbContextFactory", + "semanticTitle": "model ThrowingDbContextFactory", + "collapsedLabel": "model ThrowingDbContextFactory", + "expandedLabel": "defines-type", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 61, + "sourceTargetKind": "call-site", + "outputSummary": "IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66_defines_type_66", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66", + "relation": "transforms", + "label": "model ThrowingEmbeddingGenerator", + "semanticLabel": "model ThrowingEmbeddingGenerator", + "semanticTitle": "model ThrowingEmbeddingGenerator", + "collapsedLabel": "model ThrowingEmbeddingGenerator", + "expandedLabel": "defines-type", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 66, + "sourceTargetKind": "call-site", + "outputSummary": "IEmbeddingGenerator implementation that disables local embedding generation in WASM (throws on GenerateAsync).", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74_defines_type_74", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74", + "relation": "transforms", + "label": "model ThrowingBookStorageService", + "semanticLabel": "model ThrowingBookStorageService", + "semanticTitle": "model ThrowingBookStorageService", + "collapsedLabel": "model ThrowingBookStorageService", + "expandedLabel": "defines-type", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 74, + "sourceTargetKind": "call-site", + "outputSummary": "IBookStorageService implementation that throws for all file storage operations in WASM.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84_defines_type_84", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84", + "relation": "transforms", + "label": "model ThrowingEbookRepository", + "semanticLabel": "model ThrowingEbookRepository", + "semanticTitle": "model ThrowingEbookRepository", + "collapsedLabel": "model ThrowingEbookRepository", + "expandedLabel": "defines-type", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 84, + "sourceTargetKind": "call-site", + "outputSummary": "IEbookRepository implementation that throws for all repository operations in WASM.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94_defines_type_94", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94", + "relation": "transforms", + "label": "model ThrowingSyncBroadcaster", + "semanticLabel": "model ThrowingSyncBroadcaster", + "semanticTitle": "model ThrowingSyncBroadcaster", + "collapsedLabel": "model ThrowingSyncBroadcaster", + "expandedLabel": "defines-type", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 94, + "sourceTargetKind": "call-site", + "outputSummary": "ISyncBroadcaster implementation that throws because real-time broadcasting must run on the server.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_webplatformservice_18_registers_service_18", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_webplatformservice_18", + "relation": "uses", + "label": "IPlatformService", + "semanticLabel": "IPlatformService", + "semanticTitle": "IPlatformService", + "collapsedLabel": "IPlatformService", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 18, + "sourceTargetKind": "call-site", + "outputSummary": "Registers platform abstraction for browser.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33_registers_service_33", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33", + "relation": "uses", + "label": "NexusAuthenticationStateProvider", + "semanticLabel": "NexusAuthenticationStateProvider", + "semanticTitle": "NexusAuthenticationStateProvider", + "collapsedLabel": "NexusAuthenticationStateProvider", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 33, + "sourceTargetKind": "call-site", + "outputSummary": "Authentication state provider and wiring to AuthenticationStateProvider.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38_registers_service_38", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38", + "relation": "uses", + "label": "IKnowledgeService", + "semanticLabel": "IKnowledgeService", + "semanticTitle": "IKnowledgeService", + "collapsedLabel": "IKnowledgeService", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 38, + "sourceTargetKind": "call-site", + "outputSummary": "Registers a WASM-specific knowledge service implementation.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_configured_httpclient_40_registers_service_40", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_configured_httpclient_40", + "relation": "uses", + "label": "uses", + "semanticLabel": "HttpClient (named 'NexusAPI')", + "semanticTitle": "HttpClient (named 'NexusAPI')", + "collapsedLabel": "uses", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 40, + "sourceTargetKind": "call-site", + "outputSummary": "Adds named HTTP client with base address and authentication header handler.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49_registers_service_49", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49", + "relation": "uses", + "label": "IDbContextFactory AppDbContext>", + "semanticLabel": "IDbContextFactory", + "semanticTitle": "IDbContextFactory", + "collapsedLabel": "IDbContextFactory AppDbContext>", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 49, + "sourceTargetKind": "call-site", + "outputSummary": "Registers throw-only stub to avoid using DbContext in WASM.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_n_a_55_registers_service_55", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_n_a_55", + "relation": "uses", + "label": "application services via extension", + "semanticLabel": "application services (via extension)", + "semanticTitle": "application services (via extension)", + "collapsedLabel": "application services via extension", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 55, + "sourceTargetKind": "call-site", + "outputSummary": "Calls AddApplication() to register application-layer services.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_wasmepubreader_56_registers_service_56", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_wasmepubreader_56", + "relation": "uses", + "label": "IEpubReader", + "semanticLabel": "IEpubReader", + "semanticTitle": "IEpubReader", + "collapsedLabel": "IEpubReader", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 56, + "sourceTargetKind": "call-site", + "outputSummary": "Registers WASM epub reader implementation.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_run_wasm_host_59_configures_pipeline_59", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_method_nexusreader_web_client_program_cs_run_wasm_host_59", + "relation": "calls", + "label": "unknown", + "semanticLabel": "unknown", + "semanticTitle": "unknown", + "collapsedLabel": "unknown", + "expandedLabel": "configures-pipeline", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 59, + "sourceTargetKind": "call-site", + "outputSummary": "unknown", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_program_top_level_29_invokes_29", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_method_nexusreader_web_program_cs_program_top_level_29", + "relation": "calls", + "label": "Program top-level", + "semanticLabel": "Program (top-level)", + "semanticTitle": "Program (top-level)", + "collapsedLabel": "Program top-level", + "expandedLabel": "handles-route", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 29, + "sourceTargetKind": "call-site", + "outputSummary": "Top-level program: build host, register services and middleware, map routes/endpoints, run the app.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs" + ] + }, + { + "id": "edge_flow_method_nexusreader_web_program_cs_program_top_level_29_flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62_evaluates_condition_62", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "from": "flow_method_nexusreader_web_program_cs_program_top_level_29", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "relation": "calls", + "label": "true / false", + "semanticLabel": "true / false", + "semanticTitle": "true / false", + "collapsedLabel": "true / false", + "expandedLabel": "evaluates-condition", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 62, + "sourceTargetKind": "call-site", + "outputSummary": "if (!string.IsNullOrEmpty(apiBaseUrl))", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs" + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_falls_back_66", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "relation": "calls", + "label": "fallback", + "semanticLabel": "fallback", + "semanticTitle": "fallback", + "collapsedLabel": "fallback", + "expandedLabel": "falls-back", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 66, + "sourceTargetKind": "call-site", + "outputSummary": "else", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs" + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125_invokes_125", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125", + "relation": "calls", + "label": "Reads repository or persistence state", + "semanticLabel": "Reads repository or persistence state", + "semanticTitle": "Reads repository or persistence state", + "collapsedLabel": "Reads repository or persistence state", + "expandedLabel": "invokes", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 125, + "sourceTargetKind": "call-site", + "outputSummary": "var isApiRequest = context.Request.Path.StartsWithSegments(\"/api\") ||", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs" + ] + }, + { + "id": "edge_flow_method_nexusreader_web_client_program_cs_getservice_71_flow_action_nexusreader_web_client_program_cs_getservice_return_71_71_returns_71", + "diagramId": "control_flow_flow_1_nexusreader_web_client_program_cs", + "from": "flow_method_nexusreader_web_client_program_cs_getservice_71", + "to": "flow_action_nexusreader_web_client_program_cs_getservice_return_71_71", + "relation": "returns", + "label": "returns null", + "semanticLabel": "returns null", + "semanticTitle": "returns null", + "collapsedLabel": "returns null", + "expandedLabel": "returns", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 71, + "sourceTargetKind": "return-source", + "outputSummary": "public object? GetService(...) => null", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88_flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88_invokes_88", + "diagramId": "control_flow_flow_1_nexusreader_web_client_program_cs", + "from": "flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88", + "to": "flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88", + "relation": "calls", + "label": "Reads repository or persistence state", + "semanticLabel": "Reads repository or persistence state", + "semanticTitle": "Reads repository or persistence state", + "collapsedLabel": "Reads repository or persistence state", + "expandedLabel": "invokes", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 88, + "sourceTargetKind": "call-site", + "outputSummary": "public Task FindAuthorByNameAsync(string name, CancellationToken cancellationToken = default) => throw new NotSupportedException(ErrorMessage);", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_method_nexusreader_web_program_cs_program_top_level_29_flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62_evaluates_condition_62", + "diagramId": "control_flow_flow_1_nexusreader_web_client_program_cs", + "from": "flow_method_nexusreader_web_program_cs_program_top_level_29", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "relation": "calls", + "label": "true / false", + "semanticLabel": "true / false", + "semanticTitle": "true / false", + "collapsedLabel": "true / false", + "expandedLabel": "evaluates-condition", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 62, + "sourceTargetKind": "call-site", + "outputSummary": "if (!string.IsNullOrEmpty(apiBaseUrl))", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs" + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_falls_back_66", + "diagramId": "control_flow_flow_1_nexusreader_web_client_program_cs", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "relation": "calls", + "label": "fallback", + "semanticLabel": "fallback", + "semanticTitle": "fallback", + "collapsedLabel": "fallback", + "expandedLabel": "falls-back", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 66, + "sourceTargetKind": "call-site", + "outputSummary": "else", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs" + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125_invokes_125", + "diagramId": "control_flow_flow_1_nexusreader_web_client_program_cs", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125", + "relation": "calls", + "label": "Reads repository or persistence state", + "semanticLabel": "Reads repository or persistence state", + "semanticTitle": "Reads repository or persistence state", + "collapsedLabel": "Reads repository or persistence state", + "expandedLabel": "invokes", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 125, + "sourceTargetKind": "call-site", + "outputSummary": "var isApiRequest = context.Request.Path.StartsWithSegments(\"/api\") ||", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs" + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_126_126_invokes_126", + "diagramId": "control_flow_flow_1_nexusreader_web_client_program_cs", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_126_126", + "relation": "calls", + "label": "Reads repository or persistence state", + "semanticLabel": "Reads repository or persistence state", + "semanticTitle": "Reads repository or persistence state", + "collapsedLabel": "Reads repository or persistence state", + "expandedLabel": "invokes", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 126, + "sourceTargetKind": "call-site", + "outputSummary": "context.Request.Path.StartsWithSegments(\"/identity\") ||", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs" + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_flow_method_nexusreader_application_dependencyinjection_cs_addapplication_8_uses_service_78", + "diagramId": "control_flow_flow_1_nexusreader_web_client_program_cs", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "to": "flow_method_nexusreader_application_dependencyinjection_cs_addapplication_8", + "relation": "uses", + "label": "AddApplication", + "semanticLabel": "AddApplication", + "semanticTitle": "AddApplication", + "collapsedLabel": "AddApplication", + "expandedLabel": "uses-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 78, + "sourceTargetKind": "call-site", + "outputSummary": "IServiceCollection", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs" + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_flow_method_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_31_uses_service_79", + "diagramId": "control_flow_flow_1_nexusreader_web_client_program_cs", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "to": "flow_method_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_31", + "relation": "uses", + "label": "AddInfrastructure", + "semanticLabel": "AddInfrastructure", + "semanticTitle": "AddInfrastructure", + "collapsedLabel": "AddInfrastructure", + "expandedLabel": "uses-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 79, + "sourceTargetKind": "call-site", + "outputSummary": "IServiceCollection, IConfiguration", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61_defines_type_61", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61", + "relation": "transforms", + "label": "model ThrowingDbContextFactory", + "semanticLabel": "model ThrowingDbContextFactory", + "semanticTitle": "model ThrowingDbContextFactory", + "collapsedLabel": "model ThrowingDbContextFactory", + "expandedLabel": "defines-type", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 61, + "sourceTargetKind": "call-site", + "outputSummary": "IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66_defines_type_66", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66", + "relation": "transforms", + "label": "model ThrowingEmbeddingGenerator", + "semanticLabel": "model ThrowingEmbeddingGenerator", + "semanticTitle": "model ThrowingEmbeddingGenerator", + "collapsedLabel": "model ThrowingEmbeddingGenerator", + "expandedLabel": "defines-type", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 66, + "sourceTargetKind": "call-site", + "outputSummary": "IEmbeddingGenerator implementation that disables local embedding generation in WASM (throws on GenerateAsync).", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74_defines_type_74", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74", + "relation": "transforms", + "label": "model ThrowingBookStorageService", + "semanticLabel": "model ThrowingBookStorageService", + "semanticTitle": "model ThrowingBookStorageService", + "collapsedLabel": "model ThrowingBookStorageService", + "expandedLabel": "defines-type", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 74, + "sourceTargetKind": "call-site", + "outputSummary": "IBookStorageService implementation that throws for all file storage operations in WASM.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84_defines_type_84", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84", + "relation": "transforms", + "label": "model ThrowingEbookRepository", + "semanticLabel": "model ThrowingEbookRepository", + "semanticTitle": "model ThrowingEbookRepository", + "collapsedLabel": "model ThrowingEbookRepository", + "expandedLabel": "defines-type", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 84, + "sourceTargetKind": "call-site", + "outputSummary": "IEbookRepository implementation that throws for all repository operations in WASM.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94_defines_type_94", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94", + "relation": "transforms", + "label": "model ThrowingSyncBroadcaster", + "semanticLabel": "model ThrowingSyncBroadcaster", + "semanticTitle": "model ThrowingSyncBroadcaster", + "collapsedLabel": "model ThrowingSyncBroadcaster", + "expandedLabel": "defines-type", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 94, + "sourceTargetKind": "call-site", + "outputSummary": "ISyncBroadcaster implementation that throws because real-time broadcasting must run on the server.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_knowledgerequest_566_maps_dto_566", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_type_nexusreader_web_program_cs_knowledgerequest_566", + "relation": "transforms", + "label": "dto KnowledgeRequest", + "semanticLabel": "dto KnowledgeRequest", + "semanticTitle": "dto KnowledgeRequest", + "collapsedLabel": "dto KnowledgeRequest", + "expandedLabel": "maps-dto", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 566, + "sourceTargetKind": "call-site", + "outputSummary": "Request DTO carrying free-text input and optional ebook context for knowledge APIs.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_groundednessrequest_567_maps_dto_567", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_type_nexusreader_web_program_cs_groundednessrequest_567", + "relation": "transforms", + "label": "dto GroundednessRequest", + "semanticLabel": "dto GroundednessRequest", + "semanticTitle": "dto GroundednessRequest", + "collapsedLabel": "dto GroundednessRequest", + "expandedLabel": "maps-dto", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 567, + "sourceTargetKind": "call-site", + "outputSummary": "Request DTO for verifying answer groundedness in a context.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_semanticsearchrequest_568_maps_dto_568", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_type_nexusreader_web_program_cs_semanticsearchrequest_568", + "relation": "transforms", + "label": "dto SemanticSearchRequest", + "semanticLabel": "dto SemanticSearchRequest", + "semanticTitle": "dto SemanticSearchRequest", + "collapsedLabel": "dto SemanticSearchRequest", + "expandedLabel": "maps-dto", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 568, + "sourceTargetKind": "call-site", + "outputSummary": "DTO for semantic search requests with a limit.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_askquestionrequest_569_maps_dto_569", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_type_nexusreader_web_program_cs_askquestionrequest_569", + "relation": "transforms", + "label": "dto AskQuestionRequest", + "semanticLabel": "dto AskQuestionRequest", + "semanticTitle": "dto AskQuestionRequest", + "collapsedLabel": "dto AskQuestionRequest", + "expandedLabel": "maps-dto", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 569, + "sourceTargetKind": "call-site", + "outputSummary": "DTO for question-asking APIs including optional ebook context and limit.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61_defines_type_61", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61", + "relation": "transforms", + "label": "model ThrowingDbContextFactory", + "semanticLabel": "model ThrowingDbContextFactory", + "semanticTitle": "model ThrowingDbContextFactory", + "collapsedLabel": "model ThrowingDbContextFactory", + "expandedLabel": "defines-type", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 61, + "sourceTargetKind": "call-site", + "outputSummary": "IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66_defines_type_66", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66", + "relation": "transforms", + "label": "model ThrowingEmbeddingGenerator", + "semanticLabel": "model ThrowingEmbeddingGenerator", + "semanticTitle": "model ThrowingEmbeddingGenerator", + "collapsedLabel": "model ThrowingEmbeddingGenerator", + "expandedLabel": "defines-type", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 66, + "sourceTargetKind": "call-site", + "outputSummary": "IEmbeddingGenerator implementation that disables local embedding generation in WASM (throws on GenerateAsync).", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74_defines_type_74", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74", + "relation": "transforms", + "label": "model ThrowingBookStorageService", + "semanticLabel": "model ThrowingBookStorageService", + "semanticTitle": "model ThrowingBookStorageService", + "collapsedLabel": "model ThrowingBookStorageService", + "expandedLabel": "defines-type", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 74, + "sourceTargetKind": "call-site", + "outputSummary": "IBookStorageService implementation that throws for all file storage operations in WASM.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84_defines_type_84", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84", + "relation": "transforms", + "label": "model ThrowingEbookRepository", + "semanticLabel": "model ThrowingEbookRepository", + "semanticTitle": "model ThrowingEbookRepository", + "collapsedLabel": "model ThrowingEbookRepository", + "expandedLabel": "defines-type", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 84, + "sourceTargetKind": "call-site", + "outputSummary": "IEbookRepository implementation that throws for all repository operations in WASM.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94_defines_type_94", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94", + "relation": "transforms", + "label": "model ThrowingSyncBroadcaster", + "semanticLabel": "model ThrowingSyncBroadcaster", + "semanticTitle": "model ThrowingSyncBroadcaster", + "collapsedLabel": "model ThrowingSyncBroadcaster", + "expandedLabel": "defines-type", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 94, + "sourceTargetKind": "call-site", + "outputSummary": "ISyncBroadcaster implementation that throws because real-time broadcasting must run on the server.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_webplatformservice_18_registers_service_18", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_webplatformservice_18", + "relation": "uses", + "label": "IPlatformService", + "semanticLabel": "IPlatformService", + "semanticTitle": "IPlatformService", + "collapsedLabel": "IPlatformService", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 18, + "sourceTargetKind": "call-site", + "outputSummary": "Registers platform abstraction for browser.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33_registers_service_33", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33", + "relation": "uses", + "label": "NexusAuthenticationStateProvider", + "semanticLabel": "NexusAuthenticationStateProvider", + "semanticTitle": "NexusAuthenticationStateProvider", + "collapsedLabel": "NexusAuthenticationStateProvider", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 33, + "sourceTargetKind": "call-site", + "outputSummary": "Authentication state provider and wiring to AuthenticationStateProvider.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38_registers_service_38", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38", + "relation": "uses", + "label": "IKnowledgeService", + "semanticLabel": "IKnowledgeService", + "semanticTitle": "IKnowledgeService", + "collapsedLabel": "IKnowledgeService", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 38, + "sourceTargetKind": "call-site", + "outputSummary": "Registers a WASM-specific knowledge service implementation.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_configured_httpclient_40_registers_service_40", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_configured_httpclient_40", + "relation": "uses", + "label": "uses", + "semanticLabel": "HttpClient (named 'NexusAPI')", + "semanticTitle": "HttpClient (named 'NexusAPI')", + "collapsedLabel": "uses", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 40, + "sourceTargetKind": "call-site", + "outputSummary": "Adds named HTTP client with base address and authentication header handler.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49_registers_service_49", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49", + "relation": "uses", + "label": "IDbContextFactory AppDbContext>", + "semanticLabel": "IDbContextFactory", + "semanticTitle": "IDbContextFactory", + "collapsedLabel": "IDbContextFactory AppDbContext>", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 49, + "sourceTargetKind": "call-site", + "outputSummary": "Registers throw-only stub to avoid using DbContext in WASM.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_n_a_55_registers_service_55", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_n_a_55", + "relation": "uses", + "label": "application services via extension", + "semanticLabel": "application services (via extension)", + "semanticTitle": "application services (via extension)", + "collapsedLabel": "application services via extension", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 55, + "sourceTargetKind": "call-site", + "outputSummary": "Calls AddApplication() to register application-layer services.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_wasmepubreader_56_registers_service_56", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_wasmepubreader_56", + "relation": "uses", + "label": "IEpubReader", + "semanticLabel": "IEpubReader", + "semanticTitle": "IEpubReader", + "collapsedLabel": "IEpubReader", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 56, + "sourceTargetKind": "call-site", + "outputSummary": "Registers WASM epub reader implementation.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_falls_back_66", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "relation": "calls", + "label": "fallback", + "semanticLabel": "fallback", + "semanticTitle": "fallback", + "collapsedLabel": "fallback", + "expandedLabel": "falls-back", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 66, + "sourceTargetKind": "call-site", + "outputSummary": "else", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs" + ] + }, + { + "id": "edge_flow_method_nexusreader_web_client_program_cs_getservice_71_flow_action_nexusreader_web_client_program_cs_getservice_return_71_71_returns_71", + "diagramId": "failure_flow_1_nexusreader_web_client_program_cs", + "from": "flow_method_nexusreader_web_client_program_cs_getservice_71", + "to": "flow_action_nexusreader_web_client_program_cs_getservice_return_71_71", + "relation": "returns", + "label": "returns null", + "semanticLabel": "returns null", + "semanticTitle": "returns null", + "collapsedLabel": "returns null", + "expandedLabel": "returns", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 71, + "sourceTargetKind": "return-source", + "outputSummary": "public object? GetService(...) => null", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_method_nexusreader_web_program_cs_program_top_level_29_flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62_evaluates_condition_62", + "diagramId": "failure_flow_1_nexusreader_web_client_program_cs", + "from": "flow_method_nexusreader_web_program_cs_program_top_level_29", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "relation": "calls", + "label": "true / false", + "semanticLabel": "true / false", + "semanticTitle": "true / false", + "collapsedLabel": "true / false", + "expandedLabel": "evaluates-condition", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 62, + "sourceTargetKind": "call-site", + "outputSummary": "if (!string.IsNullOrEmpty(apiBaseUrl))", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs" + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_falls_back_66", + "diagramId": "failure_flow_1_nexusreader_web_client_program_cs", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "relation": "calls", + "label": "fallback", + "semanticLabel": "fallback", + "semanticTitle": "fallback", + "collapsedLabel": "fallback", + "expandedLabel": "falls-back", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 66, + "sourceTargetKind": "call-site", + "outputSummary": "else", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs" + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_237_237_flow_method_nexusreader_infrastructure_realtime_synchub_cs_synchub_14_uses_service_247", + "diagramId": "method_flows_graph", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_237_237", + "to": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_synchub_14", + "relation": "uses", + "label": "SyncHub", + "semanticLabel": "SyncHub", + "semanticTitle": "SyncHub", + "collapsedLabel": "SyncHub", + "expandedLabel": "uses-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 247, + "sourceTargetKind": "call-site", + "outputSummary": "Hub mapping for realtime sync", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_handlers_authenticationheaderhandler_cs_file_1_flow_method_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_112_invokes_112", + "diagramId": "method_flows_graph", + "from": "flow_file_nexusreader_web_client_handlers_authenticationheaderhandler_cs_file_1", + "to": "flow_method_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_112", + "relation": "calls", + "label": "CloneHttpRequestMessageAsync", + "semanticLabel": "CloneHttpRequestMessageAsync", + "semanticTitle": "CloneHttpRequestMessageAsync", + "collapsedLabel": "CloneHttpRequestMessageAsync", + "expandedLabel": "invokes", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 112, + "sourceTargetKind": "call-site", + "outputSummary": "Creates a deep-ish clone of an HttpRequestMessage including method, URI, version, headers and buffered content to allow safe retry.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ] + }, + { + "id": "edge_flow_method_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_112_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_branch_119_119_evaluates_condition_119", + "diagramId": "method_flows_graph", + "from": "flow_method_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_112", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_branch_119_119", + "relation": "calls", + "label": "true / false", + "semanticLabel": "true / false", + "semanticTitle": "true / false", + "collapsedLabel": "true / false", + "expandedLabel": "evaluates-condition", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 119, + "sourceTargetKind": "call-site", + "outputSummary": "if (req.Content != null)", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1_flow_method_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_19_invokes_19", + "diagramId": "method_flows_graph", + "from": "flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_19", + "relation": "calls", + "label": "UpdateProgress", + "semanticLabel": "UpdateProgress", + "semanticTitle": "UpdateProgress", + "collapsedLabel": "UpdateProgress", + "expandedLabel": "handles-route", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 19, + "sourceTargetKind": "call-site", + "outputSummary": "Receives client progress updates, obtains the calling user id and forwards an UpdateReadingProgressCommand via MediatR when user is present.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs" + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_19_flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_repository_read_21_21_invokes_21", + "diagramId": "method_flows_graph", + "from": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_19", + "to": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_repository_read_21_21", + "relation": "calls", + "label": "Reads repository or persistence state", + "semanticLabel": "Reads repository or persistence state", + "semanticTitle": "Reads repository or persistence state", + "collapsedLabel": "Reads repository or persistence state", + "expandedLabel": "invokes", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 21, + "sourceTargetKind": "call-site", + "outputSummary": "var userId = Context.User?.FindFirst(ClaimTypes.NameIdentifier)?.Value;", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1_flow_method_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_28_invokes_28", + "diagramId": "method_flows_graph", + "from": "flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_28", + "relation": "calls", + "label": "OnConnectedAsync", + "semanticLabel": "OnConnectedAsync", + "semanticTitle": "OnConnectedAsync", + "collapsedLabel": "OnConnectedAsync", + "expandedLabel": "handles-route", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 28, + "sourceTargetKind": "call-site", + "outputSummary": "When a client connects, adds their connection to a per-user SignalR group (User_{userId}) and calls base connection logic.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs" + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_28_flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_repository_read_30_30_invokes_30", + "diagramId": "method_flows_graph", + "from": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_28", + "to": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_repository_read_30_30", + "relation": "calls", + "label": "Reads repository or persistence state", + "semanticLabel": "Reads repository or persistence state", + "semanticTitle": "Reads repository or persistence state", + "collapsedLabel": "Reads repository or persistence state", + "expandedLabel": "invokes", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 30, + "sourceTargetKind": "call-site", + "outputSummary": "var userId = Context.UserIdentifier;", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1_flow_method_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_38_invokes_38", + "diagramId": "method_flows_graph", + "from": "flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_38", + "relation": "calls", + "label": "OnDisconnectedAsync", + "semanticLabel": "OnDisconnectedAsync", + "semanticTitle": "OnDisconnectedAsync", + "collapsedLabel": "OnDisconnectedAsync", + "expandedLabel": "handles-route", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 38, + "sourceTargetKind": "call-site", + "outputSummary": "When a client disconnects, removes their connection from the per-user SignalR group and invokes base disconnect logic.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs" + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_38_flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_repository_read_40_40_invokes_40", + "diagramId": "method_flows_graph", + "from": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_38", + "to": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_repository_read_40_40", + "relation": "calls", + "label": "Reads repository or persistence state", + "semanticLabel": "Reads repository or persistence state", + "semanticTitle": "Reads repository or persistence state", + "collapsedLabel": "Reads repository or persistence state", + "expandedLabel": "invokes", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 40, + "sourceTargetKind": "call-site", + "outputSummary": "var userId = Context.UserIdentifier;", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1_flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_175_invokes_175", + "diagramId": "method_flows_graph", + "from": "flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_175", + "relation": "calls", + "label": "CountWords", + "semanticLabel": "CountWords", + "semanticTitle": "CountWords", + "collapsedLabel": "CountWords", + "expandedLabel": "invokes", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 175, + "sourceTargetKind": "call-site", + "outputSummary": "Count words in a string using whitespace separators; returns 0 for null/whitespace.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs" + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_175_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_guard_clause_177_177_evaluates_condition_177", + "diagramId": "method_flows_graph", + "from": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_175", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_guard_clause_177_177", + "relation": "calls", + "label": "return 0 / continue", + "semanticLabel": "return 0 / continue", + "semanticTitle": "return 0 / continue", + "collapsedLabel": "return 0 / continue", + "expandedLabel": "evaluates-condition", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 177, + "sourceTargetKind": "call-site", + "outputSummary": "Empty text check", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs" + ] + } + ], + "contextBagDebug": { + "id": "business_overview_md", + "bagType": "module", + "title": "Business Overview context bag", + "anchorFiles": [ + "NexusReader.Web.Client/Program.cs", + "NexusReader.Maui/MauiProgram.cs", + "NexusReader.Web/Program.cs" + ], + "includedFiles": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "reason": "Selected as an entrypoint anchor for this flow scope", + "source": "entrypoint" + }, + { + "path": "NexusReader.Web.Client/Program.cs", + "reason": "Selected as an entrypoint anchor for this flow scope", + "source": "entrypoint" + }, + { + "path": "NexusReader.Web/Program.cs", + "reason": "Selected as an entrypoint anchor for this flow scope", + "source": "entrypoint" + }, + { + "path": "NexusReader.Application/DTOs/User/AuthorDto.cs", + "reason": "Included because it likely stabilizes the contracts or business data in this scope", + "source": "type-reference" + }, + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "reason": "Included because it likely participates in the core orchestration path", + "source": "scope" + }, + { + "path": "NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "reason": "Included because it belongs to the resolved document scope", + "source": "scope" + }, + { + "path": "NexusReader.Domain/Entities/Author.cs", + "reason": "Included because it belongs to the resolved document scope", + "source": "scope" + }, + { + "path": "NexusReader.UI.Shared/Layout/AuthLayout.razor", + "reason": "Included because it belongs to the resolved document scope", + "source": "scope" + }, + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "reason": "Included because it likely participates in the core orchestration path", + "source": "scope" + }, + { + "path": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "reason": "Included because it belongs to the resolved document scope", + "source": "scope" + }, + { + "path": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "reason": "Included because it belongs to the resolved document scope", + "source": "scope" + }, + { + "path": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "reason": "Included because it belongs to the resolved document scope", + "source": "scope" + }, + { + "path": "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "reason": "Included because it likely stabilizes the contracts or business data in this scope", + "source": "type-reference" + }, + { + "path": "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "reason": "Included because it likely stabilizes the contracts or business data in this scope", + "source": "type-reference" + }, + { + "path": "NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "reason": "Included because it likely stabilizes the contracts or business data in this scope", + "source": "type-reference" + }, + { + "path": "NexusReader.Application/DependencyInjection.cs", + "reason": "Included because it is called by an anchor method (call-chain widening)", + "source": "call-chain" + }, + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "reason": "Included because it is called by an anchor method (call-chain widening)", + "source": "call-chain" + }, + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "reason": "Included because it is called by an anchor method (call-chain widening)", + "source": "call-chain" + }, + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "reason": "Included because it is called by an anchor method (call-chain widening)", + "source": "call-chain" + }, + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "reason": "Included because it is called by an anchor method (call-chain widening)", + "source": "call-chain" + }, + { + "path": "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "reason": "Included because it is called by an anchor method (call-chain widening)", + "source": "call-chain" + }, + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "reason": "Included because it is called by an anchor method (call-chain widening)", + "source": "call-chain" + }, + { + "path": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "reason": "Included because it is called by an anchor method (call-chain widening)", + "source": "call-chain" + }, + { + "path": "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs", + "reason": "Included because it is called by an anchor method (call-chain widening)", + "source": "call-chain" + } + ], + "relatedDomains": [ + "auth", + "account" + ], + "relatedEntrypoints": [ + "NexusReader.Web.Client/Program.cs", + "NexusReader.Maui/MauiProgram.cs", + "NexusReader.Web/Program.cs" + ], + "confidence": 0.75 + }, + "flowGraph": { + "contextBagId": "business_overview_md", + "nodes": [ + { + "id": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "label": "MauiProgram", + "role": "startup", + "layer": "frontend", + "kind": "entrypoint", + "filePath": "NexusReader.Maui/MauiProgram.cs", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 1 + } + ] + }, + { + "id": "flow_method_nexusreader_maui_mauiprogram_cs_createmauiapp_12", + "label": "CreateMauiApp", + "role": "startup", + "layer": "frontend", + "kind": "method", + "filePath": "NexusReader.Maui/MauiProgram.cs", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 12, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 12 + } + ] + }, + { + "id": "flow_action_nexusreader_maui_mauiprogram_cs_createmauiapp_return_57_57", + "label": "Returns result", + "role": "startup", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Maui/MauiProgram.cs", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 57, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 57 + } + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_mauiprogram_10", + "label": "MauiProgram", + "role": "unknown", + "layer": "frontend", + "kind": "type", + "filePath": "NexusReader.Maui/MauiProgram.cs", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 10, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 10 + } + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28", + "label": "MauiPlatformService", + "role": "service", + "layer": "frontend", + "kind": "type", + "filePath": "NexusReader.Maui/MauiProgram.cs", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 28, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 28 + } + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29", + "label": "MauiStorageService", + "role": "service", + "layer": "frontend", + "kind": "type", + "filePath": "NexusReader.Maui/MauiProgram.cs", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 29, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 29 + } + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32", + "label": "NexusAuthenticationStateProvider", + "role": "service", + "layer": "frontend", + "kind": "type", + "filePath": "NexusReader.Maui/MauiProgram.cs", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 32, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 32 + } + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33", + "label": "NexusAuthenticationStateProvider (via factory)", + "role": "service", + "layer": "frontend", + "kind": "type", + "filePath": "NexusReader.Maui/MauiProgram.cs", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 33, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 33 + } + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38", + "label": "HttpClient (configured)", + "role": "service", + "layer": "frontend", + "kind": "type", + "filePath": "NexusReader.Maui/MauiProgram.cs", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 38, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 38 + } + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1", + "label": "ThemeService, FocusModeService, QuizStateService, ReaderNavigationService, KnowledgeGraphService, ReaderInteractionService, KnowledgeCoordinator, SyncService, IdentityService", + "role": "service", + "layer": "frontend", + "kind": "type", + "filePath": "NexusReader.Maui/MauiProgram.cs", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 1 + } + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51", + "label": "NexusReader.Application registrations", + "role": "service", + "layer": "frontend", + "kind": "type", + "filePath": "NexusReader.Maui/MauiProgram.cs", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 51, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 51 + } + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53", + "label": "Handlers from NexusReader.Application assembly", + "role": "service", + "layer": "frontend", + "kind": "type", + "filePath": "NexusReader.Maui/MauiProgram.cs", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 53, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 53 + } + ] + }, + { + "id": "flow_method_nexusreader_maui_mauiprogram_cs_create_and_build_mauiapp_16", + "label": "Create and build MauiApp", + "role": "startup", + "layer": "frontend", + "kind": "method", + "filePath": "NexusReader.Maui/MauiProgram.cs", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 16, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 16 + } + ] + }, + { + "id": "flow_file_nexusreader_web_client_program_cs_file_1", + "label": "Program.cs", + "role": "startup", + "layer": "frontend", + "kind": "entrypoint", + "filePath": "NexusReader.Web.Client/Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 1 + } + ] + }, + { + "id": "flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15", + "label": "Program (top-level startup)", + "role": "startup", + "layer": "frontend", + "kind": "method", + "filePath": "NexusReader.Web.Client/Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 15, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 15 + } + ] + }, + { + "id": "flow_method_nexusreader_web_client_program_cs_getservice_71", + "label": "GetService", + "role": "startup", + "layer": "frontend", + "kind": "method", + "filePath": "NexusReader.Web.Client/Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 71, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 71 + } + ] + }, + { + "id": "flow_action_nexusreader_web_client_program_cs_getservice_return_71_71", + "label": "returns null", + "role": "startup", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Web.Client/Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 71, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 71 + } + ] + }, + { + "id": "flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88", + "label": "FindAuthorByNameAsync", + "role": "startup", + "layer": "frontend", + "kind": "method", + "filePath": "NexusReader.Web.Client/Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 88, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 88 + } + ] + }, + { + "id": "flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Web.Client/Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 88, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 88 + } + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61", + "label": "ThrowingDbContextFactory", + "role": "unknown", + "layer": "frontend", + "kind": "type", + "filePath": "NexusReader.Web.Client/Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 61, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 61 + } + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66", + "label": "ThrowingEmbeddingGenerator", + "role": "unknown", + "layer": "frontend", + "kind": "type", + "filePath": "NexusReader.Web.Client/Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 66, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 66 + } + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74", + "label": "ThrowingBookStorageService", + "role": "unknown", + "layer": "frontend", + "kind": "type", + "filePath": "NexusReader.Web.Client/Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 74, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 74 + } + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84", + "label": "ThrowingEbookRepository", + "role": "unknown", + "layer": "frontend", + "kind": "type", + "filePath": "NexusReader.Web.Client/Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 84, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 84 + } + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94", + "label": "ThrowingSyncBroadcaster", + "role": "unknown", + "layer": "frontend", + "kind": "type", + "filePath": "NexusReader.Web.Client/Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 94, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 94 + } + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_webplatformservice_18", + "label": "WebPlatformService", + "role": "service", + "layer": "frontend", + "kind": "type", + "filePath": "NexusReader.Web.Client/Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 18, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 18 + } + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33", + "label": "NexusAuthenticationStateProvider", + "role": "service", + "layer": "frontend", + "kind": "type", + "filePath": "NexusReader.Web.Client/Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 33, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 33 + } + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38", + "label": "WasmKnowledgeService", + "role": "service", + "layer": "frontend", + "kind": "type", + "filePath": "NexusReader.Web.Client/Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 38, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 38 + } + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_configured_httpclient_40", + "label": "configured HttpClient", + "role": "service", + "layer": "frontend", + "kind": "type", + "filePath": "NexusReader.Web.Client/Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 40, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 40 + } + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49", + "label": "ThrowingDbContextFactory", + "role": "service", + "layer": "frontend", + "kind": "type", + "filePath": "NexusReader.Web.Client/Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 49, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 49 + } + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_n_a_55", + "label": "N/A", + "role": "service", + "layer": "frontend", + "kind": "type", + "filePath": "NexusReader.Web.Client/Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 55, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 55 + } + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_wasmepubreader_56", + "label": "WasmEpubReader", + "role": "service", + "layer": "frontend", + "kind": "type", + "filePath": "NexusReader.Web.Client/Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 56, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 56 + } + ] + }, + { + "id": "flow_method_nexusreader_web_client_program_cs_run_wasm_host_59", + "label": "Run WASM Host", + "role": "startup", + "layer": "frontend", + "kind": "method", + "filePath": "NexusReader.Web.Client/Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 59, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 59 + } + ] + }, + { + "id": "flow_file_nexusreader_web_program_cs_file_1", + "label": "Program.cs", + "role": "startup", + "layer": "application", + "kind": "entrypoint", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 1 + } + ] + }, + { + "id": "flow_method_nexusreader_web_program_cs_program_top_level_29", + "label": "Program (top-level)", + "role": "startup", + "layer": "application", + "kind": "method", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 29, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 29 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "label": "Evaluates branch condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 62, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 62 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "label": "Falls back to alternate path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 66, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 66 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 125, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 125 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_126_126", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 126, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 126 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_127_127", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 127, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 127 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_129_129", + "label": "Evaluates branch condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 129, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 129 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_131_131", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 131, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 131 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_133_133", + "label": "Falls back to alternate path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 133, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 133 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_135_135", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 135, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 135 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_137_137", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 137, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 137 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_169_169", + "label": "Evaluates branch condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 169, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 169 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_validation_171_171", + "label": "Validates input or state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 171, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 171 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_loop_186_186", + "label": "Repeats work over a collection or condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 186, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 186 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_190_190", + "label": "Evaluates branch condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 190, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 190 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_198_198", + "label": "Evaluates branch condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 198, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 198 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_206_206", + "label": "Evaluates branch condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 206, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 206 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_log_206_206", + "label": "Logs runtime state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 206, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 206 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_log_208_208", + "label": "Logs runtime state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 208, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 208 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_216_216", + "label": "Evaluates branch condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 216, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 216 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_log_216_216", + "label": "Logs runtime state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 216, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 216 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_log_218_218", + "label": "Logs runtime state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 218, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 218 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_226_226", + "label": "Evaluates branch condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 226, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 226 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_230_230", + "label": "Falls back to alternate path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 230, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 230 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_237_237", + "label": "Evaluates branch condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 237, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 237 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_252_252", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 252, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 252 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_255_255", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 255, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 255 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_258_258", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 258, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 258 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_267_267", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 267, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 267 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_269_269", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 269, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 269 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_270_270", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 270, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 270 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_275_275", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 275, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 275 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_277_277", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 277, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 277 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_278_278", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 278, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 278 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_283_283", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 283, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 283 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_285_285", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 285, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 285 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_286_286", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 286, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 286 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_291_291", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 291, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 291 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_293_293", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 293, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 293 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_294_294", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 294, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 294 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_299_299", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 299, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 299 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_301_301", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 301, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 301 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_302_302", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 302, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 302 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_307_307", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 307, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 307 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_309_309", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 309, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 309 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_310_310", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 310, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 310 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_315_315", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 315, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 315 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_317_317", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 317, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 317 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_318_318", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 318, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 318 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_324_324", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 324, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 324 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_327_327", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 327, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 327 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_332_332", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 332, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 332 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_333_333", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 333, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 333 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_350_350", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 350, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 350 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_352_352", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 352, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 352 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_352_352", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 352, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 352 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_357_357", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 357, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 357 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_358_358", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 358, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 358 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_361_361", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 361, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 361 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_364_364", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 364, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 364 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_374_374", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 374, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 374 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_381_381", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 381, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 381 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_switch_385_385", + "label": "Branches across multiple outcomes", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 385, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 385 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_402_402", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 402, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 402 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_406_406", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 406, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 406 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_416_416", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 416, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 416 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_418_418", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 418, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 418 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_419_419", + "label": "Evaluates branch condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 419, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 419 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_424_424", + "label": "Evaluates branch condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 424, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 424 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_439_439", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 439, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 439 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_441_441", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 441, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 441 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_442_442", + "label": "Evaluates branch condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 442, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 442 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_444_444", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 444, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 444 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_460_460", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 460, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 460 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_470_470", + "label": "Evaluates branch condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 470, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 470 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_log_472_472", + "label": "Logs runtime state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 472, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 472 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_473_473", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 473, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 473 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_477_477", + "label": "Evaluates branch condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 477, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 477 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_479_479", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 479, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 479 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_480_480", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 480, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 480 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_483_483", + "label": "Evaluates branch condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 483, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 483 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_log_485_485", + "label": "Logs runtime state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 485, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 485 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_485_485", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 485, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 485 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_486_486", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 486, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 486 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_490_490", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 490, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 490 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_491_491", + "label": "Evaluates branch condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 491, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 491 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_496_496", + "label": "Evaluates branch condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 496, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 496 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_501_501", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 501, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 501 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_loop_505_505", + "label": "Repeats work over a collection or condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 505, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 505 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_log_507_507", + "label": "Logs runtime state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 507, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 507 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_510_510", + "label": "Evaluates branch condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 510, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 510 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_512_512", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 512, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 512 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_log_516_516", + "label": "Logs runtime state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 516, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 516 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_517_517", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 517, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 517 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_529_529", + "label": "Evaluates branch condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 529, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 529 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_532_532", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 532, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 532 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_536_536", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 536, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 536 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_545_545", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 545, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 545 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_550_550", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 550, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 550 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_551_551", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 551, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 551 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_554_554", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 554, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 554 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_554_554", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 554, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 554 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_556_556", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 556, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 556 + } + ] + }, + { + "id": "flow_file_nexusreader_application_dependencyinjection_cs_file_1", + "label": "DependencyInjection", + "role": "service-registration", + "layer": "application", + "kind": "file", + "filePath": "NexusReader.Application/DependencyInjection.cs", + "sourcePath": "NexusReader.Application/DependencyInjection.cs", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.Application/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/DependencyInjection.cs", + "line": 1 + } + ] + }, + { + "id": "flow_method_nexusreader_application_dependencyinjection_cs_addapplication_8", + "label": "AddApplication", + "role": "service-registration", + "layer": "application", + "kind": "method", + "filePath": "NexusReader.Application/DependencyInjection.cs", + "sourcePath": "NexusReader.Application/DependencyInjection.cs", + "sourceLine": 8, + "evidencePaths": [ + "NexusReader.Application/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/DependencyInjection.cs", + "line": 8 + } + ] + }, + { + "id": "flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1", + "label": "DependencyInjection", + "role": "service-registration", + "layer": "infrastructure", + "kind": "file", + "filePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourcePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 1 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_31", + "label": "AddInfrastructure", + "role": "service-registration", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourcePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 31, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 31 + } + ] + }, + { + "id": "flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1", + "label": "SyncHub", + "role": "endpoint", + "layer": "infrastructure", + "kind": "file", + "filePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 1 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_synchub_14", + "label": "SyncHub", + "role": "endpoint", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 14, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 14 + } + ] + }, + { + "id": "flow_method_nexusreader_web_program_cs_startupvalidation_scope_check_165", + "label": "StartupValidation (scope check)", + "role": "startup", + "layer": "application", + "kind": "method", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 165, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 165 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_startupvalidation_scope_check_branch_169_169", + "label": "Evaluates branch condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 169, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 169 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_startupvalidation_scope_check_guard_clause_169_169", + "label": "Fail if infrastructure missing", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 169, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 169 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_startupvalidation_scope_check_validation_171_171", + "label": "Validates input or state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 171, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 171 + } + ] + }, + { + "id": "flow_method_nexusreader_web_program_cs_ensuredatabaseinitialized_175", + "label": "EnsureDatabaseInitialized", + "role": "startup", + "layer": "application", + "kind": "method", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 175, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 175 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_loop_186_186", + "label": "Repeats work over a collection or condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 186, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 186 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_branch_190_190", + "label": "Evaluates branch condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 190, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 190 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_branch_198_198", + "label": "Evaluates branch condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 198, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 198 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_branch_206_206", + "label": "Evaluates branch condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 206, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 206 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_log_206_206", + "label": "Logs runtime state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 206, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 206 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_log_208_208", + "label": "Logs runtime state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 208, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 208 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_branch_216_216", + "label": "Evaluates branch condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 216, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 216 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_log_216_216", + "label": "Logs runtime state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 216, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 216 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_log_218_218", + "label": "Logs runtime state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 218, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 218 + } + ] + }, + { + "id": "flow_method_nexusreader_web_program_cs_get_api_epub_ebookid_index_249", + "label": "GET /api/epub/{ebookId}/{index}", + "role": "startup", + "layer": "application", + "kind": "method", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 249, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 249 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_get_api_epub_ebookid_index_guard_clause_252_252", + "label": "Extracts userId from ClaimsPrincipal", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 252, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 252 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_get_api_epub_ebookid_index_repository_read_252_252", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 252, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 252 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_get_api_epub_ebookid_index_guard_clause_255_255", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 255, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 255 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_get_api_epub_ebookid_index_branch_255_255", + "label": "Return Ok on success, BadRequest on failure", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 255, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 255 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_get_api_epub_ebookid_index_return_258_258", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 258, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 258 + } + ] + }, + { + "id": "flow_method_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_265", + "label": "KnowledgeApi POST /api/knowledge/ (GetKnowledge)", + "role": "startup", + "layer": "application", + "kind": "method", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 265, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 265 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_repository_read_267_267", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 267, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 267 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_guard_clause_267_267", + "label": "Resolve tenantId from claims with default", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 267, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 267 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_guard_clause_269_269", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 269, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 269 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_branch_269_269", + "label": "Return Ok or BadRequest based on result.IsSuccess", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 269, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 269 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_return_270_270", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 270, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 270 + } + ] + }, + { + "id": "flow_method_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_273", + "label": "KnowledgeApi POST /graph (GetGraphDataAsync)", + "role": "startup", + "layer": "application", + "kind": "method", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 273, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 273 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_repository_read_275_275", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 275, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 275 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_guard_clause_277_277", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 277, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 277 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_branch_277_277", + "label": "Return Ok or BadRequest based on result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 277, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 277 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_return_278_278", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 278, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 278 + } + ] + }, + { + "id": "flow_method_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_281", + "label": "KnowledgeApi POST /summary (GetSummaryAndQuizAsync)", + "role": "startup", + "layer": "application", + "kind": "method", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 281, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 281 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_repository_read_283_283", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 283, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 283 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_guard_clause_285_285", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 285, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 285 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_branch_285_285", + "label": "Return Ok or BadRequest based on result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 285, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 285 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_return_286_286", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 286, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 286 + } + ] + }, + { + "id": "flow_method_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_289", + "label": "KnowledgeApi POST /map (GetKnowledgeMapAsync)", + "role": "startup", + "layer": "application", + "kind": "method", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 289, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 289 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_repository_read_291_291", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 291, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 291 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_guard_clause_293_293", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 293, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 293 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_branch_293_293", + "label": "Return Ok or BadRequest based on result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 293, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 293 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_return_294_294", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 294, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 294 + } + ] + }, + { + "id": "flow_method_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_297", + "label": "KnowledgeApi POST /verify-groundedness", + "role": "startup", + "layer": "application", + "kind": "method", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 297, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 297 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_repository_read_299_299", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 299, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 299 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_guard_clause_301_301", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 301, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 301 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_branch_301_301", + "label": "Return Ok or BadRequest based on verification result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 301, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 301 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_return_302_302", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 302, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 302 + } + ] + }, + { + "id": "flow_method_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_305", + "label": "KnowledgeApi POST /search (SearchLibrarySemanticallyAsync)", + "role": "startup", + "layer": "application", + "kind": "method", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 305, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 305 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_repository_read_307_307", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 307, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 307 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_guard_clause_309_309", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 309, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 309 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_branch_309_309", + "label": "Return Ok or BadRequest based on result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 309, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 309 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_return_310_310", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 310, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 310 + } + ] + }, + { + "id": "flow_method_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_313", + "label": "KnowledgeApi POST /ask (AskQuestionAsync)", + "role": "startup", + "layer": "application", + "kind": "method", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 313, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 313 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_repository_read_315_315", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 315, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 315 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_guard_clause_317_317", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 317, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 317 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_branch_317_317", + "label": "Return Ok or BadRequest based on result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 317, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 317 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_return_318_318", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 318, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 318 + } + ] + }, + { + "id": "flow_method_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_321", + "label": "KnowledgeApi DELETE /api/knowledge/ (ClearCacheAsync)", + "role": "startup", + "layer": "application", + "kind": "method", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 321, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 321 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_branch_323_323", + "label": "Return Ok on success; BadRequest with message on failure", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 323, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 323 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_guard_clause_324_324", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 324, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 324 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_return_327_327", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 327, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 327 + } + ] + }, + { + "id": "flow_type_nexusreader_web_program_cs_knowledgerequest_566", + "label": "KnowledgeRequest", + "role": "dto", + "layer": "application", + "kind": "type", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 566, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 566 + } + ] + }, + { + "id": "flow_type_nexusreader_web_program_cs_groundednessrequest_567", + "label": "GroundednessRequest", + "role": "dto", + "layer": "application", + "kind": "type", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 567, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 567 + } + ] + }, + { + "id": "flow_type_nexusreader_web_program_cs_semanticsearchrequest_568", + "label": "SemanticSearchRequest", + "role": "dto", + "layer": "application", + "kind": "type", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 568, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 568 + } + ] + }, + { + "id": "flow_type_nexusreader_web_program_cs_askquestionrequest_569", + "label": "AskQuestionRequest", + "role": "dto", + "layer": "application", + "kind": "type", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 569, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 569 + } + ] + }, + { + "id": "flow_type_nexusreader_web_program_cs_webplatformservice_47", + "label": "WebPlatformService", + "role": "service", + "layer": "application", + "kind": "type", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 47, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 47 + } + ] + }, + { + "id": "flow_type_nexusreader_web_program_cs_knowledgecoordinator_55", + "label": "KnowledgeCoordinator", + "role": "service", + "layer": "application", + "kind": "type", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 55, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 55 + } + ] + }, + { + "id": "flow_type_nexusreader_web_program_cs_httpclient_configured_with_base_address_58", + "label": "HttpClient configured with base address", + "role": "service", + "layer": "application", + "kind": "type", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 58, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 58 + } + ] + }, + { + "id": "flow_type_nexusreader_web_program_cs_nexusreader_application_assembly_extension_78", + "label": "NexusReader.Application (assembly extension)", + "role": "service", + "layer": "application", + "kind": "type", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 78, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 78 + } + ] + }, + { + "id": "flow_type_nexusreader_web_program_cs_nexusreader_infrastructure_assembly_extension_79", + "label": "NexusReader.Infrastructure (assembly extension)", + "role": "service", + "layer": "application", + "kind": "type", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 79, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 79 + } + ] + }, + { + "id": "flow_type_nexusreader_web_program_cs_identity_with_appdbcontext_107", + "label": "Identity with AppDbContext", + "role": "service", + "layer": "application", + "kind": "type", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 107, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 107 + } + ] + }, + { + "id": "flow_method_nexusreader_web_program_cs_usehangfiredashboard_163", + "label": "UseHangfireDashboard", + "role": "startup", + "layer": "application", + "kind": "method", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 163, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 163 + } + ] + }, + { + "id": "flow_method_nexusreader_web_program_cs_configure_request_pipeline_routing_auth_antiforgery_static_assets_hubs_225", + "label": "Configure request pipeline (routing, auth, antiforgery, static assets, hubs)", + "role": "startup", + "layer": "application", + "kind": "method", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 225, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 225 + } + ] + }, + { + "id": "flow_file_nexusreader_application_dtos_user_authordto_cs_file_1", + "label": "AuthorDto", + "role": "dto", + "layer": "application", + "kind": "file", + "filePath": "NexusReader.Application/DTOs/User/AuthorDto.cs", + "sourcePath": "NexusReader.Application/DTOs/User/AuthorDto.cs", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.Application/DTOs/User/AuthorDto.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/DTOs/User/AuthorDto.cs", + "line": 1 + } + ] + }, + { + "id": "flow_type_nexusreader_application_dtos_user_authordto_cs_authordto_3", + "label": "AuthorDto", + "role": "dto", + "layer": "application", + "kind": "type", + "filePath": "NexusReader.Application/DTOs/User/AuthorDto.cs", + "sourcePath": "NexusReader.Application/DTOs/User/AuthorDto.cs", + "sourceLine": 3, + "evidencePaths": [ + "NexusReader.Application/DTOs/User/AuthorDto.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/DTOs/User/AuthorDto.cs", + "line": 3 + } + ] + }, + { + "id": "flow_file_nexusreader_application_security_authorization_prouserhandler_cs_file_1", + "label": "ProUserHandler", + "role": "handler", + "layer": "application", + "kind": "file", + "filePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourcePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 1 + } + ] + }, + { + "id": "flow_method_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_20", + "label": "HandleRequirementAsync", + "role": "handler", + "layer": "application", + "kind": "method", + "filePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourcePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 20, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 20 + } + ] + }, + { + "id": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_guard_clause_24_24", + "label": "Missing user id", + "role": "handler", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourcePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 24, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 24 + } + ] + }, + { + "id": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_repository_read_24_24", + "label": "Reads repository or persistence state", + "role": "handler", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourcePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 24, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 24 + } + ] + }, + { + "id": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_25_25", + "label": "Evaluates branch condition", + "role": "handler", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourcePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 25, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 25 + } + ] + }, + { + "id": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_return_27_27", + "label": "Returns result", + "role": "handler", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourcePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 27, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 27 + } + ] + }, + { + "id": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_35_35", + "label": "Evaluates branch condition", + "role": "handler", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourcePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 35, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 35 + } + ] + }, + { + "id": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_guard_clause_35_35", + "label": "User not found", + "role": "handler", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourcePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 35, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 35 + } + ] + }, + { + "id": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_return_37_37", + "label": "Returns result", + "role": "handler", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourcePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 37, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 37 + } + ] + }, + { + "id": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_40_40", + "label": "Unlimited subscription rule", + "role": "handler", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourcePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 40, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 40 + } + ] + }, + { + "id": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_41_41", + "label": "Evaluates branch condition", + "role": "handler", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourcePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 41, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 41 + } + ] + }, + { + "id": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_repository_read_43_43", + "label": "Reads repository or persistence state", + "role": "handler", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourcePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 43, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 43 + } + ] + }, + { + "id": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_return_44_44", + "label": "Returns result", + "role": "handler", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourcePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 44, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 44 + } + ] + }, + { + "id": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_47_47", + "label": "Token limit rule (SaaS)", + "role": "handler", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourcePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 47, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 47 + } + ] + }, + { + "id": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_48_48", + "label": "Evaluates branch condition", + "role": "handler", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourcePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 48, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 48 + } + ] + }, + { + "id": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_repository_read_50_50", + "label": "Reads repository or persistence state", + "role": "handler", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourcePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 50, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 50 + } + ] + }, + { + "id": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_return_51_51", + "label": "Returns result", + "role": "handler", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourcePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 51, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 51 + } + ] + }, + { + "id": "flow_type_nexusreader_application_security_authorization_prouserhandler_cs_prouserhandler_11", + "label": "ProUserHandler", + "role": "unknown", + "layer": "application", + "kind": "type", + "filePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourcePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 11, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 11 + } + ] + }, + { + "id": "flow_file_nexusreader_application_security_authorization_prouserrequirement_cs_file_1", + "label": "ProUserRequirement", + "role": "unknown", + "layer": "application", + "kind": "file", + "filePath": "NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "sourcePath": "NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserRequirement.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "line": 1 + } + ] + }, + { + "id": "flow_type_nexusreader_application_security_authorization_prouserrequirement_cs_prouserrequirement_8", + "label": "ProUserRequirement", + "role": "unknown", + "layer": "application", + "kind": "type", + "filePath": "NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "sourcePath": "NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "sourceLine": 8, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserRequirement.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "line": 8 + } + ] + }, + { + "id": "flow_file_nexusreader_domain_entities_author_cs_file_1", + "label": "Author", + "role": "entity", + "layer": "domain", + "kind": "file", + "filePath": "NexusReader.Domain/Entities/Author.cs", + "sourcePath": "NexusReader.Domain/Entities/Author.cs", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.Domain/Entities/Author.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Domain/Entities/Author.cs", + "line": 1 + } + ] + }, + { + "id": "flow_type_nexusreader_domain_entities_author_cs_author_5", + "label": "Author", + "role": "entity", + "layer": "domain", + "kind": "type", + "filePath": "NexusReader.Domain/Entities/Author.cs", + "sourcePath": "NexusReader.Domain/Entities/Author.cs", + "sourceLine": 5, + "evidencePaths": [ + "NexusReader.Domain/Entities/Author.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Domain/Entities/Author.cs", + "line": 5 + } + ] + }, + { + "id": "flow_file_nexusreader_ui_shared_layout_authlayout_razor_file_1", + "label": "AuthLayout.razor", + "role": "ui-component", + "layer": "frontend", + "kind": "file", + "filePath": "NexusReader.UI.Shared/Layout/AuthLayout.razor", + "sourcePath": "NexusReader.UI.Shared/Layout/AuthLayout.razor", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.UI.Shared/Layout/AuthLayout.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Layout/AuthLayout.razor", + "line": 1 + } + ] + }, + { + "id": "flow_method_nexusreader_ui_shared_layout_authlayout_razor_authlayout_render_markup_1", + "label": "AuthLayout (render/markup)", + "role": "ui-component", + "layer": "frontend", + "kind": "method", + "filePath": "NexusReader.UI.Shared/Layout/AuthLayout.razor", + "sourcePath": "NexusReader.UI.Shared/Layout/AuthLayout.razor", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.UI.Shared/Layout/AuthLayout.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Layout/AuthLayout.razor", + "line": 1 + } + ] + }, + { + "id": "flow_file_nexusreader_web_client_handlers_authenticationheaderhandler_cs_file_1", + "label": "AuthenticationHeaderHandler", + "role": "handler", + "layer": "frontend", + "kind": "file", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 1 + } + ] + }, + { + "id": "flow_method_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_27", + "label": "SendAsync", + "role": "handler", + "layer": "frontend", + "kind": "method", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 27, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 27 + } + ] + }, + { + "id": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_external_call_27_27", + "label": "Calls external dependency", + "role": "handler", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 27, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 27 + } + ] + }, + { + "id": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_32_32", + "label": "Detect auth endpoints", + "role": "handler", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 32, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 32 + } + ] + }, + { + "id": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_39_39", + "label": "Trusted host check", + "role": "handler", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 39, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 39 + } + ] + }, + { + "id": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_guard_clause_45_45", + "label": "Attach token to request", + "role": "handler", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 45, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 45 + } + ] + }, + { + "id": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_45_45", + "label": "Evaluates branch condition", + "role": "handler", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 45, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 45 + } + ] + }, + { + "id": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_48_48", + "label": "Evaluates branch condition", + "role": "handler", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 48, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 48 + } + ] + }, + { + "id": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_external_call_55_55", + "label": "Calls external dependency", + "role": "handler", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 55, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 55 + } + ] + }, + { + "id": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_58_58", + "label": "Evaluates branch condition", + "role": "handler", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 58, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 58 + } + ] + }, + { + "id": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_guard_clause_69_69", + "label": "Concurrent-refresh detection", + "role": "handler", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 69, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 69 + } + ] + }, + { + "id": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_69_69", + "label": "Evaluates branch condition", + "role": "handler", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 69, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 69 + } + ] + }, + { + "id": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_fallback_73_73", + "label": "Falls back to alternate path", + "role": "handler", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 73, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 73 + } + ] + }, + { + "id": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_79_79", + "label": "Evaluates branch condition", + "role": "handler", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 79, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 79 + } + ] + }, + { + "id": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_fallback_85_85", + "label": "Falls back to alternate path", + "role": "handler", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 85, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 85 + } + ] + }, + { + "id": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_91_91", + "label": "Evaluates branch condition", + "role": "handler", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 91, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 91 + } + ] + }, + { + "id": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_retry_91_91", + "label": "Retry original request with new token", + "role": "handler", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 91, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 91 + } + ] + }, + { + "id": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_external_call_95_95", + "label": "Calls external dependency", + "role": "handler", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 95, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 95 + } + ] + }, + { + "id": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_return_95_95", + "label": "Returns result", + "role": "handler", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 95, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 95 + } + ] + }, + { + "id": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_return_109_109", + "label": "Return response", + "role": "handler", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 109, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 109 + } + ] + }, + { + "id": "flow_method_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_112", + "label": "CloneHttpRequestMessageAsync", + "role": "handler", + "layer": "frontend", + "kind": "method", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 112, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 112 + } + ] + }, + { + "id": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_branch_119_119", + "label": "Evaluates branch condition", + "role": "handler", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 119, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 119 + } + ] + }, + { + "id": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_loop_126_126", + "label": "Repeats work over a collection or condition", + "role": "handler", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 126, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 126 + } + ] + }, + { + "id": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_loop_132_132", + "label": "Repeats work over a collection or condition", + "role": "handler", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 132, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 132 + } + ] + }, + { + "id": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_return_139_139", + "label": "Return cloned request", + "role": "handler", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 139, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 139 + } + ] + }, + { + "id": "flow_type_nexusreader_web_client_handlers_authenticationheaderhandler_cs_authenticationheaderhandler_14", + "label": "AuthenticationHeaderHandler", + "role": "unknown", + "layer": "frontend", + "kind": "type", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 14, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 14 + } + ] + }, + { + "id": "flow_file_nexusreader_ui_shared_pages_account_login_razor_file_1", + "label": "Login.razor", + "role": "ui-page", + "layer": "frontend", + "kind": "file", + "filePath": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Login.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "line": 1 + } + ] + }, + { + "id": "flow_method_nexusreader_ui_shared_pages_account_login_razor_oninitialized_110", + "label": "OnInitialized", + "role": "ui-page", + "layer": "frontend", + "kind": "method", + "filePath": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourceLine": 110, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Login.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "line": 110 + } + ] + }, + { + "id": "flow_action_nexusreader_ui_shared_pages_account_login_razor_oninitialized_branch_112_112", + "label": "Evaluates branch condition", + "role": "ui-page", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourceLine": 112, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Login.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "line": 112 + } + ] + }, + { + "id": "flow_action_nexusreader_ui_shared_pages_account_login_razor_oninitialized_guard_clause_112_112", + "label": "Only map ErrorCode when present", + "role": "ui-page", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourceLine": 112, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Login.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "line": 112 + } + ] + }, + { + "id": "flow_action_nexusreader_ui_shared_pages_account_login_razor_oninitialized_branch_114_114", + "label": "Map specific error codes to localized messages", + "role": "ui-page", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourceLine": 114, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Login.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "line": 114 + } + ] + }, + { + "id": "flow_method_nexusreader_ui_shared_pages_account_login_razor_handlelogin_126", + "label": "HandleLogin", + "role": "ui-page", + "layer": "frontend", + "kind": "method", + "filePath": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourceLine": 126, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Login.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "line": 126 + } + ] + }, + { + "id": "flow_action_nexusreader_ui_shared_pages_account_login_razor_handlelogin_branch_134_134", + "label": "Evaluates branch condition", + "role": "ui-page", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourceLine": 134, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Login.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "line": 134 + } + ] + }, + { + "id": "flow_action_nexusreader_ui_shared_pages_account_login_razor_handlelogin_fallback_139_139", + "label": "Falls back to alternate path", + "role": "ui-page", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourceLine": 139, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Login.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "line": 139 + } + ] + }, + { + "id": "flow_action_nexusreader_ui_shared_pages_account_login_razor_handlelogin_repository_read_141_141", + "label": "Reads repository or persistence state", + "role": "ui-page", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourceLine": 141, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Login.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "line": 141 + } + ] + }, + { + "id": "flow_method_nexusreader_ui_shared_pages_account_login_razor_handlegooglelogin_154", + "label": "HandleGoogleLogin", + "role": "ui-page", + "layer": "frontend", + "kind": "method", + "filePath": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourceLine": 154, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Login.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "line": 154 + } + ] + }, + { + "id": "flow_type_nexusreader_ui_shared_pages_account_login_razor_loginmodel_157", + "label": "LoginModel", + "role": "dto", + "layer": "frontend", + "kind": "type", + "filePath": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourceLine": 157, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Login.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "line": 157 + } + ] + }, + { + "id": "flow_file_nexusreader_ui_shared_pages_account_profile_razor_file_1", + "label": "Profile (Razor component)", + "role": "ui-page", + "layer": "frontend", + "kind": "file", + "filePath": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Profile.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "line": 1 + } + ] + }, + { + "id": "flow_method_nexusreader_ui_shared_pages_account_profile_razor_oninitializedasync_111", + "label": "OnInitializedAsync", + "role": "ui-page", + "layer": "frontend", + "kind": "method", + "filePath": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "sourceLine": 111, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Profile.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "line": 111 + } + ] + }, + { + "id": "flow_action_nexusreader_ui_shared_pages_account_profile_razor_oninitializedasync_branch_114_114", + "label": "Apply result on success", + "role": "ui-page", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "sourceLine": 114, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Profile.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "line": 114 + } + ] + }, + { + "id": "flow_method_nexusreader_ui_shared_pages_account_profile_razor_calculateprogress_121", + "label": "CalculateProgress", + "role": "ui-page", + "layer": "frontend", + "kind": "method", + "filePath": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "sourceLine": 121, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Profile.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "line": 121 + } + ] + }, + { + "id": "flow_action_nexusreader_ui_shared_pages_account_profile_razor_calculateprogress_guard_clause_123_123", + "label": "Guards early exit or rejection path", + "role": "ui-page", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "sourceLine": 123, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Profile.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "line": 123 + } + ] + }, + { + "id": "flow_action_nexusreader_ui_shared_pages_account_profile_razor_calculateprogress_return_125_125", + "label": "Returns result", + "role": "ui-page", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "sourceLine": 125, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Profile.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "line": 125 + } + ] + }, + { + "id": "flow_method_nexusreader_ui_shared_pages_account_profile_razor_handlelogout_133", + "label": "HandleLogout", + "role": "ui-page", + "layer": "frontend", + "kind": "method", + "filePath": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "sourceLine": 133, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Profile.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "line": 133 + } + ] + }, + { + "id": "flow_file_nexusreader_ui_shared_pages_account_register_razor_file_1", + "label": "Register.razor", + "role": "ui-page", + "layer": "frontend", + "kind": "file", + "filePath": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Register.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "line": 1 + } + ] + }, + { + "id": "flow_method_nexusreader_ui_shared_pages_account_register_razor_handleregister_84", + "label": "HandleRegister", + "role": "ui-page", + "layer": "frontend", + "kind": "method", + "filePath": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "sourceLine": 84, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Register.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "line": 84 + } + ] + }, + { + "id": "flow_action_nexusreader_ui_shared_pages_account_register_razor_handleregister_branch_92_92", + "label": "Evaluates branch condition", + "role": "ui-page", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "sourceLine": 92, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Register.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "line": 92 + } + ] + }, + { + "id": "flow_action_nexusreader_ui_shared_pages_account_register_razor_handleregister_branch_95_95", + "label": "Evaluates branch condition", + "role": "ui-page", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "sourceLine": 95, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Register.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "line": 95 + } + ] + }, + { + "id": "flow_action_nexusreader_ui_shared_pages_account_register_razor_handleregister_fallback_100_100", + "label": "Falls back to alternate path", + "role": "ui-page", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "sourceLine": 100, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Register.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "line": 100 + } + ] + }, + { + "id": "flow_action_nexusreader_ui_shared_pages_account_register_razor_handleregister_fallback_105_105", + "label": "Falls back to alternate path", + "role": "ui-page", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "sourceLine": 105, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Register.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "line": 105 + } + ] + }, + { + "id": "flow_action_nexusreader_ui_shared_pages_account_register_razor_handleregister_repository_read_107_107", + "label": "Reads repository or persistence state", + "role": "ui-page", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "sourceLine": 107, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Register.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "line": 107 + } + ] + }, + { + "id": "flow_type_nexusreader_ui_shared_pages_account_register_razor_registermodel_120", + "label": "RegisterModel", + "role": "dto", + "layer": "frontend", + "kind": "type", + "filePath": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "sourceLine": 120, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Register.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "line": 120 + } + ] + }, + { + "id": "flow_file_nexusreader_application_abstractions_messaging_icommand_cs_file_1", + "label": "ICommand.cs", + "role": "handler", + "layer": "application", + "kind": "file", + "filePath": "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "sourcePath": "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.Application/Abstractions/Messaging/ICommand.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "line": 1 + } + ] + }, + { + "id": "flow_type_nexusreader_application_abstractions_messaging_icommand_cs_icommand_6", + "label": "ICommand", + "role": "unknown", + "layer": "application", + "kind": "type", + "filePath": "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "sourcePath": "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "sourceLine": 6, + "evidencePaths": [ + "NexusReader.Application/Abstractions/Messaging/ICommand.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "line": 6 + } + ] + }, + { + "id": "flow_type_nexusreader_application_abstractions_messaging_icommand_cs_icommand_tresponse_10", + "label": "ICommand", + "role": "unknown", + "layer": "application", + "kind": "type", + "filePath": "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "sourcePath": "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "sourceLine": 10, + "evidencePaths": [ + "NexusReader.Application/Abstractions/Messaging/ICommand.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "line": 10 + } + ] + }, + { + "id": "flow_file_nexusreader_application_abstractions_messaging_icommandhandler_cs_file_1", + "label": "ICommandHandler", + "role": "handler", + "layer": "application", + "kind": "file", + "filePath": "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "sourcePath": "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "line": 1 + } + ] + }, + { + "id": "flow_type_nexusreader_application_abstractions_messaging_icommandhandler_cs_icommandhandler_tcommand_6", + "label": "ICommandHandler", + "role": "unknown", + "layer": "application", + "kind": "type", + "filePath": "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "sourcePath": "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "sourceLine": 6, + "evidencePaths": [ + "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "line": 6 + } + ] + }, + { + "id": "flow_type_nexusreader_application_abstractions_messaging_icommandhandler_cs_icommandhandler_tcommand_tresponse_11", + "label": "ICommandHandler", + "role": "unknown", + "layer": "application", + "kind": "type", + "filePath": "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "sourcePath": "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "sourceLine": 11, + "evidencePaths": [ + "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "line": 11 + } + ] + }, + { + "id": "flow_file_nexusreader_application_abstractions_messaging_iquery_cs_file_1", + "label": "IQuery.cs", + "role": "handler", + "layer": "application", + "kind": "file", + "filePath": "NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "sourcePath": "NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.Application/Abstractions/Messaging/IQuery.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "line": 1 + } + ] + }, + { + "id": "flow_type_nexusreader_application_abstractions_messaging_iquery_cs_iquery_tresponse_6", + "label": "IQuery", + "role": "unknown", + "layer": "application", + "kind": "type", + "filePath": "NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "sourcePath": "NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "sourceLine": 6, + "evidencePaths": [ + "NexusReader.Application/Abstractions/Messaging/IQuery.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "line": 6 + } + ] + }, + { + "id": "flow_action_nexusreader_application_dependencyinjection_cs_addapplication_return_13_13", + "label": "Return IServiceCollection", + "role": "service-registration", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Application/DependencyInjection.cs", + "sourcePath": "NexusReader.Application/DependencyInjection.cs", + "sourceLine": 13, + "evidencePaths": [ + "NexusReader.Application/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/DependencyInjection.cs", + "line": 13 + } + ] + }, + { + "id": "flow_type_nexusreader_application_dependencyinjection_cs_configured_via_addmapsterconfiguration_extension_10", + "label": "configured via AddMapsterConfiguration extension", + "role": "service", + "layer": "application", + "kind": "type", + "filePath": "NexusReader.Application/DependencyInjection.cs", + "sourcePath": "NexusReader.Application/DependencyInjection.cs", + "sourceLine": 10, + "evidencePaths": [ + "NexusReader.Application/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/DependencyInjection.cs", + "line": 10 + } + ] + }, + { + "id": "flow_type_nexusreader_application_dependencyinjection_cs_handlers_discovered_in_this_assembly_11", + "label": "handlers discovered in this assembly", + "role": "service", + "layer": "application", + "kind": "type", + "filePath": "NexusReader.Application/DependencyInjection.cs", + "sourcePath": "NexusReader.Application/DependencyInjection.cs", + "sourceLine": 11, + "evidencePaths": [ + "NexusReader.Application/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/DependencyInjection.cs", + "line": 11 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_33_33", + "label": "Selects DB provider", + "role": "service-registration", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourcePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 33, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 33 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_34_34", + "label": "Evaluates branch condition", + "role": "service-registration", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourcePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 34, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 34 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_fallback_44_44", + "label": "Falls back to alternate path", + "role": "service-registration", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourcePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 44, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 44 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_64_64", + "label": "Evaluates branch condition", + "role": "service-registration", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourcePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 64, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 64 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_76_76", + "label": "Evaluates branch condition", + "role": "service-registration", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourcePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 76, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 76 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_return_134_134", + "label": "Returns IServiceCollection", + "role": "service-registration", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourcePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 134, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 134 + } + ] + }, + { + "id": "flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1", + "label": "KnowledgeService", + "role": "service", + "layer": "infrastructure", + "kind": "file", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 1 + } + ] + }, + { + "id": "flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1", + "label": "EpubReaderService", + "role": "service", + "layer": "infrastructure", + "kind": "file", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 1 + } + ] + }, + { + "id": "flow_file_nexusreader_infrastructure_services_epubmetadataextractor_cs_file_1", + "label": "EpubMetadataExtractor", + "role": "service", + "layer": "infrastructure", + "kind": "file", + "filePath": "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "line": 1 + } + ] + }, + { + "id": "flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1", + "label": "BookStorageService", + "role": "service", + "layer": "infrastructure", + "kind": "file", + "filePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 1 + } + ] + }, + { + "id": "flow_file_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_file_1", + "label": "SignalRSyncBroadcaster", + "role": "integration-client", + "layer": "infrastructure", + "kind": "file", + "filePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "line": 1 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_dependencyinjection_cs_assembly_137", + "label": "Assembly", + "role": "service-registration", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourcePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 137, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 137 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_assembly_return_137_137", + "label": "Return assembly", + "role": "service-registration", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourcePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 137, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 137 + } + ] + }, + { + "id": "flow_type_nexusreader_infrastructure_dependencyinjection_cs_iinfrastructuremarker_140", + "label": "IInfrastructureMarker", + "role": "unknown", + "layer": "infrastructure", + "kind": "type", + "filePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourcePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 140, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 140 + } + ] + }, + { + "id": "flow_type_nexusreader_infrastructure_dependencyinjection_cs_infrastructuremarker_141", + "label": "InfrastructureMarker", + "role": "unknown", + "layer": "infrastructure", + "kind": "type", + "filePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourcePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 141, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 141 + } + ] + }, + { + "id": "flow_type_nexusreader_infrastructure_dependencyinjection_cs_appdbcontext_36", + "label": "AppDbContext", + "role": "service", + "layer": "infrastructure", + "kind": "type", + "filePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourcePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 36, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 36 + } + ] + }, + { + "id": "flow_type_nexusreader_infrastructure_dependencyinjection_cs_appdbcontext_41", + "label": "AppDbContext", + "role": "service", + "layer": "infrastructure", + "kind": "type", + "filePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourcePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 41, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 41 + } + ] + }, + { + "id": "flow_type_nexusreader_infrastructure_dependencyinjection_cs_appdbcontext_47", + "label": "AppDbContext", + "role": "service", + "layer": "infrastructure", + "kind": "type", + "filePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourcePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 47, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 47 + } + ] + }, + { + "id": "flow_type_nexusreader_infrastructure_dependencyinjection_cs_appdbcontext_51", + "label": "AppDbContext", + "role": "service", + "layer": "infrastructure", + "kind": "type", + "filePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourcePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 51, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 51 + } + ] + }, + { + "id": "flow_type_nexusreader_infrastructure_dependencyinjection_cs_qdrantclient_57", + "label": "QdrantClient", + "role": "service", + "layer": "infrastructure", + "kind": "type", + "filePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourcePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 57, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 57 + } + ] + }, + { + "id": "flow_type_nexusreader_infrastructure_dependencyinjection_cs_neo4j_driver_graphdatabase_driver_61", + "label": "Neo4j.Driver (GraphDatabase.Driver)", + "role": "service", + "layer": "infrastructure", + "kind": "type", + "filePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourcePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 61, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 61 + } + ] + }, + { + "id": "flow_type_nexusreader_infrastructure_dependencyinjection_cs_hangfire_postgres_storage_66", + "label": "Hangfire/Postgres storage", + "role": "service", + "layer": "infrastructure", + "kind": "type", + "filePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourcePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 66, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 66 + } + ] + }, + { + "id": "flow_type_nexusreader_infrastructure_dependencyinjection_cs_geminichatclient_99", + "label": "GeminiChatClient", + "role": "service", + "layer": "infrastructure", + "kind": "type", + "filePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourcePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 99, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 99 + } + ] + }, + { + "id": "flow_type_nexusreader_infrastructure_dependencyinjection_cs_geminiembeddinggenerator_105", + "label": "GeminiEmbeddingGenerator", + "role": "service", + "layer": "infrastructure", + "kind": "type", + "filePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourcePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 105, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 105 + } + ] + }, + { + "id": "flow_type_nexusreader_infrastructure_dependencyinjection_cs_knowledgeservice_112", + "label": "KnowledgeService", + "role": "service", + "layer": "infrastructure", + "kind": "type", + "filePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourcePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 112, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 112 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_19", + "label": "UpdateProgress", + "role": "endpoint", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 19, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 19 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_repository_read_21_21", + "label": "Reads repository or persistence state", + "role": "endpoint", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 21, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 21 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_guard_clause_21_21", + "label": "Requires authenticated user id", + "role": "endpoint", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 21, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 21 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_branch_22_22", + "label": "Evaluates branch condition", + "role": "endpoint", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 22, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 22 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_repository_read_24_24", + "label": "Reads repository or persistence state", + "role": "endpoint", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 24, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 24 + } + ] + }, + { + "id": "flow_file_nexusreader_application_commands_sync_updatereadingprogresscommand_cs_file_1", + "label": "UpdateReadingProgressCommand", + "role": "handler", + "layer": "application", + "kind": "file", + "filePath": "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs", + "sourcePath": "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs", + "line": 1 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_28", + "label": "OnConnectedAsync", + "role": "endpoint", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 28, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 28 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_repository_read_30_30", + "label": "Reads repository or persistence state", + "role": "endpoint", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 30, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 30 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_branch_31_31", + "label": "Evaluates branch condition", + "role": "endpoint", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 31, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 31 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_guard_clause_31_31", + "label": "Only add to group if userId present", + "role": "endpoint", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 31, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 31 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_repository_read_33_33", + "label": "Reads repository or persistence state", + "role": "endpoint", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 33, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 33 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_38", + "label": "OnDisconnectedAsync", + "role": "endpoint", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 38, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 38 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_repository_read_40_40", + "label": "Reads repository or persistence state", + "role": "endpoint", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 40, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 40 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_branch_41_41", + "label": "Evaluates branch condition", + "role": "endpoint", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 41, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 41 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_guard_clause_41_41", + "label": "Only remove from group if userId present", + "role": "endpoint", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 41, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 41 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_repository_read_43_43", + "label": "Reads repository or persistence state", + "role": "endpoint", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 43, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 43 + } + ] + }, + { + "id": "flow_type_nexusreader_infrastructure_realtime_synchub_cs_synchub_10", + "label": "SyncHub", + "role": "unknown", + "layer": "infrastructure", + "kind": "type", + "filePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 10, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 10 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_knowledgeservice_38", + "label": "KnowledgeService", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 38, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 38 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeasync_61", + "label": "GetKnowledgeAsync", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 61, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 61 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeasync_return_63_63", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 63, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 63 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getgraphdataasync_66", + "label": "GetGraphDataAsync", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 66, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 66 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getgraphdataasync_return_68_68", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 68, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 68 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getsummaryandquizasync_71", + "label": "GetSummaryAndQuizAsync", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 71, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 71 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getsummaryandquizasync_return_73_73", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 73, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 73 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgemapasync_76", + "label": "GetKnowledgeMapAsync", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 76, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 76 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgemapasync_return_78_78", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 78, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 78 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_81", + "label": "GetKnowledgeInternalAsync", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 81, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 81 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_guard_clause_83_83", + "label": "Guards early exit or rejection path", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 83, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 83 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_branch_93_93", + "label": "Cache hit path", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 93, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 93 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_guard_clause_99_99", + "label": "Guards early exit or rejection path", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 99, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 99 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_log_103_103", + "label": "Logs runtime state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 103, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 103 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_branch_122_122", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 122, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 122 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_return_127_127", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 127, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 127 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_140", + "label": "ExecuteAiRequestAndCacheAsync", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 140, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 140 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_validation_166_166", + "label": "Rejects empty AI response", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 166, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 166 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_guard_clause_167_167", + "label": "Guards early exit or rejection path", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 167, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 167 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_guard_clause_176_176", + "label": "Guards early exit or rejection path", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 176, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 176 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_branch_193_193", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 193, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 193 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_repository_write_193_193", + "label": "Writes repository or persistence state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 193, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 193 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_fallback_194_194", + "label": "Falls back to alternate path", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 194, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 194 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_return_205_205", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 205, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 205 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_log_209_209", + "label": "Logs runtime state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 209, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 209 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_return_210_210", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 210, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 210 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_return_215_215", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 215, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 215 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_225", + "label": "ProcessKnowledgeUnitsAsync", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 225, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 225 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_repository_read_235_235", + "label": "Reads repository or persistence state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 235, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 235 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_loop_240_240", + "label": "Repeats work over a collection or condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 240, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 240 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_branch_245_245", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 245, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 245 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_repository_write_248_248", + "label": "Writes repository or persistence state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 248, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 248 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_loop_266_266", + "label": "Maps links to KnowledgeUnitLink entities", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 266, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 266 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_branch_271_271", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 271, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 271 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_repository_write_281_281", + "label": "Writes repository or persistence state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 281, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 281 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_fallback_283_283", + "label": "Falls back to alternate path", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 283, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 283 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_log_285_285", + "label": "Logs runtime state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 285, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 285 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_verifygroundednessasync_290", + "label": "VerifyGroundednessAsync", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 290, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 290 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_verifygroundednessasync_return_295_295", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 295, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 295 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_verifygroundednessasync_return_320_320", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 320, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 320 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_verifygroundednessasync_return_324_324", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 324, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 324 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_328", + "label": "GetRelevantContextAsync", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 328, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 328 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_336_336", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 336, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 336 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_337_337", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 337, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 337 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_339_339", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 339, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 339 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_342_342", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 342, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 342 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_345_345", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 345, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 345 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_347_347", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 347, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 347 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_350_350", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 350, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 350 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_354_354", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 354, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 354 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_368_368", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 368, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 368 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_return_377_377", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 377, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 377 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_return_381_381", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 381, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 381 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_385", + "label": "SearchLibrarySemanticallyAsync", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 385, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 385 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_399_399", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 399, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 399 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_400_400", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 400, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 400 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_402_402", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 402, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 402 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_405_405", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 405, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 405 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_408_408", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 408, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 408 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_410_410", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 410, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 410 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_413_413", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 413, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 413 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_417_417", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 417, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 417 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_log_431_431", + "label": "Logs runtime state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 431, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 431 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_432_432", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 432, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 432 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_435_435", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 435, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 435 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_437_437", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 437, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 437 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_444_444", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 444, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 444 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_452_452", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 452, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 452 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_457_457", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 457, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 457 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_loop_460_460", + "label": "Repeats work over a collection or condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 460, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 460 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_464_464", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 464, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 464 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_log_473_473", + "label": "Logs runtime state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 473, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 473 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_repository_read_479_479", + "label": "Reads repository or persistence state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 479, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 479 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_485_485", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 485, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 485 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_repository_read_489_489", + "label": "Reads repository or persistence state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 489, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 489 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_501_501", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 501, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 501 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_507_507", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 507, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 507 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_513_513", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 513, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 513 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_533_533", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 533, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 533 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_538_538", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 538, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 538 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_541_541", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 541, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 541 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_545_545", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 545, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 545 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_549", + "label": "AskQuestionAsync", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 549, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 549 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_568_568", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 568, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 568 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_571_571", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 571, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 571 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_572_572", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 572, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 572 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_574_574", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 574, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 574 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_577_577", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 577, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 577 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_580_580", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 580, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 580 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_582_582", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 582, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 582 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_585_585", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 585, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 585 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_588_588", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 588, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 588 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_590_590", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 590, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 590 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_592_592", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 592, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 592 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_594_594", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 594, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 594 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_597_597", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 597, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 597 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_602_602", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 602, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 602 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_log_616_616", + "label": "Logs runtime state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 616, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 616 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_617_617", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 617, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 617 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_620_620", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 620, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 620 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_622_622", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 622, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 622 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_624_624", + "label": "Reads repository or persistence state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 624, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 624 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_636_636", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 636, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 636 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_645_645", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 645, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 645 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_651_651", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 651, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 651 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_loop_654_654", + "label": "Repeats work over a collection or condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 654, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 654 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_write_659_659", + "label": "Writes repository or persistence state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 659, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 659 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_662_662", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 662, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 662 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_loop_664_664", + "label": "Repeats work over a collection or condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 664, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 664 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_671_671", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 671, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 671 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_write_673_673", + "label": "Writes repository or persistence state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 673, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 673 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_log_682_682", + "label": "Logs runtime state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 682, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 682 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_loop_683_683", + "label": "Repeats work over a collection or condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 683, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 683 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_write_687_687", + "label": "Writes repository or persistence state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 687, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 687 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_694_694", + "label": "Reads repository or persistence state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 694, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 694 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_700_700", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 700, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 700 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_704_704", + "label": "Reads repository or persistence state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 704, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 704 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_715_715", + "label": "Reads repository or persistence state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 715, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 715 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_716_716", + "label": "Reads repository or persistence state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 716, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 716 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_717_717", + "label": "Reads repository or persistence state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 717, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 717 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_754_754", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 754, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 754 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_756_756", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 756, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 756 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_loop_760_760", + "label": "Repeats work over a collection or condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 760, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 760 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_762_762", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 762, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 762 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_771_771", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 771, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 771 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_log_775_775", + "label": "Logs runtime state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 775, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 775 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_776_776", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 776, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 776 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_781_781", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 781, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 781 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_30", + "label": "GetEpubContentAsync", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 30, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 30 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_repository_read_41_41", + "label": "Reads repository or persistence state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 41, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 41 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_guard_clause_47_47", + "label": "Ebook existence check", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 47, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 47 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_47_47", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 47, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 47 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_return_49_49", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 49, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 49 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_55_55", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 55, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 55 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_log_57_57", + "label": "Logs runtime state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 57, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 57 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_return_58_58", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 58, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 58 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_65_65", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 65, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 65 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_guard_clause_65_65", + "label": "ReadingOrder empty check", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 65, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 65 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_return_67_67", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 67, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 67 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_70_70", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 70, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 70 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_repository_read_77_77", + "label": "Reads repository or persistence state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 77, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 77 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_loop_89_89", + "label": "Paragraph -> block building loop", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 89, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 89 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_guard_clause_92_92", + "label": "Guards early exit or rejection path", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 92, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 92 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_99_99", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 99, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 99 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_106_106", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 106, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 106 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_return_111_111", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 111, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 111 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_log_115_115", + "label": "Logs runtime state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 115, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 115 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_return_116_116", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 116, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 116 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_124", + "label": "ResolvePath", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 124, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 124 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_loop_129_129", + "label": "Search upward through parent directories", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 129, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 129 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_loop_130_130", + "label": "Repeats work over a collection or condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 130, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 130 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_guard_clause_133_133", + "label": "Guards early exit or rejection path", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 133, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 133 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_guard_clause_137_137", + "label": "Guards early exit or rejection path", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 137, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 137 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_fallback_142_142", + "label": "Return null if not found", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 142, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 142 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_return_142_142", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 142, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 142 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_extractparagraphs_145", + "label": "ExtractParagraphs", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 145, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 145 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_extractparagraphs_loop_153_153", + "label": "Repeats work over a collection or condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 153, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 153 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_extractparagraphs_branch_158_158", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 158, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 158 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_extractparagraphs_fallback_158_158", + "label": "Split by breaks if no blocks found", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 158, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 158 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_extractparagraphs_return_163_163", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 163, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 163 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_sanitizeparagraph_166", + "label": "SanitizeParagraph", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 166, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 166 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_sanitizeparagraph_return_172_172", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 172, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 172 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_175", + "label": "CountWords", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 175, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 175 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_guard_clause_177_177", + "label": "Empty text check", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 177, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 177 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_return_178_178", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 178, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 178 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_createaitrigger_181", + "label": "CreateAiTrigger", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 181, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 181 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_186", + "label": "FindTitleInNavigation", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 186, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 186 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_repository_read_186_186", + "label": "Reads repository or persistence state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 186, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 186 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_guard_clause_188_188", + "label": "Guards early exit or rejection path", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 188, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 188 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_loop_191_191", + "label": "Iterate navigation items", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 191, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 191 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_branch_193_193", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 193, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 193 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_return_194_194", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 194, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 194 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_branch_196_196", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 196, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 196 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_repository_read_198_198", + "label": "Reads repository or persistence state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 198, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 198 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_guard_clause_199_199", + "label": "Guards early exit or rejection path", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 199, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 199 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_return_203_203", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 203, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 203 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_epubmetadataextractor_cs_extractmetadataasync_15", + "label": "ExtractMetadataAsync", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "sourceLine": 15, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "line": 15 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubmetadataextractor_cs_extractmetadataasync_guard_clause_20_20", + "label": "Default title when null", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "sourceLine": 20, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "line": 20 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubmetadataextractor_cs_extractmetadataasync_guard_clause_21_21", + "label": "Default author when null", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "sourceLine": 21, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "line": 21 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubmetadataextractor_cs_extractmetadataasync_return_24_24", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "sourceLine": 24, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "line": 24 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubmetadataextractor_cs_extractmetadataasync_return_28_28", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "sourceLine": 28, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "line": 28 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_19", + "label": "SaveEbookAsync", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 19, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 19 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_return_22_22", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 22, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 22 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_25", + "label": "SaveEbookAsync", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 25, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 25 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_guard_clause_28_28", + "label": "Ensure uploads directory exists", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 28, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 28 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_return_40_40", + "label": "Return web-relative uploads path", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 40, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 40 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_43", + "label": "SaveCoverAsync", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 43, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 43 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_guard_clause_45_45", + "label": "Guards early exit or rejection path", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 45, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 45 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_return_47_47", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 47, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 47 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_50", + "label": "SaveCoverAsync", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 50, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 50 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_guard_clause_53_53", + "label": "Ensure covers directory exists", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 53, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 53 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_return_63_63", + "label": "Return web-relative covers path", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 63, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 63 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_66", + "label": "EnsureDirectoryExists", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 66, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 66 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_guard_clause_68_68", + "label": "Check directory existence", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 68, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 68 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_branch_68_68", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 68, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 68 + } + ] + }, + { + "id": "flow_type_nexusreader_infrastructure_services_bookstorageservice_cs_bookstorageservice_10", + "label": "BookStorageService", + "role": "unknown", + "layer": "infrastructure", + "kind": "type", + "filePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 10, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 10 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_21", + "label": "BroadcastProgressAsync", + "role": "integration-client", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourceLine": 21, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "line": 21 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_guard_clause_30_30", + "label": "Check excludedConnectionId", + "role": "integration-client", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourceLine": 30, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "line": 30 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_branch_30_30", + "label": "Evaluates branch condition", + "role": "integration-client", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourceLine": 30, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "line": 30 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_external_call_34_34", + "label": "Calls external dependency", + "role": "integration-client", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourceLine": 34, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "line": 34 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_fallback_40_40", + "label": "Falls back to alternate path", + "role": "integration-client", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourceLine": 40, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "line": 40 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_external_call_44_44", + "label": "Calls external dependency", + "role": "integration-client", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourceLine": 44, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "line": 44 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastingestionprogressasync_49", + "label": "BroadcastIngestionProgressAsync", + "role": "integration-client", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourceLine": 49, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "line": 49 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastingestionprogressasync_external_call_59_59", + "label": "Calls external dependency", + "role": "integration-client", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourceLine": 59, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "line": 59 + } + ] + }, + { + "id": "flow_type_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_signalrsyncbroadcaster_11", + "label": "SignalRSyncBroadcaster", + "role": "unknown", + "layer": "infrastructure", + "kind": "type", + "filePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourceLine": 11, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "line": 11 + } + ] + }, + { + "id": "flow_type_nexusreader_application_commands_sync_updatereadingprogresscommand_cs_updatereadingprogresscommand_6", + "label": "UpdateReadingProgressCommand", + "role": "unknown", + "layer": "application", + "kind": "type", + "filePath": "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs", + "sourcePath": "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs", + "sourceLine": 6, + "evidencePaths": [ + "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs", + "line": 6 + } + ] + } + ], + "edges": [ + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_method_nexusreader_maui_mauiprogram_cs_createmauiapp_12_invokes_12", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_method_nexusreader_maui_mauiprogram_cs_createmauiapp_12", + "kind": "handles-route", + "label": "CreateMauiApp", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 12, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 12 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_maui_mauiprogram_cs_createmauiapp_12_flow_action_nexusreader_maui_mauiprogram_cs_createmauiapp_return_57_57_returns_57", + "from": "flow_method_nexusreader_maui_mauiprogram_cs_createmauiapp_12", + "to": "flow_action_nexusreader_maui_mauiprogram_cs_createmauiapp_return_57_57", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 57, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 57 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauiprogram_10_defines-type_10", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_mauiprogram_10", + "kind": "defines-type", + "label": "model MauiProgram", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 10, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 10 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28_registers-service_28", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28", + "kind": "registers-service", + "label": "IPlatformService", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 28, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 28 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29_registers-service_29", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29", + "kind": "registers-service", + "label": "INativeStorageService", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 29, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 29 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32_registers-service_32", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32", + "kind": "registers-service", + "label": "NexusAuthenticationStateProvider", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 32, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 32 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33_registers-service_33", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33", + "kind": "registers-service", + "label": "Microsoft.AspNetCore.Components.Authorization.AuthenticationStateProvider", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 33, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 33 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38_registers-service_38", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38", + "kind": "registers-service", + "label": "HttpClient", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 38, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 38 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1_registers-service_1", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1", + "kind": "registers-service", + "label": "UI and app state services", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 1 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51_registers-service_51", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51", + "kind": "registers-service", + "label": "Application layer services (extension)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 51, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 51 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53_registers-service_53", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53", + "kind": "registers-service", + "label": "MediatR handlers", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 53, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 53 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_method_nexusreader_maui_mauiprogram_cs_create_and_build_mauiapp_16_configures-pipeline_16", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_method_nexusreader_maui_mauiprogram_cs_create_and_build_mauiapp_16", + "kind": "configures-pipeline", + "label": "unknown", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 16, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 16 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15_invokes_15", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15", + "kind": "handles-route", + "label": "Program (top-level startup)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 15, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 15 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_getservice_71_invokes_71", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_method_nexusreader_web_client_program_cs_getservice_71", + "kind": "handles-route", + "label": "GetService", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 71, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 71 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_web_client_program_cs_getservice_71_flow_action_nexusreader_web_client_program_cs_getservice_return_71_71_returns_71", + "from": "flow_method_nexusreader_web_client_program_cs_getservice_71", + "to": "flow_action_nexusreader_web_client_program_cs_getservice_return_71_71", + "kind": "returns", + "label": "returns null", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 71, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 71 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88_invokes_88", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88", + "kind": "handles-route", + "label": "FindAuthorByNameAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 88, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 88 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88_flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88_invokes_88", + "from": "flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88", + "to": "flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 88, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 88 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61_defines-type_61", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61", + "kind": "defines-type", + "label": "model ThrowingDbContextFactory", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 61, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 61 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66_defines-type_66", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66", + "kind": "defines-type", + "label": "model ThrowingEmbeddingGenerator", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 66, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 66 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74_defines-type_74", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74", + "kind": "defines-type", + "label": "model ThrowingBookStorageService", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 74, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 74 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84_defines-type_84", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84", + "kind": "defines-type", + "label": "model ThrowingEbookRepository", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 84, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 84 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94_defines-type_94", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94", + "kind": "defines-type", + "label": "model ThrowingSyncBroadcaster", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 94, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 94 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_webplatformservice_18_registers-service_18", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_webplatformservice_18", + "kind": "registers-service", + "label": "IPlatformService", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 18, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 18 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33_registers-service_33", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33", + "kind": "registers-service", + "label": "NexusAuthenticationStateProvider", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 33, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 33 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38_registers-service_38", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38", + "kind": "registers-service", + "label": "IKnowledgeService", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 38, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 38 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_configured_httpclient_40_registers-service_40", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_configured_httpclient_40", + "kind": "registers-service", + "label": "HttpClient (named 'NexusAPI')", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 40, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 40 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49_registers-service_49", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49", + "kind": "registers-service", + "label": "IDbContextFactory", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 49, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 49 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_n_a_55_registers-service_55", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_n_a_55", + "kind": "registers-service", + "label": "application services (via extension)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 55, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 55 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_wasmepubreader_56_registers-service_56", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_wasmepubreader_56", + "kind": "registers-service", + "label": "IEpubReader", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 56, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 56 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_run_wasm_host_59_configures-pipeline_59", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_method_nexusreader_web_client_program_cs_run_wasm_host_59", + "kind": "configures-pipeline", + "label": "unknown", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 59, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 59 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_program_top_level_29_invokes_29", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_method_nexusreader_web_program_cs_program_top_level_29", + "kind": "handles-route", + "label": "Program (top-level)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 29, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 29 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_web_program_cs_program_top_level_29_flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62_evaluates-condition_62", + "from": "flow_method_nexusreader_web_program_cs_program_top_level_29", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 62, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 62 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_falls-back_66", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "kind": "falls-back", + "label": "fallback", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 66, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 66 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125_invokes_125", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 125, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 125 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_126_126_invokes_126", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_126_126", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 126, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 126 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_126_126_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_127_127_invokes_127", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_126_126", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_127_127", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 127, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 127 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_127_127_flow_action_nexusreader_web_program_cs_program_top_level_branch_129_129_evaluates-condition_129", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_127_127", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_129_129", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 129, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 129 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_129_129_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_131_131_invokes_131", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_129_129", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_131_131", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 131, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 131 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_131_131_flow_action_nexusreader_web_program_cs_program_top_level_fallback_133_133_falls-back_133", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_131_131", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_133_133", + "kind": "falls-back", + "label": "fallback", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 133, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 133 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_fallback_133_133_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_135_135_invokes_135", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_133_133", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_135_135", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 135, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 135 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_135_135_flow_action_nexusreader_web_program_cs_program_top_level_return_137_137_returns_137", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_135_135", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_137_137", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 137, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 137 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_return_137_137_flow_action_nexusreader_web_program_cs_program_top_level_branch_169_169_evaluates-condition_169", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_return_137_137", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_169_169", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 169, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 169 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_169_169_flow_action_nexusreader_web_program_cs_program_top_level_validation_171_171_evaluates-condition_171", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_169_169", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_validation_171_171", + "kind": "evaluates-condition", + "label": "Validates input or state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 171, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 171 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_validation_171_171_flow_action_nexusreader_web_program_cs_program_top_level_loop_186_186_loops-to_186", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_validation_171_171", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_loop_186_186", + "kind": "loops-to", + "label": "int i = 0; i < maxRetries; i++", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 186, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 186 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_loop_186_186_flow_action_nexusreader_web_program_cs_program_top_level_branch_190_190_evaluates-condition_190", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_loop_186_186", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_190_190", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 190, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 190 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_190_190_flow_action_nexusreader_web_program_cs_program_top_level_branch_198_198_evaluates-condition_198", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_190_190", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_198_198", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 198, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 198 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_198_198_flow_action_nexusreader_web_program_cs_program_top_level_branch_206_206_evaluates-condition_206", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_198_198", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_206_206", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 206, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 206 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_206_206_flow_action_nexusreader_web_program_cs_program_top_level_log_206_206_invokes_206", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_206_206", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_log_206_206", + "kind": "invokes", + "label": "Logs runtime state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 206, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 206 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_log_206_206_flow_action_nexusreader_web_program_cs_program_top_level_log_208_208_invokes_208", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_log_206_206", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_log_208_208", + "kind": "invokes", + "label": "Logs runtime state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 208, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 208 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_log_208_208_flow_action_nexusreader_web_program_cs_program_top_level_branch_216_216_evaluates-condition_216", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_log_208_208", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_216_216", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 216, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 216 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_216_216_flow_action_nexusreader_web_program_cs_program_top_level_log_216_216_invokes_216", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_216_216", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_log_216_216", + "kind": "invokes", + "label": "Logs runtime state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 216, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 216 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_log_216_216_flow_action_nexusreader_web_program_cs_program_top_level_log_218_218_invokes_218", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_log_216_216", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_log_218_218", + "kind": "invokes", + "label": "Logs runtime state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 218, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 218 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_log_218_218_flow_action_nexusreader_web_program_cs_program_top_level_branch_226_226_evaluates-condition_226", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_log_218_218", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_226_226", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 226, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 226 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_226_226_flow_action_nexusreader_web_program_cs_program_top_level_fallback_230_230_falls-back_230", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_226_226", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_230_230", + "kind": "falls-back", + "label": "fallback", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 230, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 230 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_fallback_230_230_flow_action_nexusreader_web_program_cs_program_top_level_branch_237_237_evaluates-condition_237", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_230_230", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_237_237", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 237, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 237 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_237_237_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_252_252_invokes_252", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_237_237", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_252_252", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 252, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 252 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_252_252_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_255_255_evaluates-condition_255", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_252_252", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_255_255", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 255, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 255 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_255_255_flow_action_nexusreader_web_program_cs_program_top_level_return_258_258_returns_258", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_255_255", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_258_258", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 258, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 258 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_return_258_258_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_267_267_invokes_267", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_return_258_258", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_267_267", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 267, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 267 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_267_267_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_269_269_evaluates-condition_269", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_267_267", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_269_269", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 269, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 269 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_269_269_flow_action_nexusreader_web_program_cs_program_top_level_return_270_270_returns_270", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_269_269", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_270_270", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 270, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 270 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_return_270_270_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_275_275_invokes_275", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_return_270_270", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_275_275", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 275, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 275 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_275_275_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_277_277_evaluates-condition_277", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_275_275", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_277_277", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 277, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 277 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_277_277_flow_action_nexusreader_web_program_cs_program_top_level_return_278_278_returns_278", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_277_277", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_278_278", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 278, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 278 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_return_278_278_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_283_283_invokes_283", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_return_278_278", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_283_283", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 283, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 283 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_283_283_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_285_285_evaluates-condition_285", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_283_283", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_285_285", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 285, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 285 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_285_285_flow_action_nexusreader_web_program_cs_program_top_level_return_286_286_returns_286", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_285_285", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_286_286", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 286, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 286 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_return_286_286_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_291_291_invokes_291", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_return_286_286", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_291_291", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 291, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 291 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_291_291_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_293_293_evaluates-condition_293", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_291_291", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_293_293", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 293, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 293 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_293_293_flow_action_nexusreader_web_program_cs_program_top_level_return_294_294_returns_294", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_293_293", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_294_294", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 294, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 294 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_return_294_294_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_299_299_invokes_299", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_return_294_294", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_299_299", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 299, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 299 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_299_299_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_301_301_evaluates-condition_301", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_299_299", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_301_301", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 301, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 301 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_301_301_flow_action_nexusreader_web_program_cs_program_top_level_return_302_302_returns_302", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_301_301", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_302_302", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 302, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 302 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_return_302_302_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_307_307_invokes_307", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_return_302_302", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_307_307", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 307, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 307 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_307_307_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_309_309_evaluates-condition_309", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_307_307", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_309_309", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 309, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 309 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_309_309_flow_action_nexusreader_web_program_cs_program_top_level_return_310_310_returns_310", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_309_309", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_310_310", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 310, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 310 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_return_310_310_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_315_315_invokes_315", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_return_310_310", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_315_315", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 315, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 315 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_315_315_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_317_317_evaluates-condition_317", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_315_315", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_317_317", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 317, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 317 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_317_317_flow_action_nexusreader_web_program_cs_program_top_level_return_318_318_returns_318", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_317_317", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_318_318", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 318, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 318 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_return_318_318_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_324_324_evaluates-condition_324", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_return_318_318", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_324_324", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 324, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 324 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_324_324_flow_action_nexusreader_web_program_cs_program_top_level_return_327_327_returns_327", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_324_324", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_327_327", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 327, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 327 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_return_327_327_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_332_332_invokes_332", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_return_327_327", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_332_332", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 332, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 332 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_332_332_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_333_333_evaluates-condition_333", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_332_332", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_333_333", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 333, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 333 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_333_333_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_350_350_evaluates-condition_350", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_333_333", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_350_350", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 350, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 350 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_350_350_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_352_352_invokes_352", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_350_350", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_352_352", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 352, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 352 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_352_352_flow_action_nexusreader_web_program_cs_program_top_level_return_352_352_returns_352", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_352_352", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_352_352", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 352, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 352 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_return_352_352_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_357_357_invokes_357", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_return_352_352", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_357_357", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 357, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 357 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_357_357_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_358_358_evaluates-condition_358", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_357_357", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_358_358", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 358, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 358 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_358_358_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_361_361_evaluates-condition_361", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_358_358", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_361_361", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 361, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 361 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_361_361_flow_action_nexusreader_web_program_cs_program_top_level_return_364_364_returns_364", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_361_361", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_364_364", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 364, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 364 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_return_364_364_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_374_374_invokes_374", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_return_364_364", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_374_374", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 374, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 374 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_374_374_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_381_381_invokes_381", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_374_374", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_381_381", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 381, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 381 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_381_381_flow_action_nexusreader_web_program_cs_program_top_level_switch_385_385_evaluates-condition_385", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_381_381", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_switch_385_385", + "kind": "evaluates-condition", + "label": "stripeEvent.Type", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 385, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 385 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_switch_385_385_flow_action_nexusreader_web_program_cs_program_top_level_return_402_402_returns_402", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_switch_385_385", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_402_402", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 402, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 402 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_return_402_402_flow_action_nexusreader_web_program_cs_program_top_level_return_406_406_returns_406", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_return_402_402", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_406_406", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 406, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 406 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_return_406_406_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_416_416_evaluates-condition_416", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_return_406_406", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_416_416", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 416, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 416 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_416_416_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_418_418_invokes_418", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_416_416", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_418_418", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 418, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 418 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_418_418_flow_action_nexusreader_web_program_cs_program_top_level_branch_419_419_evaluates-condition_419", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_418_418", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_419_419", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 419, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 419 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_419_419_flow_action_nexusreader_web_program_cs_program_top_level_branch_424_424_evaluates-condition_424", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_419_419", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_424_424", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 424, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 424 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_424_424_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_439_439_evaluates-condition_439", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_424_424", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_439_439", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 439, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 439 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_439_439_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_441_441_invokes_441", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_439_439", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_441_441", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 441, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 441 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_441_441_flow_action_nexusreader_web_program_cs_program_top_level_branch_442_442_evaluates-condition_442", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_441_441", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_442_442", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 442, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 442 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_442_442_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_444_444_invokes_444", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_442_442", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_444_444", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 444, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 444 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_444_444_flow_action_nexusreader_web_program_cs_program_top_level_return_460_460_returns_460", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_444_444", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_460_460", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 460, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 460 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_return_460_460_flow_action_nexusreader_web_program_cs_program_top_level_branch_470_470_evaluates-condition_470", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_return_460_460", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_470_470", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 470, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 470 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_470_470_flow_action_nexusreader_web_program_cs_program_top_level_log_472_472_invokes_472", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_470_470", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_log_472_472", + "kind": "invokes", + "label": "Logs runtime state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 472, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 472 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_log_472_472_flow_action_nexusreader_web_program_cs_program_top_level_return_473_473_returns_473", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_log_472_472", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_473_473", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 473, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 473 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_return_473_473_flow_action_nexusreader_web_program_cs_program_top_level_branch_477_477_evaluates-condition_477", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_return_473_473", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_477_477", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 477, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 477 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_477_477_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_479_479_invokes_479", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_477_477", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_479_479", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 479, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 479 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_479_479_flow_action_nexusreader_web_program_cs_program_top_level_return_480_480_returns_480", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_479_479", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_480_480", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 480, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 480 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_return_480_480_flow_action_nexusreader_web_program_cs_program_top_level_branch_483_483_evaluates-condition_483", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_return_480_480", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_483_483", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 483, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 483 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_483_483_flow_action_nexusreader_web_program_cs_program_top_level_log_485_485_invokes_485", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_483_483", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_log_485_485", + "kind": "invokes", + "label": "Logs runtime state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 485, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 485 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_log_485_485_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_485_485_invokes_485", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_log_485_485", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_485_485", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 485, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 485 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_485_485_flow_action_nexusreader_web_program_cs_program_top_level_return_486_486_returns_486", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_485_485", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_486_486", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 486, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 486 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_return_486_486_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_490_490_invokes_490", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_return_486_486", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_490_490", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 490, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 490 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_490_490_flow_action_nexusreader_web_program_cs_program_top_level_branch_491_491_evaluates-condition_491", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_490_490", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_491_491", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 491, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 491 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_491_491_flow_action_nexusreader_web_program_cs_program_top_level_branch_496_496_evaluates-condition_496", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_491_491", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_496_496", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 496, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 496 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_496_496_flow_action_nexusreader_web_program_cs_program_top_level_return_501_501_returns_501", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_496_496", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_501_501", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 501, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 501 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_return_501_501_flow_action_nexusreader_web_program_cs_program_top_level_loop_505_505_loops-to_505", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_return_501_501", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_loop_505_505", + "kind": "loops-to", + "label": "var error in createResult.Errors", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 505, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 505 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_loop_505_505_flow_action_nexusreader_web_program_cs_program_top_level_log_507_507_invokes_507", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_loop_505_505", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_log_507_507", + "kind": "invokes", + "label": "Logs runtime state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 507, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 507 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_log_507_507_flow_action_nexusreader_web_program_cs_program_top_level_branch_510_510_evaluates-condition_510", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_log_507_507", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_510_510", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 510, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 510 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_510_510_flow_action_nexusreader_web_program_cs_program_top_level_return_512_512_returns_512", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_510_510", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_512_512", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 512, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 512 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_return_512_512_flow_action_nexusreader_web_program_cs_program_top_level_log_516_516_invokes_516", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_return_512_512", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_log_516_516", + "kind": "invokes", + "label": "Logs runtime state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 516, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 516 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_log_516_516_flow_action_nexusreader_web_program_cs_program_top_level_return_517_517_returns_517", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_log_516_516", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_517_517", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 517, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 517 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_return_517_517_flow_action_nexusreader_web_program_cs_program_top_level_branch_529_529_evaluates-condition_529", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_return_517_517", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_529_529", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 529, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 529 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_529_529_flow_action_nexusreader_web_program_cs_program_top_level_return_532_532_returns_532", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_529_529", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_532_532", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 532, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 532 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_return_532_532_flow_action_nexusreader_web_program_cs_program_top_level_return_536_536_returns_536", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_return_532_532", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_536_536", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 536, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 536 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_return_536_536_flow_action_nexusreader_web_program_cs_program_top_level_return_545_545_returns_545", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_return_536_536", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_545_545", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 545, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 545 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_return_545_545_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_550_550_invokes_550", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_return_545_545", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_550_550", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 550, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 550 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_550_550_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_551_551_evaluates-condition_551", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_550_550", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_551_551", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 551, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 551 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_551_551_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_554_554_evaluates-condition_554", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_551_551", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_554_554", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 554, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 554 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_554_554_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_554_554_invokes_554", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_554_554", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_554_554", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 554, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 554 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_554_554_flow_action_nexusreader_web_program_cs_program_top_level_return_556_556_returns_556", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_554_554", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_556_556", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 556, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 556 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_flow_method_nexusreader_application_dependencyinjection_cs_addapplication_8_uses-service_78", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "to": "flow_method_nexusreader_application_dependencyinjection_cs_addapplication_8", + "kind": "uses-service", + "label": "AddApplication", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 78, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 78 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_flow_method_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_31_uses-service_79", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "to": "flow_method_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_31", + "kind": "uses-service", + "label": "AddInfrastructure", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 79, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 79 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_237_237_flow_method_nexusreader_infrastructure_realtime_synchub_cs_synchub_14_uses-service_247", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_237_237", + "to": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_synchub_14", + "kind": "uses-service", + "label": "SyncHub", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 247, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 247 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_startupvalidation_scope_check_165_invokes_165", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_method_nexusreader_web_program_cs_startupvalidation_scope_check_165", + "kind": "handles-route", + "label": "StartupValidation (scope check)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 165, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 165 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_web_program_cs_startupvalidation_scope_check_165_flow_action_nexusreader_web_program_cs_startupvalidation_scope_check_branch_169_169_evaluates-condition_169", + "from": "flow_method_nexusreader_web_program_cs_startupvalidation_scope_check_165", + "to": "flow_action_nexusreader_web_program_cs_startupvalidation_scope_check_branch_169_169", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 169, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 169 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_startupvalidation_scope_check_branch_169_169_flow_action_nexusreader_web_program_cs_startupvalidation_scope_check_guard_clause_169_169_evaluates-condition_169", + "from": "flow_action_nexusreader_web_program_cs_startupvalidation_scope_check_branch_169_169", + "to": "flow_action_nexusreader_web_program_cs_startupvalidation_scope_check_guard_clause_169_169", + "kind": "evaluates-condition", + "label": "throw / continue", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 169, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 169 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_startupvalidation_scope_check_guard_clause_169_169_flow_action_nexusreader_web_program_cs_startupvalidation_scope_check_validation_171_171_evaluates-condition_171", + "from": "flow_action_nexusreader_web_program_cs_startupvalidation_scope_check_guard_clause_169_169", + "to": "flow_action_nexusreader_web_program_cs_startupvalidation_scope_check_validation_171_171", + "kind": "evaluates-condition", + "label": "Validates input or state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 171, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 171 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_ensuredatabaseinitialized_175_invokes_175", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_method_nexusreader_web_program_cs_ensuredatabaseinitialized_175", + "kind": "handles-route", + "label": "EnsureDatabaseInitialized", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 175, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 175 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_web_program_cs_ensuredatabaseinitialized_175_flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_loop_186_186_loops-to_186", + "from": "flow_method_nexusreader_web_program_cs_ensuredatabaseinitialized_175", + "to": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_loop_186_186", + "kind": "loops-to", + "label": "int i = 0; i < maxRetries; i++", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 186, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 186 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_loop_186_186_flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_branch_190_190_evaluates-condition_190", + "from": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_loop_186_186", + "to": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_branch_190_190", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 190, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 190 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_branch_190_190_flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_branch_198_198_evaluates-condition_198", + "from": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_branch_190_190", + "to": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_branch_198_198", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 198, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 198 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_branch_198_198_flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_branch_206_206_evaluates-condition_206", + "from": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_branch_198_198", + "to": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_branch_206_206", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 206, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 206 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_branch_206_206_flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_log_206_206_invokes_206", + "from": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_branch_206_206", + "to": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_log_206_206", + "kind": "invokes", + "label": "Logs runtime state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 206, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 206 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_log_206_206_flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_log_208_208_invokes_208", + "from": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_log_206_206", + "to": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_log_208_208", + "kind": "invokes", + "label": "Logs runtime state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 208, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 208 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_log_208_208_flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_branch_216_216_evaluates-condition_216", + "from": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_log_208_208", + "to": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_branch_216_216", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 216, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 216 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_branch_216_216_flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_log_216_216_invokes_216", + "from": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_branch_216_216", + "to": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_log_216_216", + "kind": "invokes", + "label": "Logs runtime state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 216, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 216 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_log_216_216_flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_log_218_218_invokes_218", + "from": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_log_216_216", + "to": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_log_218_218", + "kind": "invokes", + "label": "Logs runtime state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 218, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 218 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_get_api_epub_ebookid_index_249_invokes_249", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_method_nexusreader_web_program_cs_get_api_epub_ebookid_index_249", + "kind": "handles-route", + "label": "GET /api/epub/{ebookId}/{index}", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 249, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 249 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_web_program_cs_get_api_epub_ebookid_index_249_flow_action_nexusreader_web_program_cs_get_api_epub_ebookid_index_guard_clause_252_252_evaluates-condition_252", + "from": "flow_method_nexusreader_web_program_cs_get_api_epub_ebookid_index_249", + "to": "flow_action_nexusreader_web_program_cs_get_api_epub_ebookid_index_guard_clause_252_252", + "kind": "evaluates-condition", + "label": "continue", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 252, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 252 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_get_api_epub_ebookid_index_guard_clause_252_252_flow_action_nexusreader_web_program_cs_get_api_epub_ebookid_index_repository_read_252_252_invokes_252", + "from": "flow_action_nexusreader_web_program_cs_get_api_epub_ebookid_index_guard_clause_252_252", + "to": "flow_action_nexusreader_web_program_cs_get_api_epub_ebookid_index_repository_read_252_252", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 252, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 252 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_get_api_epub_ebookid_index_repository_read_252_252_flow_action_nexusreader_web_program_cs_get_api_epub_ebookid_index_guard_clause_255_255_evaluates-condition_255", + "from": "flow_action_nexusreader_web_program_cs_get_api_epub_ebookid_index_repository_read_252_252", + "to": "flow_action_nexusreader_web_program_cs_get_api_epub_ebookid_index_guard_clause_255_255", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 255, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 255 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_get_api_epub_ebookid_index_guard_clause_255_255_flow_action_nexusreader_web_program_cs_get_api_epub_ebookid_index_branch_255_255_evaluates-condition_255", + "from": "flow_action_nexusreader_web_program_cs_get_api_epub_ebookid_index_guard_clause_255_255", + "to": "flow_action_nexusreader_web_program_cs_get_api_epub_ebookid_index_branch_255_255", + "kind": "evaluates-condition", + "label": "Return Ok on success, BadRequest on failure", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 255, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 255 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_get_api_epub_ebookid_index_branch_255_255_flow_action_nexusreader_web_program_cs_get_api_epub_ebookid_index_return_258_258_returns_258", + "from": "flow_action_nexusreader_web_program_cs_get_api_epub_ebookid_index_branch_255_255", + "to": "flow_action_nexusreader_web_program_cs_get_api_epub_ebookid_index_return_258_258", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 258, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 258 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_265_invokes_265", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_method_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_265", + "kind": "handles-route", + "label": "KnowledgeApi POST /api/knowledge/ (GetKnowledge)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 265, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 265 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_265_flow_action_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_repository_read_267_267_invokes_267", + "from": "flow_method_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_265", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_repository_read_267_267", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 267, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 267 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_repository_read_267_267_flow_action_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_guard_clause_267_267_evaluates-condition_267", + "from": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_repository_read_267_267", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_guard_clause_267_267", + "kind": "evaluates-condition", + "label": "tenantId", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 267, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 267 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_guard_clause_267_267_flow_action_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_guard_clause_269_269_evaluates-condition_269", + "from": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_guard_clause_267_267", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_guard_clause_269_269", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 269, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 269 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_guard_clause_269_269_flow_action_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_branch_269_269_evaluates-condition_269", + "from": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_guard_clause_269_269", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_branch_269_269", + "kind": "evaluates-condition", + "label": "Return Ok or BadRequest based on result.IsSuccess", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 269, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 269 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_branch_269_269_flow_action_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_return_270_270_returns_270", + "from": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_branch_269_269", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_return_270_270", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 270, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 270 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_273_invokes_273", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_method_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_273", + "kind": "handles-route", + "label": "KnowledgeApi POST /graph (GetGraphDataAsync)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 273, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 273 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_273_flow_action_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_repository_read_275_275_invokes_275", + "from": "flow_method_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_273", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_repository_read_275_275", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 275, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 275 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_repository_read_275_275_flow_action_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_guard_clause_277_277_evaluates-condition_277", + "from": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_repository_read_275_275", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_guard_clause_277_277", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 277, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 277 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_guard_clause_277_277_flow_action_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_branch_277_277_evaluates-condition_277", + "from": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_guard_clause_277_277", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_branch_277_277", + "kind": "evaluates-condition", + "label": "Return Ok or BadRequest based on result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 277, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 277 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_branch_277_277_flow_action_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_return_278_278_returns_278", + "from": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_branch_277_277", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_return_278_278", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 278, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 278 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_281_invokes_281", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_method_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_281", + "kind": "handles-route", + "label": "KnowledgeApi POST /summary (GetSummaryAndQuizAsync)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 281, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 281 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_281_flow_action_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_repository_read_283_283_invokes_283", + "from": "flow_method_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_281", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_repository_read_283_283", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 283, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 283 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_repository_read_283_283_flow_action_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_guard_clause_285_285_evaluates-condition_285", + "from": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_repository_read_283_283", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_guard_clause_285_285", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 285, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 285 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_guard_clause_285_285_flow_action_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_branch_285_285_evaluates-condition_285", + "from": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_guard_clause_285_285", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_branch_285_285", + "kind": "evaluates-condition", + "label": "Return Ok or BadRequest based on result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 285, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 285 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_branch_285_285_flow_action_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_return_286_286_returns_286", + "from": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_branch_285_285", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_return_286_286", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 286, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 286 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_289_invokes_289", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_method_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_289", + "kind": "handles-route", + "label": "KnowledgeApi POST /map (GetKnowledgeMapAsync)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 289, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 289 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_289_flow_action_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_repository_read_291_291_invokes_291", + "from": "flow_method_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_289", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_repository_read_291_291", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 291, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 291 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_repository_read_291_291_flow_action_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_guard_clause_293_293_evaluates-condition_293", + "from": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_repository_read_291_291", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_guard_clause_293_293", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 293, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 293 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_guard_clause_293_293_flow_action_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_branch_293_293_evaluates-condition_293", + "from": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_guard_clause_293_293", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_branch_293_293", + "kind": "evaluates-condition", + "label": "Return Ok or BadRequest based on result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 293, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 293 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_branch_293_293_flow_action_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_return_294_294_returns_294", + "from": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_branch_293_293", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_return_294_294", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 294, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 294 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_297_invokes_297", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_method_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_297", + "kind": "handles-route", + "label": "KnowledgeApi POST /verify-groundedness", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 297, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 297 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_297_flow_action_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_repository_read_299_299_invokes_299", + "from": "flow_method_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_297", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_repository_read_299_299", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 299, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 299 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_repository_read_299_299_flow_action_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_guard_clause_301_301_evaluates-condition_301", + "from": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_repository_read_299_299", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_guard_clause_301_301", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 301, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 301 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_guard_clause_301_301_flow_action_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_branch_301_301_evaluates-condition_301", + "from": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_guard_clause_301_301", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_branch_301_301", + "kind": "evaluates-condition", + "label": "Return Ok or BadRequest based on verification result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 301, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 301 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_branch_301_301_flow_action_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_return_302_302_returns_302", + "from": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_branch_301_301", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_return_302_302", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 302, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 302 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_305_invokes_305", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_method_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_305", + "kind": "handles-route", + "label": "KnowledgeApi POST /search (SearchLibrarySemanticallyAsync)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 305, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 305 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_305_flow_action_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_repository_read_307_307_invokes_307", + "from": "flow_method_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_305", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_repository_read_307_307", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 307, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 307 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_repository_read_307_307_flow_action_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_guard_clause_309_309_evaluates-condition_309", + "from": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_repository_read_307_307", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_guard_clause_309_309", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 309, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 309 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_guard_clause_309_309_flow_action_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_branch_309_309_evaluates-condition_309", + "from": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_guard_clause_309_309", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_branch_309_309", + "kind": "evaluates-condition", + "label": "Return Ok or BadRequest based on result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 309, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 309 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_branch_309_309_flow_action_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_return_310_310_returns_310", + "from": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_branch_309_309", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_return_310_310", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 310, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 310 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_313_invokes_313", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_method_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_313", + "kind": "handles-route", + "label": "KnowledgeApi POST /ask (AskQuestionAsync)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 313, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 313 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_313_flow_action_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_repository_read_315_315_invokes_315", + "from": "flow_method_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_313", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_repository_read_315_315", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 315, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 315 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_repository_read_315_315_flow_action_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_guard_clause_317_317_evaluates-condition_317", + "from": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_repository_read_315_315", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_guard_clause_317_317", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 317, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 317 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_guard_clause_317_317_flow_action_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_branch_317_317_evaluates-condition_317", + "from": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_guard_clause_317_317", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_branch_317_317", + "kind": "evaluates-condition", + "label": "Return Ok or BadRequest based on result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 317, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 317 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_branch_317_317_flow_action_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_return_318_318_returns_318", + "from": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_branch_317_317", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_return_318_318", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 318, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 318 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_321_invokes_321", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_method_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_321", + "kind": "handles-route", + "label": "KnowledgeApi DELETE /api/knowledge/ (ClearCacheAsync)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 321, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 321 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_321_flow_action_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_branch_323_323_evaluates-condition_323", + "from": "flow_method_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_321", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_branch_323_323", + "kind": "evaluates-condition", + "label": "Return Ok on success; BadRequest with message on failure", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 323, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 323 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_branch_323_323_flow_action_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_guard_clause_324_324_evaluates-condition_324", + "from": "flow_action_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_branch_323_323", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_guard_clause_324_324", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 324, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 324 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_guard_clause_324_324_flow_action_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_return_327_327_returns_327", + "from": "flow_action_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_guard_clause_324_324", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_return_327_327", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 327, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 327 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_knowledgerequest_566_maps-dto_566", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_type_nexusreader_web_program_cs_knowledgerequest_566", + "kind": "maps-dto", + "label": "dto KnowledgeRequest", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 566, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 566 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_groundednessrequest_567_maps-dto_567", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_type_nexusreader_web_program_cs_groundednessrequest_567", + "kind": "maps-dto", + "label": "dto GroundednessRequest", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 567, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 567 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_semanticsearchrequest_568_maps-dto_568", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_type_nexusreader_web_program_cs_semanticsearchrequest_568", + "kind": "maps-dto", + "label": "dto SemanticSearchRequest", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 568, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 568 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_askquestionrequest_569_maps-dto_569", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_type_nexusreader_web_program_cs_askquestionrequest_569", + "kind": "maps-dto", + "label": "dto AskQuestionRequest", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 569, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 569 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_webplatformservice_47_registers-service_47", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_type_nexusreader_web_program_cs_webplatformservice_47", + "kind": "registers-service", + "label": "IPlatformService", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 47, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 47 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_knowledgecoordinator_55_registers-service_55", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_type_nexusreader_web_program_cs_knowledgecoordinator_55", + "kind": "registers-service", + "label": "KnowledgeCoordinator", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 55, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 55 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_httpclient_configured_with_base_address_58_registers-service_58", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_type_nexusreader_web_program_cs_httpclient_configured_with_base_address_58", + "kind": "registers-service", + "label": "HttpClient (named NexusAPI)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 58, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 58 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_nexusreader_application_assembly_extension_78_registers-service_78", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_type_nexusreader_web_program_cs_nexusreader_application_assembly_extension_78", + "kind": "registers-service", + "label": "Application services", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 78, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 78 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_nexusreader_infrastructure_assembly_extension_79_registers-service_79", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_type_nexusreader_web_program_cs_nexusreader_infrastructure_assembly_extension_79", + "kind": "registers-service", + "label": "Infrastructure services", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 79, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 79 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_identity_with_appdbcontext_107_registers-service_107", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_type_nexusreader_web_program_cs_identity_with_appdbcontext_107", + "kind": "registers-service", + "label": "Identity endpoints and EF stores", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 107, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 107 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_usehangfiredashboard_163_configures-pipeline_163", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_method_nexusreader_web_program_cs_usehangfiredashboard_163", + "kind": "configures-pipeline", + "label": "middleware", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 163, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 163 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_configure_request_pipeline_routing_auth_antiforgery_static_assets_hubs_225_configures-pipeline_225", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_method_nexusreader_web_program_cs_configure_request_pipeline_routing_auth_antiforgery_static_assets_hubs_225", + "kind": "configures-pipeline", + "label": "middleware", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 225, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 225 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_application_dtos_user_authordto_cs_file_1_flow_type_nexusreader_application_dtos_user_authordto_cs_authordto_3_maps-dto_3", + "from": "flow_file_nexusreader_application_dtos_user_authordto_cs_file_1", + "to": "flow_type_nexusreader_application_dtos_user_authordto_cs_authordto_3", + "kind": "maps-dto", + "label": "dto AuthorDto", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/DTOs/User/AuthorDto.cs", + "sourceLine": 3, + "evidencePaths": [ + "NexusReader.Application/DTOs/User/AuthorDto.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/DTOs/User/AuthorDto.cs", + "line": 3 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_application_security_authorization_prouserhandler_cs_file_1_flow_method_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_20_invokes_20", + "from": "flow_file_nexusreader_application_security_authorization_prouserhandler_cs_file_1", + "to": "flow_method_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_20", + "kind": "invokes", + "label": "HandleRequirementAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 20, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 20 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_20_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_guard_clause_24_24_evaluates-condition_24", + "from": "flow_method_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_20", + "to": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_guard_clause_24_24", + "kind": "evaluates-condition", + "label": "return (no auth decision)", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 24, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 24 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_guard_clause_24_24_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_repository_read_24_24_invokes_24", + "from": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_guard_clause_24_24", + "to": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_repository_read_24_24", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 24, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 24 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_repository_read_24_24_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_25_25_evaluates-condition_25", + "from": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_repository_read_24_24", + "to": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_25_25", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 25, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 25 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_25_25_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_return_27_27_returns_27", + "from": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_25_25", + "to": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_return_27_27", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 27, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 27 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_return_27_27_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_35_35_evaluates-condition_35", + "from": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_return_27_27", + "to": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_35_35", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 35, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 35 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_35_35_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_guard_clause_35_35_evaluates-condition_35", + "from": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_35_35", + "to": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_guard_clause_35_35", + "kind": "evaluates-condition", + "label": "return (no auth decision)", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 35, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 35 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_guard_clause_35_35_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_return_37_37_returns_37", + "from": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_guard_clause_35_35", + "to": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_return_37_37", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 37, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 37 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_return_37_37_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_40_40_evaluates-condition_40", + "from": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_return_37_37", + "to": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_40_40", + "kind": "evaluates-condition", + "label": "succeed requirement / continue", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 40, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 40 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_40_40_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_41_41_evaluates-condition_41", + "from": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_40_40", + "to": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_41_41", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 41, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 41 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_41_41_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_repository_read_43_43_invokes_43", + "from": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_41_41", + "to": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_repository_read_43_43", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 43, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 43 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_repository_read_43_43_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_return_44_44_returns_44", + "from": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_repository_read_43_43", + "to": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_return_44_44", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 44, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 44 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_return_44_44_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_47_47_evaluates-condition_47", + "from": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_return_44_44", + "to": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_47_47", + "kind": "evaluates-condition", + "label": "succeed requirement / deny/continue", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 47, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 47 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_47_47_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_48_48_evaluates-condition_48", + "from": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_47_47", + "to": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_48_48", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 48, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 48 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_48_48_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_repository_read_50_50_invokes_50", + "from": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_48_48", + "to": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_repository_read_50_50", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 50, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 50 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_repository_read_50_50_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_return_51_51_returns_51", + "from": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_repository_read_50_50", + "to": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_return_51_51", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 51, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 51 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_application_security_authorization_prouserhandler_cs_file_1_flow_type_nexusreader_application_security_authorization_prouserhandler_cs_prouserhandler_11_defines-type_11", + "from": "flow_file_nexusreader_application_security_authorization_prouserhandler_cs_file_1", + "to": "flow_type_nexusreader_application_security_authorization_prouserhandler_cs_prouserhandler_11", + "kind": "defines-type", + "label": "model ProUserHandler", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 11, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 11 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_application_security_authorization_prouserrequirement_cs_file_1_flow_type_nexusreader_application_security_authorization_prouserrequirement_cs_prouserrequirement_8_defines-type_8", + "from": "flow_file_nexusreader_application_security_authorization_prouserrequirement_cs_file_1", + "to": "flow_type_nexusreader_application_security_authorization_prouserrequirement_cs_prouserrequirement_8", + "kind": "defines-type", + "label": "model ProUserRequirement", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "sourceLine": 8, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserRequirement.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "line": 8 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_domain_entities_author_cs_file_1_flow_type_nexusreader_domain_entities_author_cs_author_5_reads-entity_5", + "from": "flow_file_nexusreader_domain_entities_author_cs_file_1", + "to": "flow_type_nexusreader_domain_entities_author_cs_author_5", + "kind": "reads-entity", + "label": "entity Author", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Domain/Entities/Author.cs", + "sourceLine": 5, + "evidencePaths": [ + "NexusReader.Domain/Entities/Author.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Domain/Entities/Author.cs", + "line": 5 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_ui_shared_layout_authlayout_razor_file_1_flow_method_nexusreader_ui_shared_layout_authlayout_razor_authlayout_render_markup_1_invokes_1", + "from": "flow_file_nexusreader_ui_shared_layout_authlayout_razor_file_1", + "to": "flow_method_nexusreader_ui_shared_layout_authlayout_razor_authlayout_render_markup_1", + "kind": "invokes", + "label": "AuthLayout (render/markup)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.UI.Shared/Layout/AuthLayout.razor", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.UI.Shared/Layout/AuthLayout.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Layout/AuthLayout.razor", + "line": 1 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_handlers_authenticationheaderhandler_cs_file_1_flow_method_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_27_invokes_27", + "from": "flow_file_nexusreader_web_client_handlers_authenticationheaderhandler_cs_file_1", + "to": "flow_method_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_27", + "kind": "invokes", + "label": "SendAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 27, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 27 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_27_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_external_call_27_27_invokes_27", + "from": "flow_method_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_27", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_external_call_27_27", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 27, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 27 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_external_call_27_27_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_32_32_evaluates-condition_32", + "from": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_external_call_27_27", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_32_32", + "kind": "evaluates-condition", + "label": "isAuthEndpoint / notAuthEndpoint", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 32, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 32 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_32_32_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_39_39_evaluates-condition_39", + "from": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_32_32", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_39_39", + "kind": "evaluates-condition", + "label": "isTrustedHost / untrusted", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 39, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 39 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_39_39_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_guard_clause_45_45_evaluates-condition_45", + "from": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_39_39", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_guard_clause_45_45", + "kind": "evaluates-condition", + "label": "attached / skipped", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 45, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 45 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_guard_clause_45_45_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_45_45_evaluates-condition_45", + "from": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_guard_clause_45_45", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_45_45", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 45, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 45 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_45_45_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_48_48_evaluates-condition_48", + "from": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_45_45", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_48_48", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 48, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 48 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_48_48_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_external_call_55_55_invokes_55", + "from": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_48_48", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_external_call_55_55", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 55, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 55 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_external_call_55_55_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_58_58_evaluates-condition_58", + "from": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_external_call_55_55", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_58_58", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 58, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 58 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_58_58_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_guard_clause_69_69_evaluates-condition_69", + "from": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_58_58", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_guard_clause_69_69", + "kind": "evaluates-condition", + "label": "alreadyRefreshed / needsRefresh", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 69, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 69 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_guard_clause_69_69_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_69_69_evaluates-condition_69", + "from": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_guard_clause_69_69", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_69_69", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 69, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 69 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_69_69_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_fallback_73_73_falls-back_73", + "from": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_69_69", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_fallback_73_73", + "kind": "falls-back", + "label": "fallback", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 73, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 73 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_fallback_73_73_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_79_79_evaluates-condition_79", + "from": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_fallback_73_73", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_79_79", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 79, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 79 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_79_79_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_fallback_85_85_falls-back_85", + "from": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_79_79", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_fallback_85_85", + "kind": "falls-back", + "label": "fallback", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 85, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 85 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_fallback_85_85_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_fallback_85_85_falls-back_85", + "from": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_fallback_85_85", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_fallback_85_85", + "kind": "falls-back", + "label": "Logout on failed refresh", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 85, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 85 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_fallback_85_85_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_91_91_evaluates-condition_91", + "from": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_fallback_85_85", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_91_91", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 91, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 91 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_91_91_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_retry_91_91_retries_91", + "from": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_91_91", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_retry_91_91", + "kind": "retries", + "label": "Retry original request with new token", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 91, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 91 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_retry_91_91_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_external_call_95_95_invokes_95", + "from": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_retry_91_91", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_external_call_95_95", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 95, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 95 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_external_call_95_95_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_return_95_95_returns_95", + "from": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_external_call_95_95", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_return_95_95", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 95, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 95 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_return_95_95_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_return_109_109_returns_109", + "from": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_return_95_95", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_return_109_109", + "kind": "returns", + "label": "Return response", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 109, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 109 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_return_109_109_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_return_109_109_returns_109", + "from": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_return_109_109", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_return_109_109", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 109, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 109 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_handlers_authenticationheaderhandler_cs_file_1_flow_method_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_112_invokes_112", + "from": "flow_file_nexusreader_web_client_handlers_authenticationheaderhandler_cs_file_1", + "to": "flow_method_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_112", + "kind": "invokes", + "label": "CloneHttpRequestMessageAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 112, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 112 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_112_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_branch_119_119_evaluates-condition_119", + "from": "flow_method_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_112", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_branch_119_119", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 119, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 119 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_branch_119_119_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_loop_126_126_loops-to_126", + "from": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_branch_119_119", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_loop_126_126", + "kind": "loops-to", + "label": "var h in req.Content.Headers", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 126, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 126 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_loop_126_126_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_loop_132_132_loops-to_132", + "from": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_loop_126_126", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_loop_132_132", + "kind": "loops-to", + "label": "var h in req.Headers", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 132, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 132 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_loop_132_132_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_return_139_139_returns_139", + "from": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_loop_132_132", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_return_139_139", + "kind": "returns", + "label": "Return cloned request", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 139, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 139 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_return_139_139_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_return_139_139_returns_139", + "from": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_return_139_139", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_return_139_139", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 139, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 139 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_handlers_authenticationheaderhandler_cs_file_1_flow_type_nexusreader_web_client_handlers_authenticationheaderhandler_cs_authenticationheaderhandler_14_defines-type_14", + "from": "flow_file_nexusreader_web_client_handlers_authenticationheaderhandler_cs_file_1", + "to": "flow_type_nexusreader_web_client_handlers_authenticationheaderhandler_cs_authenticationheaderhandler_14", + "kind": "defines-type", + "label": "model AuthenticationHeaderHandler", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 14, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 14 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_ui_shared_pages_account_login_razor_file_1_flow_method_nexusreader_ui_shared_pages_account_login_razor_oninitialized_110_invokes_110", + "from": "flow_file_nexusreader_ui_shared_pages_account_login_razor_file_1", + "to": "flow_method_nexusreader_ui_shared_pages_account_login_razor_oninitialized_110", + "kind": "invokes", + "label": "OnInitialized", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourceLine": 110, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Login.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "line": 110 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_ui_shared_pages_account_login_razor_oninitialized_110_flow_action_nexusreader_ui_shared_pages_account_login_razor_oninitialized_branch_112_112_evaluates-condition_112", + "from": "flow_method_nexusreader_ui_shared_pages_account_login_razor_oninitialized_110", + "to": "flow_action_nexusreader_ui_shared_pages_account_login_razor_oninitialized_branch_112_112", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourceLine": 112, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Login.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "line": 112 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_ui_shared_pages_account_login_razor_oninitialized_branch_112_112_flow_action_nexusreader_ui_shared_pages_account_login_razor_oninitialized_guard_clause_112_112_evaluates-condition_112", + "from": "flow_action_nexusreader_ui_shared_pages_account_login_razor_oninitialized_branch_112_112", + "to": "flow_action_nexusreader_ui_shared_pages_account_login_razor_oninitialized_guard_clause_112_112", + "kind": "evaluates-condition", + "label": "set _errorMessage / no-op", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourceLine": 112, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Login.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "line": 112 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_ui_shared_pages_account_login_razor_oninitialized_guard_clause_112_112_flow_action_nexusreader_ui_shared_pages_account_login_razor_oninitialized_branch_114_114_evaluates-condition_114", + "from": "flow_action_nexusreader_ui_shared_pages_account_login_razor_oninitialized_guard_clause_112_112", + "to": "flow_action_nexusreader_ui_shared_pages_account_login_razor_oninitialized_branch_114_114", + "kind": "evaluates-condition", + "label": "Map specific error codes to localized messages", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourceLine": 114, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Login.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "line": 114 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_ui_shared_pages_account_login_razor_file_1_flow_method_nexusreader_ui_shared_pages_account_login_razor_handlelogin_126_invokes_126", + "from": "flow_file_nexusreader_ui_shared_pages_account_login_razor_file_1", + "to": "flow_method_nexusreader_ui_shared_pages_account_login_razor_handlelogin_126", + "kind": "invokes", + "label": "HandleLogin", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourceLine": 126, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Login.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "line": 126 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_ui_shared_pages_account_login_razor_handlelogin_126_flow_action_nexusreader_ui_shared_pages_account_login_razor_handlelogin_branch_134_134_evaluates-condition_134", + "from": "flow_method_nexusreader_ui_shared_pages_account_login_razor_handlelogin_126", + "to": "flow_action_nexusreader_ui_shared_pages_account_login_razor_handlelogin_branch_134_134", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourceLine": 134, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Login.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "line": 134 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_ui_shared_pages_account_login_razor_handlelogin_branch_134_134_flow_action_nexusreader_ui_shared_pages_account_login_razor_handlelogin_fallback_139_139_falls-back_139", + "from": "flow_action_nexusreader_ui_shared_pages_account_login_razor_handlelogin_branch_134_134", + "to": "flow_action_nexusreader_ui_shared_pages_account_login_razor_handlelogin_fallback_139_139", + "kind": "falls-back", + "label": "fallback", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourceLine": 139, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Login.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "line": 139 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_ui_shared_pages_account_login_razor_handlelogin_fallback_139_139_flow_action_nexusreader_ui_shared_pages_account_login_razor_handlelogin_repository_read_141_141_invokes_141", + "from": "flow_action_nexusreader_ui_shared_pages_account_login_razor_handlelogin_fallback_139_139", + "to": "flow_action_nexusreader_ui_shared_pages_account_login_razor_handlelogin_repository_read_141_141", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourceLine": 141, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Login.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "line": 141 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_ui_shared_pages_account_login_razor_file_1_flow_method_nexusreader_ui_shared_pages_account_login_razor_handlegooglelogin_154_invokes_154", + "from": "flow_file_nexusreader_ui_shared_pages_account_login_razor_file_1", + "to": "flow_method_nexusreader_ui_shared_pages_account_login_razor_handlegooglelogin_154", + "kind": "invokes", + "label": "HandleGoogleLogin", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourceLine": 154, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Login.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "line": 154 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_ui_shared_pages_account_login_razor_file_1_flow_type_nexusreader_ui_shared_pages_account_login_razor_loginmodel_157_maps-dto_157", + "from": "flow_file_nexusreader_ui_shared_pages_account_login_razor_file_1", + "to": "flow_type_nexusreader_ui_shared_pages_account_login_razor_loginmodel_157", + "kind": "maps-dto", + "label": "dto LoginModel", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourceLine": 157, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Login.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "line": 157 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_ui_shared_pages_account_profile_razor_file_1_flow_method_nexusreader_ui_shared_pages_account_profile_razor_oninitializedasync_111_invokes_111", + "from": "flow_file_nexusreader_ui_shared_pages_account_profile_razor_file_1", + "to": "flow_method_nexusreader_ui_shared_pages_account_profile_razor_oninitializedasync_111", + "kind": "invokes", + "label": "OnInitializedAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.UI.Shared/Pages/Account/Profile.razor", + "sourceLine": 111, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Profile.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "line": 111 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_ui_shared_pages_account_profile_razor_oninitializedasync_111_flow_action_nexusreader_ui_shared_pages_account_profile_razor_oninitializedasync_branch_114_114_evaluates-condition_114", + "from": "flow_method_nexusreader_ui_shared_pages_account_profile_razor_oninitializedasync_111", + "to": "flow_action_nexusreader_ui_shared_pages_account_profile_razor_oninitializedasync_branch_114_114", + "kind": "evaluates-condition", + "label": "set _profile / skip", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.UI.Shared/Pages/Account/Profile.razor", + "sourceLine": 114, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Profile.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "line": 114 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_ui_shared_pages_account_profile_razor_file_1_flow_method_nexusreader_ui_shared_pages_account_profile_razor_calculateprogress_121_invokes_121", + "from": "flow_file_nexusreader_ui_shared_pages_account_profile_razor_file_1", + "to": "flow_method_nexusreader_ui_shared_pages_account_profile_razor_calculateprogress_121", + "kind": "invokes", + "label": "CalculateProgress", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.UI.Shared/Pages/Account/Profile.razor", + "sourceLine": 121, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Profile.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "line": 121 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_ui_shared_pages_account_profile_razor_calculateprogress_121_flow_action_nexusreader_ui_shared_pages_account_profile_razor_calculateprogress_guard_clause_123_123_evaluates-condition_123", + "from": "flow_method_nexusreader_ui_shared_pages_account_profile_razor_calculateprogress_121", + "to": "flow_action_nexusreader_ui_shared_pages_account_profile_razor_calculateprogress_guard_clause_123_123", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.UI.Shared/Pages/Account/Profile.razor", + "sourceLine": 123, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Profile.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "line": 123 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_ui_shared_pages_account_profile_razor_calculateprogress_guard_clause_123_123_flow_action_nexusreader_ui_shared_pages_account_profile_razor_calculateprogress_return_125_125_returns_125", + "from": "flow_action_nexusreader_ui_shared_pages_account_profile_razor_calculateprogress_guard_clause_123_123", + "to": "flow_action_nexusreader_ui_shared_pages_account_profile_razor_calculateprogress_return_125_125", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.UI.Shared/Pages/Account/Profile.razor", + "sourceLine": 125, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Profile.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "line": 125 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_ui_shared_pages_account_profile_razor_file_1_flow_method_nexusreader_ui_shared_pages_account_profile_razor_handlelogout_133_invokes_133", + "from": "flow_file_nexusreader_ui_shared_pages_account_profile_razor_file_1", + "to": "flow_method_nexusreader_ui_shared_pages_account_profile_razor_handlelogout_133", + "kind": "invokes", + "label": "HandleLogout", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.UI.Shared/Pages/Account/Profile.razor", + "sourceLine": 133, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Profile.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "line": 133 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_ui_shared_pages_account_register_razor_file_1_flow_method_nexusreader_ui_shared_pages_account_register_razor_handleregister_84_invokes_84", + "from": "flow_file_nexusreader_ui_shared_pages_account_register_razor_file_1", + "to": "flow_method_nexusreader_ui_shared_pages_account_register_razor_handleregister_84", + "kind": "invokes", + "label": "HandleRegister", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.UI.Shared/Pages/Account/Register.razor", + "sourceLine": 84, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Register.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "line": 84 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_ui_shared_pages_account_register_razor_handleregister_84_flow_action_nexusreader_ui_shared_pages_account_register_razor_handleregister_branch_92_92_evaluates-condition_92", + "from": "flow_method_nexusreader_ui_shared_pages_account_register_razor_handleregister_84", + "to": "flow_action_nexusreader_ui_shared_pages_account_register_razor_handleregister_branch_92_92", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.UI.Shared/Pages/Account/Register.razor", + "sourceLine": 92, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Register.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "line": 92 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_ui_shared_pages_account_register_razor_handleregister_branch_92_92_flow_action_nexusreader_ui_shared_pages_account_register_razor_handleregister_branch_95_95_evaluates-condition_95", + "from": "flow_action_nexusreader_ui_shared_pages_account_register_razor_handleregister_branch_92_92", + "to": "flow_action_nexusreader_ui_shared_pages_account_register_razor_handleregister_branch_95_95", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.UI.Shared/Pages/Account/Register.razor", + "sourceLine": 95, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Register.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "line": 95 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_ui_shared_pages_account_register_razor_handleregister_branch_95_95_flow_action_nexusreader_ui_shared_pages_account_register_razor_handleregister_fallback_100_100_falls-back_100", + "from": "flow_action_nexusreader_ui_shared_pages_account_register_razor_handleregister_branch_95_95", + "to": "flow_action_nexusreader_ui_shared_pages_account_register_razor_handleregister_fallback_100_100", + "kind": "falls-back", + "label": "fallback", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.UI.Shared/Pages/Account/Register.razor", + "sourceLine": 100, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Register.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "line": 100 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_ui_shared_pages_account_register_razor_handleregister_fallback_100_100_flow_action_nexusreader_ui_shared_pages_account_register_razor_handleregister_fallback_105_105_falls-back_105", + "from": "flow_action_nexusreader_ui_shared_pages_account_register_razor_handleregister_fallback_100_100", + "to": "flow_action_nexusreader_ui_shared_pages_account_register_razor_handleregister_fallback_105_105", + "kind": "falls-back", + "label": "fallback", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.UI.Shared/Pages/Account/Register.razor", + "sourceLine": 105, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Register.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "line": 105 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_ui_shared_pages_account_register_razor_handleregister_fallback_105_105_flow_action_nexusreader_ui_shared_pages_account_register_razor_handleregister_repository_read_107_107_invokes_107", + "from": "flow_action_nexusreader_ui_shared_pages_account_register_razor_handleregister_fallback_105_105", + "to": "flow_action_nexusreader_ui_shared_pages_account_register_razor_handleregister_repository_read_107_107", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.UI.Shared/Pages/Account/Register.razor", + "sourceLine": 107, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Register.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "line": 107 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_ui_shared_pages_account_register_razor_file_1_flow_type_nexusreader_ui_shared_pages_account_register_razor_registermodel_120_maps-dto_120", + "from": "flow_file_nexusreader_ui_shared_pages_account_register_razor_file_1", + "to": "flow_type_nexusreader_ui_shared_pages_account_register_razor_registermodel_120", + "kind": "maps-dto", + "label": "dto RegisterModel", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.UI.Shared/Pages/Account/Register.razor", + "sourceLine": 120, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Register.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "line": 120 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_application_abstractions_messaging_icommand_cs_file_1_flow_type_nexusreader_application_abstractions_messaging_icommand_cs_icommand_6_defines-type_6", + "from": "flow_file_nexusreader_application_abstractions_messaging_icommand_cs_file_1", + "to": "flow_type_nexusreader_application_abstractions_messaging_icommand_cs_icommand_6", + "kind": "defines-type", + "label": "interface ICommand", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "sourceLine": 6, + "evidencePaths": [ + "NexusReader.Application/Abstractions/Messaging/ICommand.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "line": 6 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_application_abstractions_messaging_icommand_cs_file_1_flow_type_nexusreader_application_abstractions_messaging_icommand_cs_icommand_tresponse_10_defines-type_10", + "from": "flow_file_nexusreader_application_abstractions_messaging_icommand_cs_file_1", + "to": "flow_type_nexusreader_application_abstractions_messaging_icommand_cs_icommand_tresponse_10", + "kind": "defines-type", + "label": "interface ICommand", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "sourceLine": 10, + "evidencePaths": [ + "NexusReader.Application/Abstractions/Messaging/ICommand.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "line": 10 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_application_abstractions_messaging_icommandhandler_cs_file_1_flow_type_nexusreader_application_abstractions_messaging_icommandhandler_cs_icommandhandler_tcommand_6_defines-type_6", + "from": "flow_file_nexusreader_application_abstractions_messaging_icommandhandler_cs_file_1", + "to": "flow_type_nexusreader_application_abstractions_messaging_icommandhandler_cs_icommandhandler_tcommand_6", + "kind": "defines-type", + "label": "interface ICommandHandler", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "sourceLine": 6, + "evidencePaths": [ + "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "line": 6 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_application_abstractions_messaging_icommandhandler_cs_file_1_flow_type_nexusreader_application_abstractions_messaging_icommandhandler_cs_icommandhandler_tcommand_tresponse_11_defines-type_11", + "from": "flow_file_nexusreader_application_abstractions_messaging_icommandhandler_cs_file_1", + "to": "flow_type_nexusreader_application_abstractions_messaging_icommandhandler_cs_icommandhandler_tcommand_tresponse_11", + "kind": "defines-type", + "label": "interface ICommandHandler", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "sourceLine": 11, + "evidencePaths": [ + "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "line": 11 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_application_abstractions_messaging_iquery_cs_file_1_flow_type_nexusreader_application_abstractions_messaging_iquery_cs_iquery_tresponse_6_defines-type_6", + "from": "flow_file_nexusreader_application_abstractions_messaging_iquery_cs_file_1", + "to": "flow_type_nexusreader_application_abstractions_messaging_iquery_cs_iquery_tresponse_6", + "kind": "defines-type", + "label": "interface IQuery", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "sourceLine": 6, + "evidencePaths": [ + "NexusReader.Application/Abstractions/Messaging/IQuery.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "line": 6 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_application_dependencyinjection_cs_file_1_flow_method_nexusreader_application_dependencyinjection_cs_addapplication_8_invokes_8", + "from": "flow_file_nexusreader_application_dependencyinjection_cs_file_1", + "to": "flow_method_nexusreader_application_dependencyinjection_cs_addapplication_8", + "kind": "invokes", + "label": "AddApplication", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/DependencyInjection.cs", + "sourceLine": 8, + "evidencePaths": [ + "NexusReader.Application/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/DependencyInjection.cs", + "line": 8 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_application_dependencyinjection_cs_addapplication_8_flow_action_nexusreader_application_dependencyinjection_cs_addapplication_return_13_13_returns_13", + "from": "flow_method_nexusreader_application_dependencyinjection_cs_addapplication_8", + "to": "flow_action_nexusreader_application_dependencyinjection_cs_addapplication_return_13_13", + "kind": "returns", + "label": "Return IServiceCollection", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/DependencyInjection.cs", + "sourceLine": 13, + "evidencePaths": [ + "NexusReader.Application/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/DependencyInjection.cs", + "line": 13 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_application_dependencyinjection_cs_addapplication_return_13_13_flow_action_nexusreader_application_dependencyinjection_cs_addapplication_return_13_13_returns_13", + "from": "flow_action_nexusreader_application_dependencyinjection_cs_addapplication_return_13_13", + "to": "flow_action_nexusreader_application_dependencyinjection_cs_addapplication_return_13_13", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/DependencyInjection.cs", + "sourceLine": 13, + "evidencePaths": [ + "NexusReader.Application/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/DependencyInjection.cs", + "line": 13 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_application_dependencyinjection_cs_file_1_flow_type_nexusreader_application_dependencyinjection_cs_configured_via_addmapsterconfiguration_extension_10_registers-service_10", + "from": "flow_file_nexusreader_application_dependencyinjection_cs_file_1", + "to": "flow_type_nexusreader_application_dependencyinjection_cs_configured_via_addmapsterconfiguration_extension_10", + "kind": "registers-service", + "label": "Mapster configuration / mapping profiles", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/DependencyInjection.cs", + "sourceLine": 10, + "evidencePaths": [ + "NexusReader.Application/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/DependencyInjection.cs", + "line": 10 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_application_dependencyinjection_cs_file_1_flow_type_nexusreader_application_dependencyinjection_cs_handlers_discovered_in_this_assembly_11_registers-service_11", + "from": "flow_file_nexusreader_application_dependencyinjection_cs_file_1", + "to": "flow_type_nexusreader_application_dependencyinjection_cs_handlers_discovered_in_this_assembly_11", + "kind": "registers-service", + "label": "MediatR handlers (from this assembly)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/DependencyInjection.cs", + "sourceLine": 11, + "evidencePaths": [ + "NexusReader.Application/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/DependencyInjection.cs", + "line": 11 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1_flow_method_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_31_invokes_31", + "from": "flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_31", + "kind": "invokes", + "label": "AddInfrastructure", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 31, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 31 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_31_flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_33_33_evaluates-condition_33", + "from": "flow_method_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_31", + "to": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_33_33", + "kind": "evaluates-condition", + "label": "Selects DB provider", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 33, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 33 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_33_33_flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_34_34_evaluates-condition_34", + "from": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_33_33", + "to": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_34_34", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 34, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 34 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_34_34_flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_fallback_44_44_falls-back_44", + "from": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_34_34", + "to": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_fallback_44_44", + "kind": "falls-back", + "label": "fallback", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 44, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 44 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_fallback_44_44_flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_64_64_evaluates-condition_64", + "from": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_fallback_44_44", + "to": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_64_64", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 64, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 64 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_64_64_flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_76_76_evaluates-condition_76", + "from": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_64_64", + "to": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_76_76", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 76, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 76 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_76_76_flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_return_134_134_returns_134", + "from": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_76_76", + "to": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_return_134_134", + "kind": "returns", + "label": "Returns IServiceCollection", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 134, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 134 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_return_134_134_flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_return_134_134_returns_134", + "from": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_return_134_134", + "to": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_return_134_134", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 134, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 134 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_76_76_flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1_uses-service_112", + "from": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_76_76", + "to": "flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1", + "kind": "uses-service", + "label": "KnowledgeService (implementation)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 112, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 112 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_76_76_flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1_uses-service_113", + "from": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_76_76", + "to": "flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1", + "kind": "uses-service", + "label": "EpubReaderService (implementation)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 113, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 113 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_76_76_flow_file_nexusreader_infrastructure_services_epubmetadataextractor_cs_file_1_uses-service_114", + "from": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_76_76", + "to": "flow_file_nexusreader_infrastructure_services_epubmetadataextractor_cs_file_1", + "kind": "uses-service", + "label": "EpubMetadataExtractor (implementation)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 114, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 114 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_76_76_flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1_uses-service_118", + "from": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_76_76", + "to": "flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1", + "kind": "uses-service", + "label": "BookStorageService (implementation)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 118, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 118 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_76_76_flow_file_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_file_1_calls-external_124", + "from": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_76_76", + "to": "flow_file_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_file_1", + "kind": "calls-external", + "label": "SignalRSyncBroadcaster (implementation)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 124, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 124 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1_flow_method_nexusreader_infrastructure_dependencyinjection_cs_assembly_137_invokes_137", + "from": "flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_dependencyinjection_cs_assembly_137", + "kind": "invokes", + "label": "Assembly", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 137, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 137 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_dependencyinjection_cs_assembly_137_flow_action_nexusreader_infrastructure_dependencyinjection_cs_assembly_return_137_137_returns_137", + "from": "flow_method_nexusreader_infrastructure_dependencyinjection_cs_assembly_137", + "to": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_assembly_return_137_137", + "kind": "returns", + "label": "Return assembly", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 137, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 137 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1_flow_type_nexusreader_infrastructure_dependencyinjection_cs_iinfrastructuremarker_140_defines-type_140", + "from": "flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1", + "to": "flow_type_nexusreader_infrastructure_dependencyinjection_cs_iinfrastructuremarker_140", + "kind": "defines-type", + "label": "interface IInfrastructureMarker", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 140, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 140 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1_flow_type_nexusreader_infrastructure_dependencyinjection_cs_infrastructuremarker_141_defines-type_141", + "from": "flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1", + "to": "flow_type_nexusreader_infrastructure_dependencyinjection_cs_infrastructuremarker_141", + "kind": "defines-type", + "label": "model InfrastructureMarker", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 141, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 141 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1_flow_type_nexusreader_infrastructure_dependencyinjection_cs_appdbcontext_36_registers-service_36", + "from": "flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1", + "to": "flow_type_nexusreader_infrastructure_dependencyinjection_cs_appdbcontext_36", + "kind": "registers-service", + "label": "AppDbContext (DbContextFactory)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 36, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 36 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1_flow_type_nexusreader_infrastructure_dependencyinjection_cs_appdbcontext_41_registers-service_41", + "from": "flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1", + "to": "flow_type_nexusreader_infrastructure_dependencyinjection_cs_appdbcontext_41", + "kind": "registers-service", + "label": "AppDbContext (DbContext)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 41, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 41 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1_flow_type_nexusreader_infrastructure_dependencyinjection_cs_appdbcontext_47_registers-service_47", + "from": "flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1", + "to": "flow_type_nexusreader_infrastructure_dependencyinjection_cs_appdbcontext_47", + "kind": "registers-service", + "label": "AppDbContext (DbContextFactory)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 47, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 47 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1_flow_type_nexusreader_infrastructure_dependencyinjection_cs_appdbcontext_51_registers-service_51", + "from": "flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1", + "to": "flow_type_nexusreader_infrastructure_dependencyinjection_cs_appdbcontext_51", + "kind": "registers-service", + "label": "AppDbContext (DbContext)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 51, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 51 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1_flow_type_nexusreader_infrastructure_dependencyinjection_cs_qdrantclient_57_registers-service_57", + "from": "flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1", + "to": "flow_type_nexusreader_infrastructure_dependencyinjection_cs_qdrantclient_57", + "kind": "registers-service", + "label": "QdrantClient", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 57, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 57 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1_flow_type_nexusreader_infrastructure_dependencyinjection_cs_neo4j_driver_graphdatabase_driver_61_registers-service_61", + "from": "flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1", + "to": "flow_type_nexusreader_infrastructure_dependencyinjection_cs_neo4j_driver_graphdatabase_driver_61", + "kind": "registers-service", + "label": "IDriver", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 61, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 61 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1_flow_type_nexusreader_infrastructure_dependencyinjection_cs_hangfire_postgres_storage_66_registers-service_66", + "from": "flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1", + "to": "flow_type_nexusreader_infrastructure_dependencyinjection_cs_hangfire_postgres_storage_66", + "kind": "registers-service", + "label": "Hangfire (storage/server)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 66, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 66 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1_flow_type_nexusreader_infrastructure_dependencyinjection_cs_geminichatclient_99_registers-service_99", + "from": "flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1", + "to": "flow_type_nexusreader_infrastructure_dependencyinjection_cs_geminichatclient_99", + "kind": "registers-service", + "label": "ChatClient / GeminiChatClient", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 99, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 99 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1_flow_type_nexusreader_infrastructure_dependencyinjection_cs_geminiembeddinggenerator_105_registers-service_105", + "from": "flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1", + "to": "flow_type_nexusreader_infrastructure_dependencyinjection_cs_geminiembeddinggenerator_105", + "kind": "registers-service", + "label": "EmbeddingGenerator / GeminiEmbeddingGenerator", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 105, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 105 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1_flow_type_nexusreader_infrastructure_dependencyinjection_cs_knowledgeservice_112_registers-service_112", + "from": "flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1", + "to": "flow_type_nexusreader_infrastructure_dependencyinjection_cs_knowledgeservice_112", + "kind": "registers-service", + "label": "IKnowledgeService", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 112, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 112 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1_flow_method_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_19_invokes_19", + "from": "flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_19", + "kind": "handles-route", + "label": "UpdateProgress", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 19, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 19 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_19_flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_repository_read_21_21_invokes_21", + "from": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_19", + "to": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_repository_read_21_21", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 21, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 21 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_repository_read_21_21_flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_guard_clause_21_21_evaluates-condition_21", + "from": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_repository_read_21_21", + "to": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_guard_clause_21_21", + "kind": "evaluates-condition", + "label": "forward command / no-op", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 21, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 21 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_guard_clause_21_21_flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_branch_22_22_evaluates-condition_22", + "from": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_guard_clause_21_21", + "to": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_branch_22_22", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 22, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 22 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_branch_22_22_flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_repository_read_24_24_invokes_24", + "from": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_branch_22_22", + "to": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_repository_read_24_24", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 24, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 24 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_repository_read_24_24_flow_file_nexusreader_application_commands_sync_updatereadingprogresscommand_cs_file_1_dispatches-command_24", + "from": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_repository_read_24_24", + "to": "flow_file_nexusreader_application_commands_sync_updatereadingprogresscommand_cs_file_1", + "kind": "dispatches-command", + "label": "UpdateReadingProgressCommand (ctor)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 24, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 24 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1_flow_method_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_28_invokes_28", + "from": "flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_28", + "kind": "handles-route", + "label": "OnConnectedAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 28, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 28 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_28_flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_repository_read_30_30_invokes_30", + "from": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_28", + "to": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_repository_read_30_30", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 30, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 30 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_repository_read_30_30_flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_branch_31_31_evaluates-condition_31", + "from": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_repository_read_30_30", + "to": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_branch_31_31", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 31, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 31 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_branch_31_31_flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_guard_clause_31_31_evaluates-condition_31", + "from": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_branch_31_31", + "to": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_guard_clause_31_31", + "kind": "evaluates-condition", + "label": "AddToGroup / skip", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 31, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 31 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_guard_clause_31_31_flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_repository_read_33_33_invokes_33", + "from": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_guard_clause_31_31", + "to": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_repository_read_33_33", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 33, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 33 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1_flow_method_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_38_invokes_38", + "from": "flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_38", + "kind": "handles-route", + "label": "OnDisconnectedAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 38, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 38 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_38_flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_repository_read_40_40_invokes_40", + "from": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_38", + "to": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_repository_read_40_40", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 40, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 40 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_repository_read_40_40_flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_branch_41_41_evaluates-condition_41", + "from": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_repository_read_40_40", + "to": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_branch_41_41", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 41, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 41 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_branch_41_41_flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_guard_clause_41_41_evaluates-condition_41", + "from": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_branch_41_41", + "to": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_guard_clause_41_41", + "kind": "evaluates-condition", + "label": "RemoveFromGroup / skip", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 41, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 41 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_guard_clause_41_41_flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_repository_read_43_43_invokes_43", + "from": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_guard_clause_41_41", + "to": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_repository_read_43_43", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 43, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 43 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1_flow_type_nexusreader_infrastructure_realtime_synchub_cs_synchub_10_defines-type_10", + "from": "flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1", + "to": "flow_type_nexusreader_infrastructure_realtime_synchub_cs_synchub_10", + "kind": "defines-type", + "label": "model SyncHub", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 10, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 10 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1_flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_knowledgeservice_38_invokes_38", + "from": "flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_knowledgeservice_38", + "kind": "invokes", + "label": "KnowledgeService", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 38, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 38 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1_flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeasync_61_invokes_61", + "from": "flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeasync_61", + "kind": "invokes", + "label": "GetKnowledgeAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 61, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 61 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeasync_61_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeasync_return_63_63_returns_63", + "from": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeasync_61", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeasync_return_63_63", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 63, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 63 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1_flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getgraphdataasync_66_invokes_66", + "from": "flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getgraphdataasync_66", + "kind": "invokes", + "label": "GetGraphDataAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 66, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 66 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getgraphdataasync_66_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getgraphdataasync_return_68_68_returns_68", + "from": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getgraphdataasync_66", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getgraphdataasync_return_68_68", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 68, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 68 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1_flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getsummaryandquizasync_71_invokes_71", + "from": "flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getsummaryandquizasync_71", + "kind": "invokes", + "label": "GetSummaryAndQuizAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 71, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 71 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getsummaryandquizasync_71_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getsummaryandquizasync_return_73_73_returns_73", + "from": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getsummaryandquizasync_71", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getsummaryandquizasync_return_73_73", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 73, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 73 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1_flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgemapasync_76_invokes_76", + "from": "flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgemapasync_76", + "kind": "invokes", + "label": "GetKnowledgeMapAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 76, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 76 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgemapasync_76_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgemapasync_return_78_78_returns_78", + "from": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgemapasync_76", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgemapasync_return_78_78", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 78, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 78 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1_flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_81_invokes_81", + "from": "flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_81", + "kind": "invokes", + "label": "GetKnowledgeInternalAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 81, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 81 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_81_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_guard_clause_83_83_evaluates-condition_83", + "from": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_81", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_guard_clause_83_83", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 83, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 83 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_guard_clause_83_83_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_branch_93_93_evaluates-condition_93", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_guard_clause_83_83", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_branch_93_93", + "kind": "evaluates-condition", + "label": "Cache hit path", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 93, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 93 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_branch_93_93_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_guard_clause_99_99_evaluates-condition_99", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_branch_93_93", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_guard_clause_99_99", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 99, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 99 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_guard_clause_99_99_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_log_103_103_invokes_103", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_guard_clause_99_99", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_log_103_103", + "kind": "invokes", + "label": "Logs runtime state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 103, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 103 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_log_103_103_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_branch_122_122_evaluates-condition_122", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_log_103_103", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_branch_122_122", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 122, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 122 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_branch_122_122_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_return_127_127_returns_127", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_branch_122_122", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_return_127_127", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 127, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 127 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1_flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_140_invokes_140", + "from": "flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_140", + "kind": "invokes", + "label": "ExecuteAiRequestAndCacheAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 140, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 140 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_140_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_validation_166_166_evaluates-condition_166", + "from": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_140", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_validation_166_166", + "kind": "evaluates-condition", + "label": "Rejects empty AI response", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 166, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 166 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_validation_166_166_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_guard_clause_167_167_evaluates-condition_167", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_validation_166_166", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_guard_clause_167_167", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 167, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 167 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_guard_clause_167_167_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_guard_clause_176_176_evaluates-condition_176", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_guard_clause_167_167", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_guard_clause_176_176", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 176, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 176 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_guard_clause_176_176_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_branch_193_193_evaluates-condition_193", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_guard_clause_176_176", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_branch_193_193", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 193, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 193 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_branch_193_193_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_repository_write_193_193_invokes_193", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_branch_193_193", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_repository_write_193_193", + "kind": "invokes", + "label": "Writes repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 193, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 193 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_repository_write_193_193_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_fallback_194_194_falls-back_194", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_repository_write_193_193", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_fallback_194_194", + "kind": "falls-back", + "label": "fallback", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 194, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 194 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_fallback_194_194_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_return_205_205_returns_205", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_fallback_194_194", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_return_205_205", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 205, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 205 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_return_205_205_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_log_209_209_invokes_209", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_return_205_205", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_log_209_209", + "kind": "invokes", + "label": "Logs runtime state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 209, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 209 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_log_209_209_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_return_210_210_returns_210", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_log_209_209", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_return_210_210", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 210, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 210 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_return_210_210_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_return_215_215_returns_215", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_return_210_210", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_return_215_215", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 215, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 215 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1_flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_225_invokes_225", + "from": "flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_225", + "kind": "invokes", + "label": "ProcessKnowledgeUnitsAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 225, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 225 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_225_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_repository_read_235_235_invokes_235", + "from": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_225", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_repository_read_235_235", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 235, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 235 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_repository_read_235_235_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_loop_240_240_loops-to_240", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_repository_read_235_235", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_loop_240_240", + "kind": "loops-to", + "label": "var unitDto in packet.Units", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 240, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 240 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_loop_240_240_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_loop_240_240_loops-to_240", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_loop_240_240", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_loop_240_240", + "kind": "loops-to", + "label": "Upserts units from packet", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 240, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 240 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_loop_240_240_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_branch_245_245_evaluates-condition_245", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_loop_240_240", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_branch_245_245", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 245, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 245 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_branch_245_245_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_repository_write_248_248_invokes_248", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_branch_245_245", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_repository_write_248_248", + "kind": "invokes", + "label": "Writes repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 248, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 248 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_repository_write_248_248_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_loop_266_266_loops-to_266", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_repository_write_248_248", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_loop_266_266", + "kind": "loops-to", + "label": "Maps links to KnowledgeUnitLink entities", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 266, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 266 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_loop_266_266_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_loop_266_266_loops-to_266", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_loop_266_266", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_loop_266_266", + "kind": "loops-to", + "label": "var linkDto in packet.Links", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 266, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 266 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_loop_266_266_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_branch_271_271_evaluates-condition_271", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_loop_266_266", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_branch_271_271", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 271, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 271 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_branch_271_271_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_repository_write_281_281_invokes_281", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_branch_271_271", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_repository_write_281_281", + "kind": "invokes", + "label": "Writes repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 281, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 281 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_repository_write_281_281_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_fallback_283_283_falls-back_283", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_repository_write_281_281", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_fallback_283_283", + "kind": "falls-back", + "label": "fallback", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 283, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 283 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_fallback_283_283_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_log_285_285_invokes_285", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_fallback_283_283", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_log_285_285", + "kind": "invokes", + "label": "Logs runtime state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 285, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 285 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1_flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_verifygroundednessasync_290_invokes_290", + "from": "flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_verifygroundednessasync_290", + "kind": "invokes", + "label": "VerifyGroundednessAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 290, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 290 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_verifygroundednessasync_290_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_verifygroundednessasync_return_295_295_returns_295", + "from": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_verifygroundednessasync_290", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_verifygroundednessasync_return_295_295", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 295, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 295 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_verifygroundednessasync_return_295_295_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_verifygroundednessasync_return_320_320_returns_320", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_verifygroundednessasync_return_295_295", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_verifygroundednessasync_return_320_320", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 320, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 320 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_verifygroundednessasync_return_320_320_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_verifygroundednessasync_return_324_324_returns_324", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_verifygroundednessasync_return_320_320", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_verifygroundednessasync_return_324_324", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 324, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 324 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1_flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_328_invokes_328", + "from": "flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_328", + "kind": "invokes", + "label": "GetRelevantContextAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 328, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 328 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_328_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_336_336_invokes_336", + "from": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_328", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_336_336", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 336, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 336 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_336_336_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_337_337_invokes_337", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_336_336", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_337_337", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 337, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 337 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_337_337_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_339_339_invokes_339", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_337_337", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_339_339", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 339, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 339 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_339_339_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_342_342_invokes_342", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_339_339", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_342_342", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 342, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 342 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_342_342_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_345_345_invokes_345", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_342_342", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_345_345", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 345, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 345 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_345_345_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_347_347_invokes_347", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_345_345", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_347_347", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 347, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 347 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_347_347_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_350_350_invokes_350", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_347_347", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_350_350", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 350, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 350 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_350_350_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_354_354_invokes_354", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_350_350", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_354_354", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 354, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 354 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_354_354_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_368_368_invokes_368", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_354_354", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_368_368", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 368, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 368 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_368_368_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_return_377_377_returns_377", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_368_368", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_return_377_377", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 377, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 377 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_return_377_377_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_return_381_381_returns_381", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_return_377_377", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_return_381_381", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 381, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 381 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1_flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_385_invokes_385", + "from": "flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_385", + "kind": "invokes", + "label": "SearchLibrarySemanticallyAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 385, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 385 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_385_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_399_399_invokes_399", + "from": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_385", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_399_399", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 399, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 399 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_399_399_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_400_400_invokes_400", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_399_399", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_400_400", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 400, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 400 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_400_400_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_402_402_invokes_402", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_400_400", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_402_402", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 402, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 402 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_402_402_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_405_405_invokes_405", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_402_402", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_405_405", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 405, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 405 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_405_405_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_408_408_invokes_408", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_405_405", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_408_408", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 408, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 408 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_408_408_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_410_410_invokes_410", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_408_408", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_410_410", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 410, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 410 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_410_410_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_413_413_invokes_413", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_410_410", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_413_413", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 413, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 413 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_413_413_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_417_417_invokes_417", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_413_413", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_417_417", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 417, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 417 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_417_417_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_log_431_431_invokes_431", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_417_417", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_log_431_431", + "kind": "invokes", + "label": "Logs runtime state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 431, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 431 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_log_431_431_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_432_432_invokes_432", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_log_431_431", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_432_432", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 432, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 432 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_432_432_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_435_435_evaluates-condition_435", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_432_432", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_435_435", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 435, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 435 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_435_435_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_437_437_returns_437", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_435_435", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_437_437", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 437, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 437 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_437_437_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_444_444_evaluates-condition_444", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_437_437", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_444_444", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 444, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 444 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_444_444_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_452_452_returns_452", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_444_444", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_452_452", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 452, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 452 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_452_452_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_457_457_returns_457", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_452_452", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_457_457", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 457, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 457 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_457_457_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_loop_460_460_loops-to_460", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_457_457", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_loop_460_460", + "kind": "loops-to", + "label": "var record in neoResult", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 460, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 460 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_loop_460_460_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_464_464_evaluates-condition_464", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_loop_460_460", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_464_464", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 464, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 464 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_464_464_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_log_473_473_invokes_473", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_464_464", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_log_473_473", + "kind": "invokes", + "label": "Logs runtime state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 473, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 473 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_log_473_473_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_repository_read_479_479_invokes_479", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_log_473_473", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_repository_read_479_479", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 479, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 479 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_repository_read_479_479_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_485_485_evaluates-condition_485", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_repository_read_479_479", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_485_485", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 485, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 485 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_485_485_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_repository_read_489_489_invokes_489", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_485_485", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_repository_read_489_489", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 489, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 489 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_repository_read_489_489_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_501_501_evaluates-condition_501", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_repository_read_489_489", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_501_501", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 501, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 501 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_501_501_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_507_507_evaluates-condition_507", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_501_501", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_507_507", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 507, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 507 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_507_507_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_513_513_evaluates-condition_513", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_507_507", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_513_513", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 513, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 513 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_513_513_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_533_533_evaluates-condition_533", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_513_513", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_533_533", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 533, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 533 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_533_533_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_538_538_returns_538", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_533_533", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_538_538", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 538, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 538 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_538_538_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_541_541_returns_541", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_538_538", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_541_541", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 541, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 541 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_541_541_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_545_545_returns_545", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_541_541", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_545_545", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 545, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 545 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1_flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_549_invokes_549", + "from": "flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_549", + "kind": "invokes", + "label": "AskQuestionAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 549, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 549 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_549_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_568_568_invokes_568", + "from": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_549", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_568_568", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 568, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 568 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_568_568_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_571_571_invokes_571", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_568_568", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_571_571", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 571, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 571 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_571_571_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_572_572_invokes_572", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_571_571", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_572_572", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 572, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 572 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_572_572_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_574_574_invokes_574", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_572_572", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_574_574", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 574, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 574 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_574_574_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_577_577_invokes_577", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_574_574", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_577_577", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 577, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 577 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_577_577_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_580_580_invokes_580", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_577_577", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_580_580", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 580, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 580 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_580_580_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_582_582_invokes_582", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_580_580", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_582_582", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 582, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 582 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_582_582_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_585_585_invokes_585", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_582_582", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_585_585", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 585, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 585 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_585_585_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_588_588_invokes_588", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_585_585", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_588_588", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 588, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 588 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_588_588_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_590_590_evaluates-condition_590", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_588_588", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_590_590", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 590, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 590 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_590_590_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_592_592_invokes_592", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_590_590", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_592_592", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 592, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 592 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_592_592_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_594_594_invokes_594", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_592_592", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_594_594", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 594, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 594 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_594_594_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_597_597_invokes_597", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_594_594", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_597_597", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 597, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 597 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_597_597_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_602_602_invokes_602", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_597_597", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_602_602", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 602, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 602 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_602_602_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_log_616_616_invokes_616", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_602_602", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_log_616_616", + "kind": "invokes", + "label": "Logs runtime state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 616, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 616 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_log_616_616_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_617_617_invokes_617", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_log_616_616", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_617_617", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 617, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 617 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_617_617_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_620_620_evaluates-condition_620", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_617_617", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_620_620", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 620, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 620 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_620_620_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_622_622_returns_622", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_620_620", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_622_622", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 622, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 622 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_622_622_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_624_624_invokes_624", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_622_622", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_624_624", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 624, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 624 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_624_624_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_636_636_evaluates-condition_636", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_624_624", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_636_636", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 636, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 636 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_636_636_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_645_645_returns_645", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_636_636", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_645_645", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 645, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 645 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_645_645_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_651_651_returns_651", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_645_645", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_651_651", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 651, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 651 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_651_651_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_loop_654_654_loops-to_654", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_651_651", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_loop_654_654", + "kind": "loops-to", + "label": "var record in neoResult", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 654, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 654 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_loop_654_654_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_write_659_659_invokes_659", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_loop_654_654", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_write_659_659", + "kind": "invokes", + "label": "Writes repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 659, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 659 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_write_659_659_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_662_662_evaluates-condition_662", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_write_659_659", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_662_662", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 662, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 662 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_662_662_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_loop_664_664_loops-to_664", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_662_662", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_loop_664_664", + "kind": "loops-to", + "label": "var relObj in relations", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 664, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 664 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_loop_664_664_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_671_671_evaluates-condition_671", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_loop_664_664", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_671_671", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 671, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 671 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_671_671_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_write_673_673_invokes_673", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_671_671", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_write_673_673", + "kind": "invokes", + "label": "Writes repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 673, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 673 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_write_673_673_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_log_682_682_invokes_682", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_write_673_673", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_log_682_682", + "kind": "invokes", + "label": "Logs runtime state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 682, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 682 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_log_682_682_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_loop_683_683_loops-to_683", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_log_682_682", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_loop_683_683", + "kind": "loops-to", + "label": "var point in searchResult", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 683, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 683 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_loop_683_683_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_write_687_687_invokes_687", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_loop_683_683", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_write_687_687", + "kind": "invokes", + "label": "Writes repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 687, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 687 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_write_687_687_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_694_694_invokes_694", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_write_687_687", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_694_694", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 694, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 694 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_694_694_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_700_700_evaluates-condition_700", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_694_694", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_700_700", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 700, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 700 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_700_700_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_704_704_invokes_704", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_700_700", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_704_704", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 704, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 704 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_704_704_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_715_715_invokes_715", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_704_704", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_715_715", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 715, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 715 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_715_715_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_716_716_invokes_716", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_715_715", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_716_716", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 716, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 716 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_716_716_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_717_717_invokes_717", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_716_716", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_717_717", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 717, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 717 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_717_717_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_754_754_evaluates-condition_754", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_717_717", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_754_754", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 754, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 754 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_754_754_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_756_756_returns_756", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_754_754", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_756_756", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 756, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 756 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_756_756_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_loop_760_760_loops-to_760", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_756_756", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_loop_760_760", + "kind": "loops-to", + "label": "var citation in groundedResult.Citations", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 760, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 760 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_loop_760_760_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_762_762_evaluates-condition_762", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_loop_760_760", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_762_762", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 762, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 762 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_762_762_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_771_771_returns_771", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_762_762", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_771_771", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 771, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 771 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_771_771_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_log_775_775_invokes_775", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_771_771", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_log_775_775", + "kind": "invokes", + "label": "Logs runtime state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 775, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 775 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_log_775_775_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_776_776_returns_776", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_log_775_775", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_776_776", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 776, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 776 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_776_776_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_781_781_returns_781", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_776_776", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_781_781", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 781, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 781 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1_flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_30_invokes_30", + "from": "flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_30", + "kind": "invokes", + "label": "GetEpubContentAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 30, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 30 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_30_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_repository_read_41_41_invokes_41", + "from": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_30", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_repository_read_41_41", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 41, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 41 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_repository_read_41_41_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_guard_clause_47_47_evaluates-condition_47", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_repository_read_41_41", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_guard_clause_47_47", + "kind": "evaluates-condition", + "label": "fail / continue", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 47, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 47 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_guard_clause_47_47_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_47_47_evaluates-condition_47", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_guard_clause_47_47", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_47_47", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 47, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 47 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_47_47_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_return_49_49_returns_49", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_47_47", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_return_49_49", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 49, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 49 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_return_49_49_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_55_55_evaluates-condition_55", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_return_49_49", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_55_55", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 55, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 55 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_55_55_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_log_57_57_invokes_57", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_55_55", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_log_57_57", + "kind": "invokes", + "label": "Logs runtime state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 57, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 57 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_log_57_57_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_return_58_58_returns_58", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_log_57_57", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_return_58_58", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 58, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 58 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_return_58_58_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_65_65_evaluates-condition_65", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_return_58_58", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_65_65", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 65, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 65 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_65_65_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_guard_clause_65_65_evaluates-condition_65", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_65_65", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_guard_clause_65_65", + "kind": "evaluates-condition", + "label": "fail / continue", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 65, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 65 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_guard_clause_65_65_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_return_67_67_returns_67", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_guard_clause_65_65", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_return_67_67", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 67, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 67 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_return_67_67_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_70_70_evaluates-condition_70", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_return_67_67", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_70_70", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 70, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 70 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_70_70_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_repository_read_77_77_invokes_77", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_70_70", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_repository_read_77_77", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 77, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 77 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_repository_read_77_77_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_loop_89_89_loops-to_89", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_repository_read_77_77", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_loop_89_89", + "kind": "loops-to", + "label": "Paragraph -> block building loop", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 89, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 89 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_loop_89_89_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_loop_89_89_loops-to_89", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_loop_89_89", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_loop_89_89", + "kind": "loops-to", + "label": "var p in paragraphs", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 89, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 89 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_loop_89_89_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_guard_clause_92_92_evaluates-condition_92", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_loop_89_89", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_guard_clause_92_92", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 92, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 92 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_guard_clause_92_92_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_99_99_evaluates-condition_99", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_guard_clause_92_92", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_99_99", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 99, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 99 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_99_99_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_106_106_evaluates-condition_106", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_99_99", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_106_106", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 106, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 106 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_106_106_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_return_111_111_returns_111", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_106_106", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_return_111_111", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 111, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 111 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_return_111_111_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_log_115_115_invokes_115", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_return_111_111", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_log_115_115", + "kind": "invokes", + "label": "Logs runtime state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 115, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 115 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_log_115_115_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_return_116_116_returns_116", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_log_115_115", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_return_116_116", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 116, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 116 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1_flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_124_invokes_124", + "from": "flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_124", + "kind": "invokes", + "label": "ResolvePath", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 124, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 124 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_124_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_loop_129_129_loops-to_129", + "from": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_124", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_loop_129_129", + "kind": "loops-to", + "label": "Search upward through parent directories", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 129, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 129 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_loop_129_129_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_loop_130_130_loops-to_130", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_loop_129_129", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_loop_130_130", + "kind": "loops-to", + "label": "currentDir != null", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 130, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 130 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_loop_130_130_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_guard_clause_133_133_evaluates-condition_133", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_loop_130_130", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_guard_clause_133_133", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 133, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 133 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_guard_clause_133_133_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_guard_clause_137_137_evaluates-condition_137", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_guard_clause_133_133", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_guard_clause_137_137", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 137, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 137 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_guard_clause_137_137_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_fallback_142_142_falls-back_142", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_guard_clause_137_137", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_fallback_142_142", + "kind": "falls-back", + "label": "Return null if not found", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 142, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 142 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_fallback_142_142_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_return_142_142_returns_142", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_fallback_142_142", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_return_142_142", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 142, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 142 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1_flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_extractparagraphs_145_invokes_145", + "from": "flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_extractparagraphs_145", + "kind": "invokes", + "label": "ExtractParagraphs", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 145, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 145 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_extractparagraphs_145_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_extractparagraphs_loop_153_153_loops-to_153", + "from": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_extractparagraphs_145", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_extractparagraphs_loop_153_153", + "kind": "loops-to", + "label": "Match match in matches", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 153, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 153 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_extractparagraphs_loop_153_153_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_extractparagraphs_branch_158_158_evaluates-condition_158", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_extractparagraphs_loop_153_153", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_extractparagraphs_branch_158_158", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 158, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 158 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_extractparagraphs_branch_158_158_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_extractparagraphs_fallback_158_158_falls-back_158", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_extractparagraphs_branch_158_158", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_extractparagraphs_fallback_158_158", + "kind": "falls-back", + "label": "Split by breaks if no blocks found", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 158, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 158 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_extractparagraphs_fallback_158_158_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_extractparagraphs_return_163_163_returns_163", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_extractparagraphs_fallback_158_158", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_extractparagraphs_return_163_163", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 163, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 163 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1_flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_sanitizeparagraph_166_invokes_166", + "from": "flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_sanitizeparagraph_166", + "kind": "invokes", + "label": "SanitizeParagraph", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 166, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 166 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_sanitizeparagraph_166_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_sanitizeparagraph_return_172_172_returns_172", + "from": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_sanitizeparagraph_166", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_sanitizeparagraph_return_172_172", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 172, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 172 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1_flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_175_invokes_175", + "from": "flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_175", + "kind": "invokes", + "label": "CountWords", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 175, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 175 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_175_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_guard_clause_177_177_evaluates-condition_177", + "from": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_175", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_guard_clause_177_177", + "kind": "evaluates-condition", + "label": "return 0 / continue", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 177, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 177 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_guard_clause_177_177_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_return_178_178_returns_178", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_guard_clause_177_177", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_return_178_178", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 178, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 178 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1_flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_createaitrigger_181_invokes_181", + "from": "flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_createaitrigger_181", + "kind": "invokes", + "label": "CreateAiTrigger", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 181, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 181 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1_flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_186_invokes_186", + "from": "flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_186", + "kind": "invokes", + "label": "FindTitleInNavigation", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 186, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 186 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_186_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_repository_read_186_186_invokes_186", + "from": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_186", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_repository_read_186_186", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 186, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 186 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_repository_read_186_186_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_guard_clause_188_188_evaluates-condition_188", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_repository_read_186_186", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_guard_clause_188_188", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 188, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 188 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_guard_clause_188_188_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_loop_191_191_loops-to_191", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_guard_clause_188_188", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_loop_191_191", + "kind": "loops-to", + "label": "Iterate navigation items", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 191, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 191 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_loop_191_191_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_loop_191_191_loops-to_191", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_loop_191_191", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_loop_191_191", + "kind": "loops-to", + "label": "var item in navigation", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 191, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 191 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_loop_191_191_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_branch_193_193_evaluates-condition_193", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_loop_191_191", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_branch_193_193", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 193, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 193 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_branch_193_193_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_return_194_194_returns_194", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_branch_193_193", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_return_194_194", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 194, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 194 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_return_194_194_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_branch_196_196_evaluates-condition_196", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_return_194_194", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_branch_196_196", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 196, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 196 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_branch_196_196_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_repository_read_198_198_invokes_198", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_branch_196_196", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_repository_read_198_198", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 198, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 198 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_repository_read_198_198_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_guard_clause_199_199_evaluates-condition_199", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_repository_read_198_198", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_guard_clause_199_199", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 199, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 199 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_guard_clause_199_199_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_return_203_203_returns_203", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_guard_clause_199_199", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_return_203_203", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 203, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 203 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_epubmetadataextractor_cs_file_1_flow_method_nexusreader_infrastructure_services_epubmetadataextractor_cs_extractmetadataasync_15_invokes_15", + "from": "flow_file_nexusreader_infrastructure_services_epubmetadataextractor_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_epubmetadataextractor_cs_extractmetadataasync_15", + "kind": "invokes", + "label": "ExtractMetadataAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "sourceLine": 15, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "line": 15 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_epubmetadataextractor_cs_extractmetadataasync_15_flow_action_nexusreader_infrastructure_services_epubmetadataextractor_cs_extractmetadataasync_guard_clause_20_20_evaluates-condition_20", + "from": "flow_method_nexusreader_infrastructure_services_epubmetadataextractor_cs_extractmetadataasync_15", + "to": "flow_action_nexusreader_infrastructure_services_epubmetadataextractor_cs_extractmetadataasync_guard_clause_20_20", + "kind": "evaluates-condition", + "label": "use 'Unknown Title' / use actual title", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "sourceLine": 20, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "line": 20 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubmetadataextractor_cs_extractmetadataasync_guard_clause_20_20_flow_action_nexusreader_infrastructure_services_epubmetadataextractor_cs_extractmetadataasync_guard_clause_21_21_evaluates-condition_21", + "from": "flow_action_nexusreader_infrastructure_services_epubmetadataextractor_cs_extractmetadataasync_guard_clause_20_20", + "to": "flow_action_nexusreader_infrastructure_services_epubmetadataextractor_cs_extractmetadataasync_guard_clause_21_21", + "kind": "evaluates-condition", + "label": "use 'Unknown Author' / use actual author", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "sourceLine": 21, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "line": 21 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubmetadataextractor_cs_extractmetadataasync_guard_clause_21_21_flow_action_nexusreader_infrastructure_services_epubmetadataextractor_cs_extractmetadataasync_return_24_24_returns_24", + "from": "flow_action_nexusreader_infrastructure_services_epubmetadataextractor_cs_extractmetadataasync_guard_clause_21_21", + "to": "flow_action_nexusreader_infrastructure_services_epubmetadataextractor_cs_extractmetadataasync_return_24_24", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "sourceLine": 24, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "line": 24 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubmetadataextractor_cs_extractmetadataasync_return_24_24_flow_action_nexusreader_infrastructure_services_epubmetadataextractor_cs_extractmetadataasync_return_28_28_returns_28", + "from": "flow_action_nexusreader_infrastructure_services_epubmetadataextractor_cs_extractmetadataasync_return_24_24", + "to": "flow_action_nexusreader_infrastructure_services_epubmetadataextractor_cs_extractmetadataasync_return_28_28", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "sourceLine": 28, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "line": 28 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1_flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_19_invokes_19", + "from": "flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_19", + "kind": "invokes", + "label": "SaveEbookAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 19, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 19 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_19_flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_return_22_22_returns_22", + "from": "flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_19", + "to": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_return_22_22", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 22, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 22 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1_flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_25_invokes_25", + "from": "flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_25", + "kind": "invokes", + "label": "SaveEbookAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 25, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 25 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_25_flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_guard_clause_28_28_evaluates-condition_28", + "from": "flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_25", + "to": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_guard_clause_28_28", + "kind": "evaluates-condition", + "label": "create-directory / continue", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 28, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 28 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_guard_clause_28_28_flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_return_40_40_returns_40", + "from": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_guard_clause_28_28", + "to": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_return_40_40", + "kind": "returns", + "label": "Return web-relative uploads path", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 40, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 40 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_return_40_40_flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_return_40_40_returns_40", + "from": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_return_40_40", + "to": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_return_40_40", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 40, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 40 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1_flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_43_invokes_43", + "from": "flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_43", + "kind": "invokes", + "label": "SaveCoverAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 43, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 43 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_43_flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_guard_clause_45_45_evaluates-condition_45", + "from": "flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_43", + "to": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_guard_clause_45_45", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 45, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 45 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_guard_clause_45_45_flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_return_47_47_returns_47", + "from": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_guard_clause_45_45", + "to": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_return_47_47", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 47, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 47 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1_flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_50_invokes_50", + "from": "flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_50", + "kind": "invokes", + "label": "SaveCoverAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 50, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 50 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_50_flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_guard_clause_53_53_evaluates-condition_53", + "from": "flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_50", + "to": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_guard_clause_53_53", + "kind": "evaluates-condition", + "label": "create-directory / continue", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 53, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 53 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_guard_clause_53_53_flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_return_63_63_returns_63", + "from": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_guard_clause_53_53", + "to": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_return_63_63", + "kind": "returns", + "label": "Return web-relative covers path", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 63, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 63 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_return_63_63_flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_return_63_63_returns_63", + "from": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_return_63_63", + "to": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_return_63_63", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 63, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 63 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1_flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_66_invokes_66", + "from": "flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_66", + "kind": "invokes", + "label": "EnsureDirectoryExists", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 66, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 66 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_66_flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_guard_clause_68_68_evaluates-condition_68", + "from": "flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_66", + "to": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_guard_clause_68_68", + "kind": "evaluates-condition", + "label": "create-directory / noop", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 68, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 68 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_guard_clause_68_68_flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_branch_68_68_evaluates-condition_68", + "from": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_guard_clause_68_68", + "to": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_branch_68_68", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 68, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 68 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1_flow_type_nexusreader_infrastructure_services_bookstorageservice_cs_bookstorageservice_10_defines-type_10", + "from": "flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1", + "to": "flow_type_nexusreader_infrastructure_services_bookstorageservice_cs_bookstorageservice_10", + "kind": "defines-type", + "label": "model BookStorageService", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 10, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 10 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_file_1_flow_method_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_21_invokes_21", + "from": "flow_file_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_21", + "kind": "invokes", + "label": "BroadcastProgressAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourceLine": 21, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "line": 21 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_21_flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_guard_clause_30_30_evaluates-condition_30", + "from": "flow_method_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_21", + "to": "flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_guard_clause_30_30", + "kind": "evaluates-condition", + "label": "branch-true: attempt comment & send / branch-false: send", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourceLine": 30, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "line": 30 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_guard_clause_30_30_flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_branch_30_30_evaluates-condition_30", + "from": "flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_guard_clause_30_30", + "to": "flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_branch_30_30", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourceLine": 30, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "line": 30 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_branch_30_30_flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_external_call_34_34_invokes_34", + "from": "flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_branch_30_30", + "to": "flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_external_call_34_34", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourceLine": 34, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "line": 34 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_external_call_34_34_flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_fallback_40_40_falls-back_40", + "from": "flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_external_call_34_34", + "to": "flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_fallback_40_40", + "kind": "falls-back", + "label": "fallback", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourceLine": 40, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "line": 40 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_fallback_40_40_flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_external_call_44_44_invokes_44", + "from": "flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_fallback_40_40", + "to": "flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_external_call_44_44", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourceLine": 44, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "line": 44 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_file_1_flow_method_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastingestionprogressasync_49_invokes_49", + "from": "flow_file_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastingestionprogressasync_49", + "kind": "invokes", + "label": "BroadcastIngestionProgressAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourceLine": 49, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "line": 49 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastingestionprogressasync_49_flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastingestionprogressasync_external_call_59_59_invokes_59", + "from": "flow_method_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastingestionprogressasync_49", + "to": "flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastingestionprogressasync_external_call_59_59", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourceLine": 59, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "line": 59 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_file_1_flow_type_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_signalrsyncbroadcaster_11_defines-type_11", + "from": "flow_file_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_file_1", + "to": "flow_type_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_signalrsyncbroadcaster_11", + "kind": "defines-type", + "label": "model SignalRSyncBroadcaster", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourceLine": 11, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "line": 11 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_application_commands_sync_updatereadingprogresscommand_cs_file_1_flow_type_nexusreader_application_commands_sync_updatereadingprogresscommand_cs_updatereadingprogresscommand_6_defines-type_6", + "from": "flow_file_nexusreader_application_commands_sync_updatereadingprogresscommand_cs_file_1", + "to": "flow_type_nexusreader_application_commands_sync_updatereadingprogresscommand_cs_updatereadingprogresscommand_6", + "kind": "defines-type", + "label": "command UpdateReadingProgressCommand", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs", + "sourceLine": 6, + "evidencePaths": [ + "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs", + "line": 6 + } + ] + } + ], + "flows": [ + { + "id": "flow_1_nexusreader_web_client_program_cs", + "name": "Program.cs", + "category": "frontend-to-backend", + "entryNodeId": "flow_file_nexusreader_web_client_program_cs_file_1", + "nodeIds": [ + "flow_file_nexusreader_web_client_program_cs_file_1", + "flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15", + "flow_type_nexusreader_web_client_program_cs_webplatformservice_18", + "flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33", + "flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38", + "flow_type_nexusreader_web_client_program_cs_configured_httpclient_40", + "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49", + "flow_type_nexusreader_web_client_program_cs_n_a_55", + "flow_type_nexusreader_web_client_program_cs_wasmepubreader_56", + "flow_method_nexusreader_web_client_program_cs_run_wasm_host_59", + "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61", + "flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66", + "flow_method_nexusreader_web_client_program_cs_getservice_71", + "flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74", + "flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84", + "flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88", + "flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94", + "flow_action_nexusreader_web_client_program_cs_getservice_return_71_71", + "flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88", + "flow_file_nexusreader_web_program_cs_file_1", + "flow_method_nexusreader_web_program_cs_program_top_level_29", + "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125" + ], + "edgeIds": [ + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15_invokes_15", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_getservice_71_invokes_71", + "edge_flow_method_nexusreader_web_client_program_cs_getservice_71_flow_action_nexusreader_web_client_program_cs_getservice_return_71_71_returns_71", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88_invokes_88", + "edge_flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88_flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88_invokes_88", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61_defines-type_61", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66_defines-type_66", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74_defines-type_74", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84_defines-type_84", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94_defines-type_94", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_webplatformservice_18_registers-service_18", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33_registers-service_33", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38_registers-service_38", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_configured_httpclient_40_registers-service_40", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49_registers-service_49", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_n_a_55_registers-service_55", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_wasmepubreader_56_registers-service_56", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_run_wasm_host_59_configures-pipeline_59", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_program_top_level_29_invokes_29", + "edge_flow_method_nexusreader_web_program_cs_program_top_level_29_flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62_evaluates-condition_62", + "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_falls-back_66", + "edge_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125_invokes_125", + "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_126_126_invokes_126", + "edge_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_flow_method_nexusreader_application_dependencyinjection_cs_addapplication_8_uses-service_78", + "edge_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_flow_method_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_31_uses-service_79", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_startupvalidation_scope_check_165_invokes_165", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_ensuredatabaseinitialized_175_invokes_175", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_get_api_epub_ebookid_index_249_invokes_249", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_265_invokes_265", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_273_invokes_273", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_281_invokes_281", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_289_invokes_289", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_297_invokes_297", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_305_invokes_305", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_313_invokes_313", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_321_invokes_321", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_knowledgerequest_566_maps-dto_566", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_groundednessrequest_567_maps-dto_567", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_semanticsearchrequest_568_maps-dto_568", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_askquestionrequest_569_maps-dto_569" + ], + "confidence": "high", + "businessValue": 75, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 1 + } + ], + "businessSignals": [ + "trigger", + "validation-decision" + ], + "scoreBreakdown": { + "entrypointQuality": 25, + "crossLayerDepth": 7, + "businessSignals": 8, + "evidenceStrength": 20, + "contractCoverage": 15, + "total": 75 + }, + "validationIssues": [], + "recommendedDiagramKinds": [ + "primary-runtime", + "control-flow", + "dependency-map", + "class-diagram", + "method-flow" + ], + "producedArtifacts": [ + { + "id": "business_overview_md_phase_inputs", + "label": "Phase Inputs", + "path": "machine/phase-inputs/business__business-overview.phase-inputs.json", + "producerPath": "src/documentation/v4/phase4Generation.ts", + "status": "generated" + }, + { + "id": "business_overview_md_context_bag", + "label": "Context Bag", + "path": "machine/context-bags/business_overview.context-bag.json", + "producerPath": "src/documentation/v4/buildContextBags.ts", + "status": "generated" + }, + { + "id": "business_overview_md_planning_debug", + "label": "Planning Debug", + "path": "debug/planning.debug.json", + "producerPath": "src/documentation/v4/phase1Orientation.ts", + "status": "generated" + }, + { + "id": "business_overview_md_flow_catalog", + "label": "Flow Catalog", + "path": "machine/flow-catalog.json", + "producerPath": "src/documentation/v4/phase3_7FlowRanking.ts", + "status": "generated" + }, + { + "id": "business_overview_md_flow_selection", + "label": "Flow Selection", + "path": "machine/flow-selection.json", + "producerPath": "src/documentation/v4/phase3_7FlowRanking.ts", + "status": "generated" + }, + { + "id": "business_overview_md_business_map", + "label": "Business Map", + "path": "machine/business-map.json", + "producerPath": "src/documentation/v4/phase3_5BusinessUnderstanding.ts", + "status": "generated" + }, + { + "id": "business_overview_md_index_output", + "label": "Published Index", + "path": "index.md", + "producerPath": "src/documentation/v4/phase5Index.ts", + "status": "generated" + } + ] + }, + { + "id": "flow_2_nexusreader_maui_mauiprogram_cs", + "name": "MauiProgram", + "category": "frontend-to-backend", + "entryNodeId": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "nodeIds": [ + "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1", + "flow_type_nexusreader_maui_mauiprogram_cs_mauiprogram_10", + "flow_method_nexusreader_maui_mauiprogram_cs_createmauiapp_12", + "flow_method_nexusreader_maui_mauiprogram_cs_create_and_build_mauiapp_16", + "flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28", + "flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29", + "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32", + "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33", + "flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38", + "flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51", + "flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53", + "flow_action_nexusreader_maui_mauiprogram_cs_createmauiapp_return_57_57", + "flow_file_nexusreader_web_program_cs_file_1", + "flow_method_nexusreader_web_program_cs_program_top_level_29", + "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125", + "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_126_126", + "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_127_127", + "flow_action_nexusreader_web_program_cs_program_top_level_branch_129_129", + "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_131_131", + "flow_action_nexusreader_web_program_cs_program_top_level_fallback_133_133", + "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_135_135" + ], + "edgeIds": [ + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_method_nexusreader_maui_mauiprogram_cs_createmauiapp_12_invokes_12", + "edge_flow_method_nexusreader_maui_mauiprogram_cs_createmauiapp_12_flow_action_nexusreader_maui_mauiprogram_cs_createmauiapp_return_57_57_returns_57", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauiprogram_10_defines-type_10", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28_registers-service_28", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29_registers-service_29", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32_registers-service_32", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33_registers-service_33", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38_registers-service_38", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1_registers-service_1", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51_registers-service_51", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53_registers-service_53", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_method_nexusreader_maui_mauiprogram_cs_create_and_build_mauiapp_16_configures-pipeline_16", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_program_top_level_29_invokes_29", + "edge_flow_method_nexusreader_web_program_cs_program_top_level_29_flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62_evaluates-condition_62", + "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_falls-back_66", + "edge_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125_invokes_125", + "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_126_126_invokes_126", + "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_126_126_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_127_127_invokes_127", + "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_127_127_flow_action_nexusreader_web_program_cs_program_top_level_branch_129_129_evaluates-condition_129", + "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_129_129_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_131_131_invokes_131", + "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_131_131_flow_action_nexusreader_web_program_cs_program_top_level_fallback_133_133_falls-back_133", + "edge_flow_action_nexusreader_web_program_cs_program_top_level_fallback_133_133_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_135_135_invokes_135", + "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_135_135_flow_action_nexusreader_web_program_cs_program_top_level_return_137_137_returns_137", + "edge_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_flow_method_nexusreader_application_dependencyinjection_cs_addapplication_8_uses-service_78", + "edge_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_flow_method_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_31_uses-service_79", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_startupvalidation_scope_check_165_invokes_165", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_ensuredatabaseinitialized_175_invokes_175", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_get_api_epub_ebookid_index_249_invokes_249", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_265_invokes_265", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_273_invokes_273", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_281_invokes_281", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_289_invokes_289", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_297_invokes_297", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_305_invokes_305", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_313_invokes_313", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_321_invokes_321", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_knowledgerequest_566_maps-dto_566", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_groundednessrequest_567_maps-dto_567", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_semanticsearchrequest_568_maps-dto_568", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_askquestionrequest_569_maps-dto_569" + ], + "confidence": "high", + "businessValue": 75, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 1 + } + ], + "businessSignals": [ + "trigger", + "validation-decision" + ], + "scoreBreakdown": { + "entrypointQuality": 25, + "crossLayerDepth": 7, + "businessSignals": 8, + "evidenceStrength": 20, + "contractCoverage": 15, + "total": 75 + }, + "validationIssues": [], + "recommendedDiagramKinds": [ + "primary-runtime", + "control-flow", + "dependency-map", + "class-diagram", + "method-flow" + ], + "producedArtifacts": [ + { + "id": "business_overview_md_phase_inputs", + "label": "Phase Inputs", + "path": "machine/phase-inputs/business__business-overview.phase-inputs.json", + "producerPath": "src/documentation/v4/phase4Generation.ts", + "status": "generated" + }, + { + "id": "business_overview_md_context_bag", + "label": "Context Bag", + "path": "machine/context-bags/business_overview.context-bag.json", + "producerPath": "src/documentation/v4/buildContextBags.ts", + "status": "generated" + }, + { + "id": "business_overview_md_planning_debug", + "label": "Planning Debug", + "path": "debug/planning.debug.json", + "producerPath": "src/documentation/v4/phase1Orientation.ts", + "status": "generated" + }, + { + "id": "business_overview_md_flow_catalog", + "label": "Flow Catalog", + "path": "machine/flow-catalog.json", + "producerPath": "src/documentation/v4/phase3_7FlowRanking.ts", + "status": "generated" + }, + { + "id": "business_overview_md_flow_selection", + "label": "Flow Selection", + "path": "machine/flow-selection.json", + "producerPath": "src/documentation/v4/phase3_7FlowRanking.ts", + "status": "generated" + }, + { + "id": "business_overview_md_business_map", + "label": "Business Map", + "path": "machine/business-map.json", + "producerPath": "src/documentation/v4/phase3_5BusinessUnderstanding.ts", + "status": "generated" + }, + { + "id": "business_overview_md_index_output", + "label": "Published Index", + "path": "index.md", + "producerPath": "src/documentation/v4/phase5Index.ts", + "status": "generated" + } + ] + }, + { + "id": "flow_0_nexusreader_web_program_cs", + "name": "Program.cs", + "category": "frontend-to-backend", + "entryNodeId": "flow_file_nexusreader_web_program_cs_file_1", + "nodeIds": [ + "flow_file_nexusreader_web_program_cs_file_1", + "flow_method_nexusreader_web_program_cs_program_top_level_29", + "flow_type_nexusreader_web_program_cs_webplatformservice_47", + "flow_type_nexusreader_web_program_cs_knowledgecoordinator_55", + "flow_type_nexusreader_web_program_cs_httpclient_configured_with_base_address_58", + "flow_type_nexusreader_web_program_cs_nexusreader_application_assembly_extension_78", + "flow_type_nexusreader_web_program_cs_nexusreader_infrastructure_assembly_extension_79", + "flow_type_nexusreader_web_program_cs_identity_with_appdbcontext_107", + "flow_method_nexusreader_web_program_cs_usehangfiredashboard_163", + "flow_method_nexusreader_web_program_cs_startupvalidation_scope_check_165", + "flow_method_nexusreader_web_program_cs_ensuredatabaseinitialized_175", + "flow_method_nexusreader_web_program_cs_configure_request_pipeline_routing_auth_antiforgery_static_assets_hubs_225", + "flow_method_nexusreader_web_program_cs_get_api_epub_ebookid_index_249", + "flow_method_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_265", + "flow_method_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_273", + "flow_method_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_281", + "flow_method_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_289", + "flow_method_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_297", + "flow_method_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_305", + "flow_method_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_313", + "flow_method_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_321", + "flow_type_nexusreader_web_program_cs_knowledgerequest_566", + "flow_type_nexusreader_web_program_cs_groundednessrequest_567", + "flow_type_nexusreader_web_program_cs_semanticsearchrequest_568" + ], + "edgeIds": [ + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_program_top_level_29_invokes_29", + "edge_flow_method_nexusreader_web_program_cs_program_top_level_29_flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62_evaluates-condition_62", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_startupvalidation_scope_check_165_invokes_165", + "edge_flow_method_nexusreader_web_program_cs_startupvalidation_scope_check_165_flow_action_nexusreader_web_program_cs_startupvalidation_scope_check_branch_169_169_evaluates-condition_169", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_ensuredatabaseinitialized_175_invokes_175", + "edge_flow_method_nexusreader_web_program_cs_ensuredatabaseinitialized_175_flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_loop_186_186_loops-to_186", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_get_api_epub_ebookid_index_249_invokes_249", + "edge_flow_method_nexusreader_web_program_cs_get_api_epub_ebookid_index_249_flow_action_nexusreader_web_program_cs_get_api_epub_ebookid_index_guard_clause_252_252_evaluates-condition_252", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_265_invokes_265", + "edge_flow_method_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_265_flow_action_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_repository_read_267_267_invokes_267", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_273_invokes_273", + "edge_flow_method_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_273_flow_action_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_repository_read_275_275_invokes_275", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_281_invokes_281", + "edge_flow_method_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_281_flow_action_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_repository_read_283_283_invokes_283", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_289_invokes_289", + "edge_flow_method_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_289_flow_action_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_repository_read_291_291_invokes_291", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_297_invokes_297", + "edge_flow_method_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_297_flow_action_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_repository_read_299_299_invokes_299", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_305_invokes_305", + "edge_flow_method_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_305_flow_action_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_repository_read_307_307_invokes_307", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_313_invokes_313", + "edge_flow_method_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_313_flow_action_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_repository_read_315_315_invokes_315", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_321_invokes_321", + "edge_flow_method_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_321_flow_action_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_branch_323_323_evaluates-condition_323", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_knowledgerequest_566_maps-dto_566", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_groundednessrequest_567_maps-dto_567", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_semanticsearchrequest_568_maps-dto_568", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_askquestionrequest_569_maps-dto_569", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_webplatformservice_47_registers-service_47", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_knowledgecoordinator_55_registers-service_55", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_httpclient_configured_with_base_address_58_registers-service_58", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_nexusreader_application_assembly_extension_78_registers-service_78", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_nexusreader_infrastructure_assembly_extension_79_registers-service_79", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_identity_with_appdbcontext_107_registers-service_107", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_usehangfiredashboard_163_configures-pipeline_163", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_configure_request_pipeline_routing_auth_antiforgery_static_assets_hubs_225_configures-pipeline_225" + ], + "confidence": "high", + "businessValue": 68, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 1 + } + ], + "businessSignals": [ + "trigger", + "validation-decision" + ], + "scoreBreakdown": { + "entrypointQuality": 25, + "crossLayerDepth": 0, + "businessSignals": 8, + "evidenceStrength": 20, + "contractCoverage": 15, + "total": 68 + }, + "validationIssues": [], + "recommendedDiagramKinds": [ + "primary-runtime", + "dependency-map", + "class-diagram", + "method-flow" + ], + "producedArtifacts": [ + { + "id": "business_overview_md_phase_inputs", + "label": "Phase Inputs", + "path": "machine/phase-inputs/business__business-overview.phase-inputs.json", + "producerPath": "src/documentation/v4/phase4Generation.ts", + "status": "generated" + }, + { + "id": "business_overview_md_context_bag", + "label": "Context Bag", + "path": "machine/context-bags/business_overview.context-bag.json", + "producerPath": "src/documentation/v4/buildContextBags.ts", + "status": "generated" + }, + { + "id": "business_overview_md_planning_debug", + "label": "Planning Debug", + "path": "debug/planning.debug.json", + "producerPath": "src/documentation/v4/phase1Orientation.ts", + "status": "generated" + }, + { + "id": "business_overview_md_flow_catalog", + "label": "Flow Catalog", + "path": "machine/flow-catalog.json", + "producerPath": "src/documentation/v4/phase3_7FlowRanking.ts", + "status": "generated" + }, + { + "id": "business_overview_md_flow_selection", + "label": "Flow Selection", + "path": "machine/flow-selection.json", + "producerPath": "src/documentation/v4/phase3_7FlowRanking.ts", + "status": "generated" + }, + { + "id": "business_overview_md_business_map", + "label": "Business Map", + "path": "machine/business-map.json", + "producerPath": "src/documentation/v4/phase3_5BusinessUnderstanding.ts", + "status": "generated" + }, + { + "id": "business_overview_md_index_output", + "label": "Published Index", + "path": "index.md", + "producerPath": "src/documentation/v4/phase5Index.ts", + "status": "generated" + } + ] + }, + { + "id": "xref_business_overview_md_authentication_login_register_flow", + "name": "Authentication (Login/Register) Flow", + "category": "frontend-to-backend", + "entryNodeId": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "nodeIds": [ + "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "flow_method_nexusreader_maui_mauiprogram_cs_createmauiapp_12", + "flow_action_nexusreader_maui_mauiprogram_cs_createmauiapp_return_57_57", + "flow_type_nexusreader_maui_mauiprogram_cs_mauiprogram_10", + "flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28", + "flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29", + "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32", + "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33", + "flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38", + "flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1", + "flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51", + "flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53" + ], + "edgeIds": [ + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_method_nexusreader_maui_mauiprogram_cs_createmauiapp_12_invokes_12", + "edge_flow_method_nexusreader_maui_mauiprogram_cs_createmauiapp_12_flow_action_nexusreader_maui_mauiprogram_cs_createmauiapp_return_57_57_returns_57", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauiprogram_10_defines-type_10", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28_registers-service_28", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29_registers-service_29", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32_registers-service_32", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33_registers-service_33", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38_registers-service_38", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1_registers-service_1", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51_registers-service_51", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53_registers-service_53", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_method_nexusreader_maui_mauiprogram_cs_create_and_build_mauiapp_16_configures-pipeline_16", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15_invokes_15", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_getservice_71_invokes_71", + "edge_flow_method_nexusreader_web_client_program_cs_getservice_71_flow_action_nexusreader_web_client_program_cs_getservice_return_71_71_returns_71", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88_invokes_88" + ], + "confidence": "high", + "businessValue": 68, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 1 + } + ], + "businessSignals": [ + "trigger", + "validation-decision" + ], + "scoreBreakdown": { + "entrypointQuality": 25, + "crossLayerDepth": 0, + "businessSignals": 8, + "evidenceStrength": 20, + "contractCoverage": 15, + "total": 68 + }, + "validationIssues": [], + "recommendedDiagramKinds": [ + "primary-runtime", + "control-flow", + "dependency-map", + "class-diagram", + "method-flow" + ], + "producedArtifacts": [ + { + "id": "business_overview_md_phase_inputs", + "label": "Phase Inputs", + "path": "machine/phase-inputs/business__business-overview.phase-inputs.json", + "producerPath": "src/documentation/v4/phase4Generation.ts", + "status": "generated" + }, + { + "id": "business_overview_md_context_bag", + "label": "Context Bag", + "path": "machine/context-bags/business_overview.context-bag.json", + "producerPath": "src/documentation/v4/buildContextBags.ts", + "status": "generated" + }, + { + "id": "business_overview_md_planning_debug", + "label": "Planning Debug", + "path": "debug/planning.debug.json", + "producerPath": "src/documentation/v4/phase1Orientation.ts", + "status": "generated" + }, + { + "id": "business_overview_md_flow_catalog", + "label": "Flow Catalog", + "path": "machine/flow-catalog.json", + "producerPath": "src/documentation/v4/phase3_7FlowRanking.ts", + "status": "generated" + }, + { + "id": "business_overview_md_flow_selection", + "label": "Flow Selection", + "path": "machine/flow-selection.json", + "producerPath": "src/documentation/v4/phase3_7FlowRanking.ts", + "status": "generated" + }, + { + "id": "business_overview_md_business_map", + "label": "Business Map", + "path": "machine/business-map.json", + "producerPath": "src/documentation/v4/phase3_5BusinessUnderstanding.ts", + "status": "generated" + }, + { + "id": "business_overview_md_index_output", + "label": "Published Index", + "path": "index.md", + "producerPath": "src/documentation/v4/phase5Index.ts", + "status": "generated" + } + ] + }, + { + "id": "xref_business_overview_md_http_request_token_refresh_flow", + "name": "HTTP Request + Token Refresh Flow", + "category": "frontend-to-backend", + "entryNodeId": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "nodeIds": [ + "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "flow_method_nexusreader_maui_mauiprogram_cs_createmauiapp_12", + "flow_action_nexusreader_maui_mauiprogram_cs_createmauiapp_return_57_57", + "flow_type_nexusreader_maui_mauiprogram_cs_mauiprogram_10", + "flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28", + "flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29", + "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32", + "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33", + "flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38", + "flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1", + "flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51", + "flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53" + ], + "edgeIds": [ + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_method_nexusreader_maui_mauiprogram_cs_createmauiapp_12_invokes_12", + "edge_flow_method_nexusreader_maui_mauiprogram_cs_createmauiapp_12_flow_action_nexusreader_maui_mauiprogram_cs_createmauiapp_return_57_57_returns_57", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauiprogram_10_defines-type_10", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28_registers-service_28", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29_registers-service_29", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32_registers-service_32", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33_registers-service_33", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38_registers-service_38", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1_registers-service_1", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51_registers-service_51", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53_registers-service_53", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_method_nexusreader_maui_mauiprogram_cs_create_and_build_mauiapp_16_configures-pipeline_16", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15_invokes_15", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_getservice_71_invokes_71", + "edge_flow_method_nexusreader_web_client_program_cs_getservice_71_flow_action_nexusreader_web_client_program_cs_getservice_return_71_71_returns_71", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88_invokes_88" + ], + "confidence": "high", + "businessValue": 68, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 1 + } + ], + "businessSignals": [ + "trigger", + "validation-decision" + ], + "scoreBreakdown": { + "entrypointQuality": 25, + "crossLayerDepth": 0, + "businessSignals": 8, + "evidenceStrength": 20, + "contractCoverage": 15, + "total": 68 + }, + "validationIssues": [], + "recommendedDiagramKinds": [ + "primary-runtime", + "control-flow", + "dependency-map", + "class-diagram", + "method-flow" + ], + "producedArtifacts": [ + { + "id": "business_overview_md_phase_inputs", + "label": "Phase Inputs", + "path": "machine/phase-inputs/business__business-overview.phase-inputs.json", + "producerPath": "src/documentation/v4/phase4Generation.ts", + "status": "generated" + }, + { + "id": "business_overview_md_context_bag", + "label": "Context Bag", + "path": "machine/context-bags/business_overview.context-bag.json", + "producerPath": "src/documentation/v4/buildContextBags.ts", + "status": "generated" + }, + { + "id": "business_overview_md_planning_debug", + "label": "Planning Debug", + "path": "debug/planning.debug.json", + "producerPath": "src/documentation/v4/phase1Orientation.ts", + "status": "generated" + }, + { + "id": "business_overview_md_flow_catalog", + "label": "Flow Catalog", + "path": "machine/flow-catalog.json", + "producerPath": "src/documentation/v4/phase3_7FlowRanking.ts", + "status": "generated" + }, + { + "id": "business_overview_md_flow_selection", + "label": "Flow Selection", + "path": "machine/flow-selection.json", + "producerPath": "src/documentation/v4/phase3_7FlowRanking.ts", + "status": "generated" + }, + { + "id": "business_overview_md_business_map", + "label": "Business Map", + "path": "machine/business-map.json", + "producerPath": "src/documentation/v4/phase3_5BusinessUnderstanding.ts", + "status": "generated" + }, + { + "id": "business_overview_md_index_output", + "label": "Published Index", + "path": "index.md", + "producerPath": "src/documentation/v4/phase5Index.ts", + "status": "generated" + } + ] + }, + { + "id": "xref_business_overview_md_knowledge_query_api_flow", + "name": "Knowledge Query API Flow", + "category": "frontend-to-backend", + "entryNodeId": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "nodeIds": [ + "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "flow_method_nexusreader_maui_mauiprogram_cs_createmauiapp_12", + "flow_action_nexusreader_maui_mauiprogram_cs_createmauiapp_return_57_57", + "flow_type_nexusreader_maui_mauiprogram_cs_mauiprogram_10", + "flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28", + "flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29", + "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32", + "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33", + "flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38", + "flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1", + "flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51", + "flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53" + ], + "edgeIds": [ + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_method_nexusreader_maui_mauiprogram_cs_createmauiapp_12_invokes_12", + "edge_flow_method_nexusreader_maui_mauiprogram_cs_createmauiapp_12_flow_action_nexusreader_maui_mauiprogram_cs_createmauiapp_return_57_57_returns_57", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauiprogram_10_defines-type_10", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28_registers-service_28", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29_registers-service_29", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32_registers-service_32", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33_registers-service_33", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38_registers-service_38", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1_registers-service_1", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51_registers-service_51", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53_registers-service_53", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_method_nexusreader_maui_mauiprogram_cs_create_and_build_mauiapp_16_configures-pipeline_16", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15_invokes_15", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_getservice_71_invokes_71", + "edge_flow_method_nexusreader_web_client_program_cs_getservice_71_flow_action_nexusreader_web_client_program_cs_getservice_return_71_71_returns_71", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88_invokes_88" + ], + "confidence": "high", + "businessValue": 68, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 1 + } + ], + "businessSignals": [ + "trigger", + "validation-decision" + ], + "scoreBreakdown": { + "entrypointQuality": 25, + "crossLayerDepth": 0, + "businessSignals": 8, + "evidenceStrength": 20, + "contractCoverage": 15, + "total": 68 + }, + "validationIssues": [], + "recommendedDiagramKinds": [ + "primary-runtime", + "control-flow", + "dependency-map", + "class-diagram", + "method-flow" + ], + "producedArtifacts": [ + { + "id": "business_overview_md_phase_inputs", + "label": "Phase Inputs", + "path": "machine/phase-inputs/business__business-overview.phase-inputs.json", + "producerPath": "src/documentation/v4/phase4Generation.ts", + "status": "generated" + }, + { + "id": "business_overview_md_context_bag", + "label": "Context Bag", + "path": "machine/context-bags/business_overview.context-bag.json", + "producerPath": "src/documentation/v4/buildContextBags.ts", + "status": "generated" + }, + { + "id": "business_overview_md_planning_debug", + "label": "Planning Debug", + "path": "debug/planning.debug.json", + "producerPath": "src/documentation/v4/phase1Orientation.ts", + "status": "generated" + }, + { + "id": "business_overview_md_flow_catalog", + "label": "Flow Catalog", + "path": "machine/flow-catalog.json", + "producerPath": "src/documentation/v4/phase3_7FlowRanking.ts", + "status": "generated" + }, + { + "id": "business_overview_md_flow_selection", + "label": "Flow Selection", + "path": "machine/flow-selection.json", + "producerPath": "src/documentation/v4/phase3_7FlowRanking.ts", + "status": "generated" + }, + { + "id": "business_overview_md_business_map", + "label": "Business Map", + "path": "machine/business-map.json", + "producerPath": "src/documentation/v4/phase3_5BusinessUnderstanding.ts", + "status": "generated" + }, + { + "id": "business_overview_md_index_output", + "label": "Published Index", + "path": "index.md", + "producerPath": "src/documentation/v4/phase5Index.ts", + "status": "generated" + } + ] + }, + { + "id": "xref_business_overview_md_program_top_level", + "name": "Program (top level)", + "category": "frontend-to-backend", + "entryNodeId": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "nodeIds": [ + "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "flow_method_nexusreader_maui_mauiprogram_cs_createmauiapp_12", + "flow_action_nexusreader_maui_mauiprogram_cs_createmauiapp_return_57_57", + "flow_type_nexusreader_maui_mauiprogram_cs_mauiprogram_10", + "flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28", + "flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29", + "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32", + "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33", + "flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38", + "flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1", + "flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51", + "flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53" + ], + "edgeIds": [ + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_method_nexusreader_maui_mauiprogram_cs_createmauiapp_12_invokes_12", + "edge_flow_method_nexusreader_maui_mauiprogram_cs_createmauiapp_12_flow_action_nexusreader_maui_mauiprogram_cs_createmauiapp_return_57_57_returns_57", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauiprogram_10_defines-type_10", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28_registers-service_28", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29_registers-service_29", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32_registers-service_32", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33_registers-service_33", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38_registers-service_38", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1_registers-service_1", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51_registers-service_51", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53_registers-service_53", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_method_nexusreader_maui_mauiprogram_cs_create_and_build_mauiapp_16_configures-pipeline_16", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15_invokes_15", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_getservice_71_invokes_71", + "edge_flow_method_nexusreader_web_client_program_cs_getservice_71_flow_action_nexusreader_web_client_program_cs_getservice_return_71_71_returns_71", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88_invokes_88" + ], + "confidence": "high", + "businessValue": 68, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 1 + } + ], + "businessSignals": [ + "trigger", + "validation-decision" + ], + "scoreBreakdown": { + "entrypointQuality": 25, + "crossLayerDepth": 0, + "businessSignals": 8, + "evidenceStrength": 20, + "contractCoverage": 15, + "total": 68 + }, + "validationIssues": [], + "recommendedDiagramKinds": [ + "primary-runtime", + "control-flow", + "dependency-map", + "class-diagram", + "method-flow" + ], + "producedArtifacts": [ + { + "id": "business_overview_md_phase_inputs", + "label": "Phase Inputs", + "path": "machine/phase-inputs/business__business-overview.phase-inputs.json", + "producerPath": "src/documentation/v4/phase4Generation.ts", + "status": "generated" + }, + { + "id": "business_overview_md_context_bag", + "label": "Context Bag", + "path": "machine/context-bags/business_overview.context-bag.json", + "producerPath": "src/documentation/v4/buildContextBags.ts", + "status": "generated" + }, + { + "id": "business_overview_md_planning_debug", + "label": "Planning Debug", + "path": "debug/planning.debug.json", + "producerPath": "src/documentation/v4/phase1Orientation.ts", + "status": "generated" + }, + { + "id": "business_overview_md_flow_catalog", + "label": "Flow Catalog", + "path": "machine/flow-catalog.json", + "producerPath": "src/documentation/v4/phase3_7FlowRanking.ts", + "status": "generated" + }, + { + "id": "business_overview_md_flow_selection", + "label": "Flow Selection", + "path": "machine/flow-selection.json", + "producerPath": "src/documentation/v4/phase3_7FlowRanking.ts", + "status": "generated" + }, + { + "id": "business_overview_md_business_map", + "label": "Business Map", + "path": "machine/business-map.json", + "producerPath": "src/documentation/v4/phase3_5BusinessUnderstanding.ts", + "status": "generated" + }, + { + "id": "business_overview_md_index_output", + "label": "Published Index", + "path": "index.md", + "producerPath": "src/documentation/v4/phase5Index.ts", + "status": "generated" + } + ] + } + ] + }, + "testLinkMetadata": [] + }, + "generatedDiagrams": [ + { + "id": "dependency_map_graph", + "kind": "dependency-map", + "title": "Dependency and Model Map", + "direction": "TD", + "nodes": [ + { + "id": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "kind": "service", + "label": "MauiProgram", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 1 + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_mauiprogram_10", + "kind": "dependency", + "label": "MauiProgram", + "shape": "doc", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 10 + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28", + "kind": "dependency", + "label": "MauiPlatformService", + "shape": "doc", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 28 + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29", + "kind": "dependency", + "label": "MauiStorageService", + "shape": "doc", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 29 + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32", + "kind": "dependency", + "label": "NexusAuthenticationStateProvider", + "shape": "doc", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 32 + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33", + "kind": "dependency", + "label": "NexusAuthenticationStateProvider (via factory)", + "shape": "doc", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 33 + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38", + "kind": "dependency", + "label": "HttpClient (configured)", + "shape": "doc", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 38 + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1", + "kind": "dependency", + "label": "ThemeService, FocusModeService, QuizStateService, ReaderNavigationService, KnowledgeGraphService, ReaderInteractionService, KnowledgeCoordinator, SyncService, IdentityService", + "shape": "doc", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 1 + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51", + "kind": "dependency", + "label": "NexusReader.Application registrations", + "shape": "doc", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 51 + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53", + "kind": "dependency", + "label": "Handlers from NexusReader.Application assembly", + "shape": "doc", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 53 + }, + { + "id": "flow_file_nexusreader_web_client_program_cs_file_1", + "kind": "service", + "label": "Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 1 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61", + "kind": "dependency", + "label": "ThrowingDbContextFactory", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 61 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66", + "kind": "dependency", + "label": "ThrowingEmbeddingGenerator", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 66 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74", + "kind": "dependency", + "label": "ThrowingBookStorageService", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 74 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84", + "kind": "dependency", + "label": "ThrowingEbookRepository", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 84 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94", + "kind": "dependency", + "label": "ThrowingSyncBroadcaster", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 94 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_webplatformservice_18", + "kind": "dependency", + "label": "WebPlatformService", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 18 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33", + "kind": "dependency", + "label": "NexusAuthenticationStateProvider", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 33 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38", + "kind": "dependency", + "label": "WasmKnowledgeService", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 38 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_configured_httpclient_40", + "kind": "dependency", + "label": "configured HttpClient", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 40 + } + ], + "edges": [ + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauiprogram_10_defines_type_10", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_mauiprogram_10", + "semanticLabel": "model MauiProgram", + "visibleLabel": "model MauiProgram", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 10, + "includeInMetadata": true, + "payload": { + "outputSummary": "Static host for MAUI app startup logic and DI composition.", + "expandedLabel": "defines-type" + } + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28_registers_service_28", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28", + "semanticLabel": "IPlatformService", + "visibleLabel": "IPlatformService", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 28, + "includeInMetadata": true, + "payload": { + "outputSummary": "Registers platform abstraction implemented for MAUI", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29_registers_service_29", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29", + "semanticLabel": "INativeStorageService", + "visibleLabel": "INativeStorageService", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 29, + "includeInMetadata": true, + "payload": { + "outputSummary": "Registers platform native storage implementation", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32_registers_service_32", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32", + "semanticLabel": "NexusAuthenticationStateProvider", + "visibleLabel": "NexusAuthenticationStateProvider", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 32, + "includeInMetadata": true, + "payload": { + "outputSummary": "Concrete auth state provider registered", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33_registers_service_33", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33", + "semanticLabel": "Microsoft.AspNetCore.Components.Authorization.AuthenticationStateProvider", + "visibleLabel": "Microsoft.AspNetCore.Components.Authorization.AuthenticationStateProvider", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 33, + "includeInMetadata": true, + "payload": { + "outputSummary": "Maps framework AuthenticationStateProvider to NexusAuthenticationStateProvider via service locator factory", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38_registers_service_38", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38", + "semanticLabel": "HttpClient", + "visibleLabel": "HttpClient", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 38, + "includeInMetadata": true, + "payload": { + "outputSummary": "Registers HttpClient with BaseAddress = http://10.0.2.2:5000 (Android emulator to local server)", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1_registers_service_1", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1", + "semanticLabel": "UI and app state services", + "visibleLabel": "UI and app state services", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 1, + "includeInMetadata": true, + "payload": { + "outputSummary": "Registers multiple scoped services handling UI state, knowledge coordination, sync and identity", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51_registers_service_51", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51", + "semanticLabel": "Application layer services (extension)", + "visibleLabel": "Application layer services extension", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 51, + "includeInMetadata": true, + "payload": { + "outputSummary": "Calls AddApplication() extension to register Application-layer services", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53_registers_service_53", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53", + "semanticLabel": "MediatR handlers", + "visibleLabel": "MediatR handlers", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 53, + "includeInMetadata": true, + "payload": { + "outputSummary": "Registers MediatR and scans NexusReader.Application assembly for handlers", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61_defines_type_61", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61", + "semanticLabel": "model ThrowingDbContextFactory", + "visibleLabel": "model ThrowingDbContextFactory", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 61, + "includeInMetadata": true, + "payload": { + "outputSummary": "IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.", + "expandedLabel": "defines-type" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66_defines_type_66", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66", + "semanticLabel": "model ThrowingEmbeddingGenerator", + "visibleLabel": "model ThrowingEmbeddingGenerator", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 66, + "includeInMetadata": true, + "payload": { + "outputSummary": "IEmbeddingGenerator implementation that disables local embedding generation in WASM (throws on GenerateAsync).", + "expandedLabel": "defines-type" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74_defines_type_74", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74", + "semanticLabel": "model ThrowingBookStorageService", + "visibleLabel": "model ThrowingBookStorageService", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 74, + "includeInMetadata": true, + "payload": { + "outputSummary": "IBookStorageService implementation that throws for all file storage operations in WASM.", + "expandedLabel": "defines-type" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84_defines_type_84", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84", + "semanticLabel": "model ThrowingEbookRepository", + "visibleLabel": "model ThrowingEbookRepository", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 84, + "includeInMetadata": true, + "payload": { + "outputSummary": "IEbookRepository implementation that throws for all repository operations in WASM.", + "expandedLabel": "defines-type" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94_defines_type_94", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94", + "semanticLabel": "model ThrowingSyncBroadcaster", + "visibleLabel": "model ThrowingSyncBroadcaster", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 94, + "includeInMetadata": true, + "payload": { + "outputSummary": "ISyncBroadcaster implementation that throws because real-time broadcasting must run on the server.", + "expandedLabel": "defines-type" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_webplatformservice_18_registers_service_18", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_webplatformservice_18", + "semanticLabel": "IPlatformService", + "visibleLabel": "IPlatformService", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 18, + "includeInMetadata": true, + "payload": { + "outputSummary": "Registers platform abstraction for browser.", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33_registers_service_33", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33", + "semanticLabel": "NexusAuthenticationStateProvider", + "visibleLabel": "NexusAuthenticationStateProvider", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 33, + "includeInMetadata": true, + "payload": { + "outputSummary": "Authentication state provider and wiring to AuthenticationStateProvider.", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38_registers_service_38", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38", + "semanticLabel": "IKnowledgeService", + "visibleLabel": "IKnowledgeService", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 38, + "includeInMetadata": true, + "payload": { + "outputSummary": "Registers a WASM-specific knowledge service implementation.", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_configured_httpclient_40_registers_service_40", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_configured_httpclient_40", + "semanticLabel": "HttpClient (named 'NexusAPI')", + "visibleLabel": "uses", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 40, + "includeInMetadata": true, + "payload": { + "outputSummary": "Adds named HTTP client with base address and authentication header handler.", + "expandedLabel": "registers-service" + } + } + ], + "metadata": { + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs", + "NexusReader.Web.Client/Program.cs", + "NexusReader.Web/Program.cs", + "NexusReader.Application/DependencyInjection.cs", + "NexusReader.Infrastructure/DependencyInjection.cs", + "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "NexusReader.Application/DTOs/User/AuthorDto.cs", + "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "NexusReader.Domain/Entities/Author.cs", + "NexusReader.UI.Shared/Layout/AuthLayout.razor", + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "NexusReader.UI.Shared/Pages/Account/Login.razor", + "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "NexusReader.UI.Shared/Pages/Account/Register.razor", + "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "NexusReader.Infrastructure/Services/BookStorageService.cs", + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs" + ] + }, + "subgraphs": [] + }, + { + "id": "startup_runtime_graph", + "kind": "primary-runtime", + "title": "Startup and Service Registration Flow", + "direction": "TD", + "nodes": [ + { + "id": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "kind": "service", + "label": "MauiProgram", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 1 + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28", + "kind": "dependency", + "label": "MauiPlatformService", + "shape": "doc", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 28 + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29", + "kind": "dependency", + "label": "MauiStorageService", + "shape": "doc", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 29 + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32", + "kind": "dependency", + "label": "NexusAuthenticationStateProvider", + "shape": "doc", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 32 + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33", + "kind": "dependency", + "label": "NexusAuthenticationStateProvider (via factory)", + "shape": "doc", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 33 + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38", + "kind": "dependency", + "label": "HttpClient (configured)", + "shape": "doc", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 38 + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1", + "kind": "dependency", + "label": "ThemeService, FocusModeService, QuizStateService, ReaderNavigationService, KnowledgeGraphService, ReaderInteractionService, KnowledgeCoordinator, SyncService, IdentityService", + "shape": "doc", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 1 + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51", + "kind": "dependency", + "label": "NexusReader.Application registrations", + "shape": "doc", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 51 + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53", + "kind": "dependency", + "label": "Handlers from NexusReader.Application assembly", + "shape": "doc", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 53 + }, + { + "id": "flow_method_nexusreader_maui_mauiprogram_cs_create_and_build_mauiapp_16", + "kind": "method", + "label": "Create and build MauiApp", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 16 + }, + { + "id": "flow_file_nexusreader_web_client_program_cs_file_1", + "kind": "service", + "label": "Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 1 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_webplatformservice_18", + "kind": "dependency", + "label": "WebPlatformService", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 18 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33", + "kind": "dependency", + "label": "NexusAuthenticationStateProvider", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 33 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38", + "kind": "dependency", + "label": "WasmKnowledgeService", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 38 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_configured_httpclient_40", + "kind": "dependency", + "label": "configured HttpClient", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 40 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49", + "kind": "dependency", + "label": "ThrowingDbContextFactory", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 49 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_n_a_55", + "kind": "dependency", + "label": "N/A", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 55 + } + ], + "edges": [ + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28_registers_service_28", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28", + "semanticLabel": "IPlatformService", + "visibleLabel": "IPlatformService", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 28, + "includeInMetadata": true, + "payload": { + "outputSummary": "Registers platform abstraction implemented for MAUI", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29_registers_service_29", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29", + "semanticLabel": "INativeStorageService", + "visibleLabel": "INativeStorageService", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 29, + "includeInMetadata": true, + "payload": { + "outputSummary": "Registers platform native storage implementation", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32_registers_service_32", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32", + "semanticLabel": "NexusAuthenticationStateProvider", + "visibleLabel": "NexusAuthenticationStateProvider", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 32, + "includeInMetadata": true, + "payload": { + "outputSummary": "Concrete auth state provider registered", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33_registers_service_33", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33", + "semanticLabel": "Microsoft.AspNetCore.Components.Authorization.AuthenticationStateProvider", + "visibleLabel": "Microsoft.AspNetCore.Components.Authorization.AuthenticationStateProvider", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 33, + "includeInMetadata": true, + "payload": { + "outputSummary": "Maps framework AuthenticationStateProvider to NexusAuthenticationStateProvider via service locator factory", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38_registers_service_38", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38", + "semanticLabel": "HttpClient", + "visibleLabel": "HttpClient", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 38, + "includeInMetadata": true, + "payload": { + "outputSummary": "Registers HttpClient with BaseAddress = http://10.0.2.2:5000 (Android emulator to local server)", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1_registers_service_1", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1", + "semanticLabel": "UI and app state services", + "visibleLabel": "UI and app state services", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 1, + "includeInMetadata": true, + "payload": { + "outputSummary": "Registers multiple scoped services handling UI state, knowledge coordination, sync and identity", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51_registers_service_51", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51", + "semanticLabel": "Application layer services (extension)", + "visibleLabel": "Application layer services extension", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 51, + "includeInMetadata": true, + "payload": { + "outputSummary": "Calls AddApplication() extension to register Application-layer services", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53_registers_service_53", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53", + "semanticLabel": "MediatR handlers", + "visibleLabel": "MediatR handlers", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 53, + "includeInMetadata": true, + "payload": { + "outputSummary": "Registers MediatR and scans NexusReader.Application assembly for handlers", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_method_nexusreader_maui_mauiprogram_cs_create_and_build_mauiapp_16_configures_pipeline_16", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_method_nexusreader_maui_mauiprogram_cs_create_and_build_mauiapp_16", + "semanticLabel": "unknown", + "visibleLabel": "unknown", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 16, + "includeInMetadata": true, + "payload": { + "outputSummary": "unknown", + "expandedLabel": "configures-pipeline" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_webplatformservice_18_registers_service_18", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_webplatformservice_18", + "semanticLabel": "IPlatformService", + "visibleLabel": "IPlatformService", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 18, + "includeInMetadata": true, + "payload": { + "outputSummary": "Registers platform abstraction for browser.", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33_registers_service_33", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33", + "semanticLabel": "NexusAuthenticationStateProvider", + "visibleLabel": "NexusAuthenticationStateProvider", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 33, + "includeInMetadata": true, + "payload": { + "outputSummary": "Authentication state provider and wiring to AuthenticationStateProvider.", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38_registers_service_38", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38", + "semanticLabel": "IKnowledgeService", + "visibleLabel": "IKnowledgeService", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 38, + "includeInMetadata": true, + "payload": { + "outputSummary": "Registers a WASM-specific knowledge service implementation.", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_configured_httpclient_40_registers_service_40", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_configured_httpclient_40", + "semanticLabel": "HttpClient (named 'NexusAPI')", + "visibleLabel": "uses", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 40, + "includeInMetadata": true, + "payload": { + "outputSummary": "Adds named HTTP client with base address and authentication header handler.", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49_registers_service_49", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49", + "semanticLabel": "IDbContextFactory", + "visibleLabel": "IDbContextFactory AppDbContext>", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 49, + "includeInMetadata": true, + "payload": { + "outputSummary": "Registers throw-only stub to avoid using DbContext in WASM.", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_n_a_55_registers_service_55", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_n_a_55", + "semanticLabel": "application services (via extension)", + "visibleLabel": "application services via extension", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 55, + "includeInMetadata": true, + "payload": { + "outputSummary": "Calls AddApplication() to register application-layer services.", + "expandedLabel": "registers-service" + } + } + ], + "subgraphs": [ + { + "id": "flow_1_nexusreader_web_client_program_cs", + "label": "Program.cs" + }, + { + "id": "flow_2_nexusreader_maui_mauiprogram_cs", + "label": "MauiProgram" + }, + { + "id": "Node_xref_business_overview_md_authentication_login_register_flow", + "label": "Authentication (Login/Register) Flow" + }, + { + "id": "Node_xref_business_overview_md_http_request_token_refresh_flow", + "label": "HTTP Request + Token Refresh Flow" + }, + { + "id": "Node_xref_business_overview_md_knowledge_query_api_flow", + "label": "Knowledge Query API Flow" + } + ], + "metadata": { + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs", + "NexusReader.Web.Client/Program.cs", + "NexusReader.Web/Program.cs", + "NexusReader.Application/DependencyInjection.cs", + "NexusReader.Infrastructure/DependencyInjection.cs", + "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "NexusReader.Application/DTOs/User/AuthorDto.cs", + "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "NexusReader.Domain/Entities/Author.cs", + "NexusReader.UI.Shared/Layout/AuthLayout.razor", + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "NexusReader.UI.Shared/Pages/Account/Login.razor", + "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "NexusReader.UI.Shared/Pages/Account/Register.razor", + "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "NexusReader.Infrastructure/Services/BookStorageService.cs", + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs" + ] + } + }, + { + "id": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "kind": "primary-runtime", + "title": "Program.cs Flow", + "direction": "TD", + "nodes": [ + { + "id": "flow_file_nexusreader_web_client_program_cs_file_1", + "kind": "service", + "label": "Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 1 + }, + { + "id": "flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15", + "kind": "method", + "label": "Program (top-level startup)", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 15 + }, + { + "id": "flow_method_nexusreader_web_client_program_cs_getservice_71", + "kind": "method", + "label": "GetService", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 71 + }, + { + "id": "flow_action_nexusreader_web_client_program_cs_getservice_return_71_71", + "kind": "return", + "label": "returns null", + "shape": "stadium", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 71 + }, + { + "id": "flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88", + "kind": "method", + "label": "FindAuthorByNameAsync", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 88 + }, + { + "id": "flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88", + "kind": "step", + "label": "Reads repository or persistence state", + "shape": "rect", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 88 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61", + "kind": "dependency", + "label": "ThrowingDbContextFactory", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 61 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66", + "kind": "dependency", + "label": "ThrowingEmbeddingGenerator", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 66 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74", + "kind": "dependency", + "label": "ThrowingBookStorageService", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 74 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84", + "kind": "dependency", + "label": "ThrowingEbookRepository", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 84 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94", + "kind": "dependency", + "label": "ThrowingSyncBroadcaster", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 94 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_webplatformservice_18", + "kind": "dependency", + "label": "WebPlatformService", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 18 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33", + "kind": "dependency", + "label": "NexusAuthenticationStateProvider", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 33 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38", + "kind": "dependency", + "label": "WasmKnowledgeService", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 38 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_configured_httpclient_40", + "kind": "dependency", + "label": "configured HttpClient", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 40 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49", + "kind": "dependency", + "label": "ThrowingDbContextFactory", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 49 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_n_a_55", + "kind": "dependency", + "label": "N/A", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 55 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_wasmepubreader_56", + "kind": "dependency", + "label": "WasmEpubReader", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 56 + }, + { + "id": "flow_method_nexusreader_web_client_program_cs_run_wasm_host_59", + "kind": "method", + "label": "Run WASM Host", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 59 + }, + { + "id": "flow_file_nexusreader_web_program_cs_file_1", + "kind": "service", + "label": "Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 1 + }, + { + "id": "flow_method_nexusreader_web_program_cs_program_top_level_29", + "kind": "method", + "label": "Program (top-level)", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 29 + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "kind": "step", + "label": "Evaluates branch condition", + "shape": "diamond", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 62 + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "kind": "step", + "label": "Falls back to alternate path", + "shape": "diamond", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 66 + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125", + "kind": "step", + "label": "Reads repository or persistence state", + "shape": "rect", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 125 + } + ], + "edges": [ + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15_invokes_15", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15", + "semanticLabel": "Program (top-level startup)", + "visibleLabel": "Program top-level startup", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 15, + "includeInMetadata": true, + "payload": { + "outputSummary": "Create the WebAssemblyHostBuilder, register application and platform services, add HTTP client and dummy server-only stubs, then build and run the WASM host.", + "expandedLabel": "handles-route" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_getservice_71_invokes_71", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_method_nexusreader_web_client_program_cs_getservice_71", + "semanticLabel": "GetService", + "visibleLabel": "GetService", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 71, + "includeInMetadata": true, + "payload": { + "outputSummary": "Fallback service resolver stub that always returns null.", + "expandedLabel": "handles-route" + } + }, + { + "id": "edge_flow_method_nexusreader_web_client_program_cs_getservice_71_flow_action_nexusreader_web_client_program_cs_getservice_return_71_71_returns_71", + "from": "flow_method_nexusreader_web_client_program_cs_getservice_71", + "to": "flow_action_nexusreader_web_client_program_cs_getservice_return_71_71", + "semanticLabel": "returns null", + "visibleLabel": "returns null", + "relation": "returns", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 71, + "includeInMetadata": true, + "payload": { + "outputSummary": "public object? GetService(...) => null", + "expandedLabel": "returns" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88_invokes_88", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88", + "semanticLabel": "FindAuthorByNameAsync", + "visibleLabel": "FindAuthorByNameAsync", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 88, + "includeInMetadata": true, + "payload": { + "outputSummary": "Repository lookup stub that throws because repository access is unsupported in WASM.", + "expandedLabel": "handles-route" + } + }, + { + "id": "edge_flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88_flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88_invokes_88", + "from": "flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88", + "to": "flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88", + "semanticLabel": "Reads repository or persistence state", + "visibleLabel": "Reads repository or persistence state", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 88, + "includeInMetadata": true, + "payload": { + "outputSummary": "public Task FindAuthorByNameAsync(string name, CancellationToken cancellationToken = default) => throw new NotSupportedException(ErrorMessage);", + "expandedLabel": "invokes" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61_defines_type_61", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61", + "semanticLabel": "model ThrowingDbContextFactory", + "visibleLabel": "model ThrowingDbContextFactory", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 61, + "includeInMetadata": true, + "payload": { + "outputSummary": "IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.", + "expandedLabel": "defines-type" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66_defines_type_66", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66", + "semanticLabel": "model ThrowingEmbeddingGenerator", + "visibleLabel": "model ThrowingEmbeddingGenerator", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 66, + "includeInMetadata": true, + "payload": { + "outputSummary": "IEmbeddingGenerator implementation that disables local embedding generation in WASM (throws on GenerateAsync).", + "expandedLabel": "defines-type" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74_defines_type_74", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74", + "semanticLabel": "model ThrowingBookStorageService", + "visibleLabel": "model ThrowingBookStorageService", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 74, + "includeInMetadata": true, + "payload": { + "outputSummary": "IBookStorageService implementation that throws for all file storage operations in WASM.", + "expandedLabel": "defines-type" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84_defines_type_84", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84", + "semanticLabel": "model ThrowingEbookRepository", + "visibleLabel": "model ThrowingEbookRepository", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 84, + "includeInMetadata": true, + "payload": { + "outputSummary": "IEbookRepository implementation that throws for all repository operations in WASM.", + "expandedLabel": "defines-type" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94_defines_type_94", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94", + "semanticLabel": "model ThrowingSyncBroadcaster", + "visibleLabel": "model ThrowingSyncBroadcaster", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 94, + "includeInMetadata": true, + "payload": { + "outputSummary": "ISyncBroadcaster implementation that throws because real-time broadcasting must run on the server.", + "expandedLabel": "defines-type" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_webplatformservice_18_registers_service_18", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_webplatformservice_18", + "semanticLabel": "IPlatformService", + "visibleLabel": "IPlatformService", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 18, + "includeInMetadata": true, + "payload": { + "outputSummary": "Registers platform abstraction for browser.", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33_registers_service_33", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33", + "semanticLabel": "NexusAuthenticationStateProvider", + "visibleLabel": "NexusAuthenticationStateProvider", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 33, + "includeInMetadata": true, + "payload": { + "outputSummary": "Authentication state provider and wiring to AuthenticationStateProvider.", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38_registers_service_38", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38", + "semanticLabel": "IKnowledgeService", + "visibleLabel": "IKnowledgeService", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 38, + "includeInMetadata": true, + "payload": { + "outputSummary": "Registers a WASM-specific knowledge service implementation.", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_configured_httpclient_40_registers_service_40", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_configured_httpclient_40", + "semanticLabel": "HttpClient (named 'NexusAPI')", + "visibleLabel": "uses", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 40, + "includeInMetadata": true, + "payload": { + "outputSummary": "Adds named HTTP client with base address and authentication header handler.", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49_registers_service_49", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49", + "semanticLabel": "IDbContextFactory", + "visibleLabel": "IDbContextFactory AppDbContext>", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 49, + "includeInMetadata": true, + "payload": { + "outputSummary": "Registers throw-only stub to avoid using DbContext in WASM.", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_n_a_55_registers_service_55", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_n_a_55", + "semanticLabel": "application services (via extension)", + "visibleLabel": "application services via extension", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 55, + "includeInMetadata": true, + "payload": { + "outputSummary": "Calls AddApplication() to register application-layer services.", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_wasmepubreader_56_registers_service_56", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_wasmepubreader_56", + "semanticLabel": "IEpubReader", + "visibleLabel": "IEpubReader", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 56, + "includeInMetadata": true, + "payload": { + "outputSummary": "Registers WASM epub reader implementation.", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_run_wasm_host_59_configures_pipeline_59", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_method_nexusreader_web_client_program_cs_run_wasm_host_59", + "semanticLabel": "unknown", + "visibleLabel": "unknown", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 59, + "includeInMetadata": true, + "payload": { + "outputSummary": "unknown", + "expandedLabel": "configures-pipeline" + } + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_program_top_level_29_invokes_29", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_method_nexusreader_web_program_cs_program_top_level_29", + "semanticLabel": "Program (top-level)", + "visibleLabel": "Program top-level", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 29, + "includeInMetadata": true, + "payload": { + "outputSummary": "Top-level program: build host, register services and middleware, map routes/endpoints, run the app.", + "expandedLabel": "handles-route" + } + }, + { + "id": "edge_flow_method_nexusreader_web_program_cs_program_top_level_29_flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62_evaluates_condition_62", + "from": "flow_method_nexusreader_web_program_cs_program_top_level_29", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "semanticLabel": "true / false", + "visibleLabel": "true / false", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 62, + "includeInMetadata": true, + "payload": { + "outputSummary": "if (!string.IsNullOrEmpty(apiBaseUrl))", + "expandedLabel": "evaluates-condition" + } + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_falls_back_66", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "semanticLabel": "fallback", + "visibleLabel": "fallback", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 66, + "includeInMetadata": true, + "payload": { + "outputSummary": "else", + "expandedLabel": "falls-back" + } + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125_invokes_125", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125", + "semanticLabel": "Reads repository or persistence state", + "visibleLabel": "Reads repository or persistence state", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 125, + "includeInMetadata": true, + "payload": { + "outputSummary": "var isApiRequest = context.Request.Path.StartsWithSegments(\"/api\") ||", + "expandedLabel": "invokes" + } + } + ], + "subgraphs": [ + { + "id": "flow_1_nexusreader_web_client_program_cs", + "label": "Program.cs" + }, + { + "id": "flow_2_nexusreader_maui_mauiprogram_cs", + "label": "MauiProgram" + }, + { + "id": "flow_0_nexusreader_web_program_cs", + "label": "Program.cs" + } + ], + "metadata": { + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs", + "NexusReader.Web.Client/Program.cs", + "NexusReader.Web/Program.cs", + "NexusReader.Application/DependencyInjection.cs", + "NexusReader.Infrastructure/DependencyInjection.cs", + "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "NexusReader.Application/DTOs/User/AuthorDto.cs", + "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "NexusReader.Domain/Entities/Author.cs", + "NexusReader.UI.Shared/Layout/AuthLayout.razor", + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "NexusReader.UI.Shared/Pages/Account/Login.razor", + "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "NexusReader.UI.Shared/Pages/Account/Register.razor", + "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "NexusReader.Infrastructure/Services/BookStorageService.cs", + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs" + ] + } + }, + { + "id": "control_flow_flow_1_nexusreader_web_client_program_cs", + "kind": "control-flow", + "title": "Program.cs Execution Control Flow", + "direction": "TD", + "nodes": [ + { + "id": "flow_file_nexusreader_web_client_program_cs_file_1", + "kind": "service", + "label": "Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 1 + }, + { + "id": "flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15", + "kind": "method", + "label": "Program (top-level startup)", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 15 + }, + { + "id": "flow_method_nexusreader_web_client_program_cs_getservice_71", + "kind": "method", + "label": "GetService", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 71 + }, + { + "id": "flow_action_nexusreader_web_client_program_cs_getservice_return_71_71", + "kind": "return", + "label": "returns null", + "shape": "stadium", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 71 + }, + { + "id": "flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88", + "kind": "method", + "label": "FindAuthorByNameAsync", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 88 + }, + { + "id": "flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88", + "kind": "step", + "label": "Reads repository or persistence state", + "shape": "rect", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 88 + }, + { + "id": "flow_method_nexusreader_web_client_program_cs_run_wasm_host_59", + "kind": "method", + "label": "Run WASM Host", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 59 + }, + { + "id": "flow_file_nexusreader_web_program_cs_file_1", + "kind": "service", + "label": "Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 1 + }, + { + "id": "flow_method_nexusreader_web_program_cs_program_top_level_29", + "kind": "method", + "label": "Program (top-level)", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 29 + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "kind": "step", + "label": "Evaluates branch condition", + "shape": "diamond", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 62 + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "kind": "step", + "label": "Falls back to alternate path", + "shape": "diamond", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 66 + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125", + "kind": "step", + "label": "Reads repository or persistence state", + "shape": "rect", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 125 + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_126_126", + "kind": "step", + "label": "Reads repository or persistence state", + "shape": "rect", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 126 + }, + { + "id": "flow_method_nexusreader_application_dependencyinjection_cs_addapplication_8", + "kind": "method", + "label": "AddApplication", + "sourcePath": "NexusReader.Application/DependencyInjection.cs", + "sourceLine": 8 + }, + { + "id": "flow_method_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_31", + "kind": "method", + "label": "AddInfrastructure", + "sourcePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 31 + } + ], + "edges": [ + { + "id": "edge_flow_method_nexusreader_web_client_program_cs_getservice_71_flow_action_nexusreader_web_client_program_cs_getservice_return_71_71_returns_71", + "from": "flow_method_nexusreader_web_client_program_cs_getservice_71", + "to": "flow_action_nexusreader_web_client_program_cs_getservice_return_71_71", + "semanticLabel": "returns null", + "visibleLabel": "returns null", + "relation": "returns", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 71, + "includeInMetadata": true, + "payload": { + "outputSummary": "public object? GetService(...) => null", + "expandedLabel": "returns" + } + }, + { + "id": "edge_flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88_flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88_invokes_88", + "from": "flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88", + "to": "flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88", + "semanticLabel": "Reads repository or persistence state", + "visibleLabel": "Reads repository or persistence state", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 88, + "includeInMetadata": true, + "payload": { + "outputSummary": "public Task FindAuthorByNameAsync(string name, CancellationToken cancellationToken = default) => throw new NotSupportedException(ErrorMessage);", + "expandedLabel": "invokes" + } + }, + { + "id": "edge_flow_method_nexusreader_web_program_cs_program_top_level_29_flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62_evaluates_condition_62", + "from": "flow_method_nexusreader_web_program_cs_program_top_level_29", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "semanticLabel": "true / false", + "visibleLabel": "true / false", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 62, + "includeInMetadata": true, + "payload": { + "outputSummary": "if (!string.IsNullOrEmpty(apiBaseUrl))", + "expandedLabel": "evaluates-condition" + } + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_falls_back_66", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "semanticLabel": "fallback", + "visibleLabel": "fallback", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 66, + "includeInMetadata": true, + "payload": { + "outputSummary": "else", + "expandedLabel": "falls-back" + } + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125_invokes_125", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125", + "semanticLabel": "Reads repository or persistence state", + "visibleLabel": "Reads repository or persistence state", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 125, + "includeInMetadata": true, + "payload": { + "outputSummary": "var isApiRequest = context.Request.Path.StartsWithSegments(\"/api\") ||", + "expandedLabel": "invokes" + } + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_126_126_invokes_126", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_126_126", + "semanticLabel": "Reads repository or persistence state", + "visibleLabel": "Reads repository or persistence state", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 126, + "includeInMetadata": true, + "payload": { + "outputSummary": "context.Request.Path.StartsWithSegments(\"/identity\") ||", + "expandedLabel": "invokes" + } + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_flow_method_nexusreader_application_dependencyinjection_cs_addapplication_8_uses_service_78", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "to": "flow_method_nexusreader_application_dependencyinjection_cs_addapplication_8", + "semanticLabel": "AddApplication", + "visibleLabel": "AddApplication", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 78, + "includeInMetadata": true, + "payload": { + "outputSummary": "IServiceCollection", + "expandedLabel": "uses-service" + } + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_flow_method_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_31_uses_service_79", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "to": "flow_method_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_31", + "semanticLabel": "AddInfrastructure", + "visibleLabel": "AddInfrastructure", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 79, + "includeInMetadata": true, + "payload": { + "outputSummary": "IServiceCollection, IConfiguration", + "expandedLabel": "uses-service" + } + } + ], + "subgraphs": [ + { + "id": "NexusReader_Web_Client_Program", + "label": "Program" + }, + { + "id": "NexusReader_Web_Program", + "label": "Program" + }, + { + "id": "NexusReader_Application_DependencyInjection", + "label": "DependencyInjection" + }, + { + "id": "NexusReader_Infrastructure_DependencyInjection", + "label": "DependencyInjection" + } + ], + "metadata": { + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs", + "NexusReader.Web.Client/Program.cs", + "NexusReader.Web/Program.cs", + "NexusReader.Application/DependencyInjection.cs", + "NexusReader.Infrastructure/DependencyInjection.cs", + "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "NexusReader.Application/DTOs/User/AuthorDto.cs", + "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "NexusReader.Domain/Entities/Author.cs", + "NexusReader.UI.Shared/Layout/AuthLayout.razor", + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "NexusReader.UI.Shared/Pages/Account/Login.razor", + "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "NexusReader.UI.Shared/Pages/Account/Register.razor", + "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "NexusReader.Infrastructure/Services/BookStorageService.cs", + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs" + ] + } + }, + { + "id": "contracts_flow_1_nexusreader_web_client_program_cs", + "kind": "class-diagram", + "title": "Program.cs Contracts and Entities", + "direction": "LR", + "nodes": [ + { + "id": "flow_file_nexusreader_web_client_program_cs_file_1", + "kind": "service", + "label": "Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 1 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61", + "kind": "dependency", + "label": "ThrowingDbContextFactory", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 61 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66", + "kind": "dependency", + "label": "ThrowingEmbeddingGenerator", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 66 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74", + "kind": "dependency", + "label": "ThrowingBookStorageService", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 74 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84", + "kind": "dependency", + "label": "ThrowingEbookRepository", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 84 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94", + "kind": "dependency", + "label": "ThrowingSyncBroadcaster", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 94 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_webplatformservice_18", + "kind": "dependency", + "label": "WebPlatformService", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 18 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33", + "kind": "dependency", + "label": "NexusAuthenticationStateProvider", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 33 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38", + "kind": "dependency", + "label": "WasmKnowledgeService", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 38 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_configured_httpclient_40", + "kind": "dependency", + "label": "configured HttpClient", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 40 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49", + "kind": "dependency", + "label": "ThrowingDbContextFactory", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 49 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_n_a_55", + "kind": "dependency", + "label": "N/A", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 55 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_wasmepubreader_56", + "kind": "dependency", + "label": "WasmEpubReader", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 56 + }, + { + "id": "flow_file_nexusreader_web_program_cs_file_1", + "kind": "service", + "label": "Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 1 + }, + { + "id": "flow_type_nexusreader_web_program_cs_knowledgerequest_566", + "kind": "dependency", + "label": "KnowledgeRequest", + "shape": "doc", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 566 + }, + { + "id": "flow_type_nexusreader_web_program_cs_groundednessrequest_567", + "kind": "dependency", + "label": "GroundednessRequest", + "shape": "doc", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 567 + }, + { + "id": "flow_type_nexusreader_web_program_cs_semanticsearchrequest_568", + "kind": "dependency", + "label": "SemanticSearchRequest", + "shape": "doc", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 568 + }, + { + "id": "flow_type_nexusreader_web_program_cs_askquestionrequest_569", + "kind": "dependency", + "label": "AskQuestionRequest", + "shape": "doc", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 569 + } + ], + "edges": [ + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61_defines_type_61", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61", + "semanticLabel": "model ThrowingDbContextFactory", + "visibleLabel": "model ThrowingDbContextFactory", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 61, + "includeInMetadata": true, + "payload": { + "outputSummary": "IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.", + "expandedLabel": "defines-type" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66_defines_type_66", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66", + "semanticLabel": "model ThrowingEmbeddingGenerator", + "visibleLabel": "model ThrowingEmbeddingGenerator", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 66, + "includeInMetadata": true, + "payload": { + "outputSummary": "IEmbeddingGenerator implementation that disables local embedding generation in WASM (throws on GenerateAsync).", + "expandedLabel": "defines-type" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74_defines_type_74", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74", + "semanticLabel": "model ThrowingBookStorageService", + "visibleLabel": "model ThrowingBookStorageService", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 74, + "includeInMetadata": true, + "payload": { + "outputSummary": "IBookStorageService implementation that throws for all file storage operations in WASM.", + "expandedLabel": "defines-type" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84_defines_type_84", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84", + "semanticLabel": "model ThrowingEbookRepository", + "visibleLabel": "model ThrowingEbookRepository", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 84, + "includeInMetadata": true, + "payload": { + "outputSummary": "IEbookRepository implementation that throws for all repository operations in WASM.", + "expandedLabel": "defines-type" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94_defines_type_94", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94", + "semanticLabel": "model ThrowingSyncBroadcaster", + "visibleLabel": "model ThrowingSyncBroadcaster", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 94, + "includeInMetadata": true, + "payload": { + "outputSummary": "ISyncBroadcaster implementation that throws because real-time broadcasting must run on the server.", + "expandedLabel": "defines-type" + } + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_knowledgerequest_566_maps_dto_566", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_type_nexusreader_web_program_cs_knowledgerequest_566", + "semanticLabel": "dto KnowledgeRequest", + "visibleLabel": "dto KnowledgeRequest", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 566, + "includeInMetadata": true, + "payload": { + "outputSummary": "Request DTO carrying free-text input and optional ebook context for knowledge APIs.", + "expandedLabel": "maps-dto" + } + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_groundednessrequest_567_maps_dto_567", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_type_nexusreader_web_program_cs_groundednessrequest_567", + "semanticLabel": "dto GroundednessRequest", + "visibleLabel": "dto GroundednessRequest", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 567, + "includeInMetadata": true, + "payload": { + "outputSummary": "Request DTO for verifying answer groundedness in a context.", + "expandedLabel": "maps-dto" + } + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_semanticsearchrequest_568_maps_dto_568", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_type_nexusreader_web_program_cs_semanticsearchrequest_568", + "semanticLabel": "dto SemanticSearchRequest", + "visibleLabel": "dto SemanticSearchRequest", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 568, + "includeInMetadata": true, + "payload": { + "outputSummary": "DTO for semantic search requests with a limit.", + "expandedLabel": "maps-dto" + } + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_askquestionrequest_569_maps_dto_569", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_type_nexusreader_web_program_cs_askquestionrequest_569", + "semanticLabel": "dto AskQuestionRequest", + "visibleLabel": "dto AskQuestionRequest", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 569, + "includeInMetadata": true, + "payload": { + "outputSummary": "DTO for question-asking APIs including optional ebook context and limit.", + "expandedLabel": "maps-dto" + } + } + ], + "metadata": { + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs", + "NexusReader.Web.Client/Program.cs", + "NexusReader.Web/Program.cs", + "NexusReader.Application/DependencyInjection.cs", + "NexusReader.Infrastructure/DependencyInjection.cs", + "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "NexusReader.Application/DTOs/User/AuthorDto.cs", + "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "NexusReader.Domain/Entities/Author.cs", + "NexusReader.UI.Shared/Layout/AuthLayout.razor", + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "NexusReader.UI.Shared/Pages/Account/Login.razor", + "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "NexusReader.UI.Shared/Pages/Account/Register.razor", + "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "NexusReader.Infrastructure/Services/BookStorageService.cs", + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs" + ], + "previewCompatibility": { + "preferredSurface": "two-d", + "fallback": "open-2d-preview", + "reason": "class-diagram is preserved for 2D Mermaid rendering while 3D preview stays flowchart-only." + } + }, + "subgraphs": [] + }, + { + "id": "layer_flow_1_nexusreader_web_client_program_cs", + "kind": "dependency-map", + "title": "Program.cs Layer View", + "direction": "LR", + "nodes": [ + { + "id": "flow_file_nexusreader_web_client_program_cs_file_1", + "kind": "service", + "label": "Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 1, + "subgraphId": "layer_frontend" + }, + { + "id": "flow_action_nexusreader_web_client_program_cs_getservice_return_71_71", + "kind": "return", + "label": "returns null", + "shape": "stadium", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 71, + "subgraphId": "layer_frontend" + }, + { + "id": "flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88", + "kind": "step", + "label": "Reads repository or persistence state", + "shape": "rect", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 88, + "subgraphId": "layer_frontend" + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61", + "kind": "dependency", + "label": "ThrowingDbContextFactory", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 61, + "subgraphId": "layer_frontend" + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66", + "kind": "dependency", + "label": "ThrowingEmbeddingGenerator", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 66, + "subgraphId": "layer_frontend" + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74", + "kind": "dependency", + "label": "ThrowingBookStorageService", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 74, + "subgraphId": "layer_frontend" + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84", + "kind": "dependency", + "label": "ThrowingEbookRepository", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 84, + "subgraphId": "layer_frontend" + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94", + "kind": "dependency", + "label": "ThrowingSyncBroadcaster", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 94, + "subgraphId": "layer_frontend" + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_webplatformservice_18", + "kind": "dependency", + "label": "WebPlatformService", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 18, + "subgraphId": "layer_frontend" + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33", + "kind": "dependency", + "label": "NexusAuthenticationStateProvider", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 33, + "subgraphId": "layer_frontend" + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38", + "kind": "dependency", + "label": "WasmKnowledgeService", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 38, + "subgraphId": "layer_frontend" + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_configured_httpclient_40", + "kind": "dependency", + "label": "configured HttpClient", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 40, + "subgraphId": "layer_frontend" + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49", + "kind": "dependency", + "label": "ThrowingDbContextFactory", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 49, + "subgraphId": "layer_frontend" + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_n_a_55", + "kind": "dependency", + "label": "N/A", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 55, + "subgraphId": "layer_frontend" + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_wasmepubreader_56", + "kind": "dependency", + "label": "WasmEpubReader", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 56, + "subgraphId": "layer_frontend" + }, + { + "id": "flow_file_nexusreader_web_program_cs_file_1", + "kind": "service", + "label": "Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 1, + "subgraphId": "layer_application" + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "kind": "step", + "label": "Evaluates branch condition", + "shape": "diamond", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 62, + "subgraphId": "layer_application" + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "kind": "step", + "label": "Falls back to alternate path", + "shape": "diamond", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 66, + "subgraphId": "layer_application" + } + ], + "edges": [ + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61_defines_type_61", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61", + "semanticLabel": "model ThrowingDbContextFactory", + "visibleLabel": "model ThrowingDbContextFactory", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 61, + "includeInMetadata": true, + "payload": { + "outputSummary": "IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.", + "expandedLabel": "defines-type" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66_defines_type_66", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66", + "semanticLabel": "model ThrowingEmbeddingGenerator", + "visibleLabel": "model ThrowingEmbeddingGenerator", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 66, + "includeInMetadata": true, + "payload": { + "outputSummary": "IEmbeddingGenerator implementation that disables local embedding generation in WASM (throws on GenerateAsync).", + "expandedLabel": "defines-type" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74_defines_type_74", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74", + "semanticLabel": "model ThrowingBookStorageService", + "visibleLabel": "model ThrowingBookStorageService", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 74, + "includeInMetadata": true, + "payload": { + "outputSummary": "IBookStorageService implementation that throws for all file storage operations in WASM.", + "expandedLabel": "defines-type" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84_defines_type_84", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84", + "semanticLabel": "model ThrowingEbookRepository", + "visibleLabel": "model ThrowingEbookRepository", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 84, + "includeInMetadata": true, + "payload": { + "outputSummary": "IEbookRepository implementation that throws for all repository operations in WASM.", + "expandedLabel": "defines-type" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94_defines_type_94", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94", + "semanticLabel": "model ThrowingSyncBroadcaster", + "visibleLabel": "model ThrowingSyncBroadcaster", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 94, + "includeInMetadata": true, + "payload": { + "outputSummary": "ISyncBroadcaster implementation that throws because real-time broadcasting must run on the server.", + "expandedLabel": "defines-type" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_webplatformservice_18_registers_service_18", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_webplatformservice_18", + "semanticLabel": "IPlatformService", + "visibleLabel": "IPlatformService", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 18, + "includeInMetadata": true, + "payload": { + "outputSummary": "Registers platform abstraction for browser.", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33_registers_service_33", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33", + "semanticLabel": "NexusAuthenticationStateProvider", + "visibleLabel": "NexusAuthenticationStateProvider", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 33, + "includeInMetadata": true, + "payload": { + "outputSummary": "Authentication state provider and wiring to AuthenticationStateProvider.", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38_registers_service_38", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38", + "semanticLabel": "IKnowledgeService", + "visibleLabel": "IKnowledgeService", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 38, + "includeInMetadata": true, + "payload": { + "outputSummary": "Registers a WASM-specific knowledge service implementation.", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_configured_httpclient_40_registers_service_40", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_configured_httpclient_40", + "semanticLabel": "HttpClient (named 'NexusAPI')", + "visibleLabel": "uses", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 40, + "includeInMetadata": true, + "payload": { + "outputSummary": "Adds named HTTP client with base address and authentication header handler.", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49_registers_service_49", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49", + "semanticLabel": "IDbContextFactory", + "visibleLabel": "IDbContextFactory AppDbContext>", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 49, + "includeInMetadata": true, + "payload": { + "outputSummary": "Registers throw-only stub to avoid using DbContext in WASM.", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_n_a_55_registers_service_55", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_n_a_55", + "semanticLabel": "application services (via extension)", + "visibleLabel": "application services via extension", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 55, + "includeInMetadata": true, + "payload": { + "outputSummary": "Calls AddApplication() to register application-layer services.", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_wasmepubreader_56_registers_service_56", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_wasmepubreader_56", + "semanticLabel": "IEpubReader", + "visibleLabel": "IEpubReader", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 56, + "includeInMetadata": true, + "payload": { + "outputSummary": "Registers WASM epub reader implementation.", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_falls_back_66", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "semanticLabel": "fallback", + "visibleLabel": "fallback", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 66, + "includeInMetadata": true, + "payload": { + "outputSummary": "else", + "expandedLabel": "falls-back" + } + } + ], + "subgraphs": [ + { + "id": "layer_frontend", + "label": "frontend" + }, + { + "id": "layer_application", + "label": "application" + } + ], + "metadata": { + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs", + "NexusReader.Web.Client/Program.cs", + "NexusReader.Web/Program.cs", + "NexusReader.Application/DependencyInjection.cs", + "NexusReader.Infrastructure/DependencyInjection.cs", + "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "NexusReader.Application/DTOs/User/AuthorDto.cs", + "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "NexusReader.Domain/Entities/Author.cs", + "NexusReader.UI.Shared/Layout/AuthLayout.razor", + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "NexusReader.UI.Shared/Pages/Account/Login.razor", + "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "NexusReader.UI.Shared/Pages/Account/Register.razor", + "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "NexusReader.Infrastructure/Services/BookStorageService.cs", + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs" + ] + } + }, + { + "id": "failure_flow_1_nexusreader_web_client_program_cs", + "kind": "control-flow", + "title": "Program.cs Guardrails and Failure Paths", + "direction": "TD", + "nodes": [ + { + "id": "flow_method_nexusreader_web_client_program_cs_getservice_71", + "kind": "method", + "label": "GetService", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 71 + }, + { + "id": "flow_action_nexusreader_web_client_program_cs_getservice_return_71_71", + "kind": "return", + "label": "returns null", + "shape": "stadium", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 71 + }, + { + "id": "flow_method_nexusreader_web_program_cs_program_top_level_29", + "kind": "method", + "label": "Program (top-level)", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 29 + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "kind": "step", + "label": "Evaluates branch condition", + "shape": "diamond", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 62 + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "kind": "step", + "label": "Falls back to alternate path", + "shape": "diamond", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 66 + } + ], + "edges": [ + { + "id": "edge_flow_method_nexusreader_web_client_program_cs_getservice_71_flow_action_nexusreader_web_client_program_cs_getservice_return_71_71_returns_71", + "from": "flow_method_nexusreader_web_client_program_cs_getservice_71", + "to": "flow_action_nexusreader_web_client_program_cs_getservice_return_71_71", + "semanticLabel": "returns null", + "visibleLabel": "returns null", + "relation": "returns", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 71, + "includeInMetadata": true, + "payload": { + "outputSummary": "public object? GetService(...) => null", + "expandedLabel": "returns" + } + }, + { + "id": "edge_flow_method_nexusreader_web_program_cs_program_top_level_29_flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62_evaluates_condition_62", + "from": "flow_method_nexusreader_web_program_cs_program_top_level_29", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "semanticLabel": "true / false", + "visibleLabel": "true / false", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 62, + "includeInMetadata": true, + "payload": { + "outputSummary": "if (!string.IsNullOrEmpty(apiBaseUrl))", + "expandedLabel": "evaluates-condition" + } + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_falls_back_66", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "semanticLabel": "fallback", + "visibleLabel": "fallback", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 66, + "includeInMetadata": true, + "payload": { + "outputSummary": "else", + "expandedLabel": "falls-back" + } + } + ], + "subgraphs": [ + { + "id": "NexusReader_Web_Client_Program", + "label": "Program" + }, + { + "id": "NexusReader_Web_Program", + "label": "Program" + } + ], + "metadata": { + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs", + "NexusReader.Web.Client/Program.cs", + "NexusReader.Web/Program.cs", + "NexusReader.Application/DependencyInjection.cs", + "NexusReader.Infrastructure/DependencyInjection.cs", + "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "NexusReader.Application/DTOs/User/AuthorDto.cs", + "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "NexusReader.Domain/Entities/Author.cs", + "NexusReader.UI.Shared/Layout/AuthLayout.razor", + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "NexusReader.UI.Shared/Pages/Account/Login.razor", + "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "NexusReader.UI.Shared/Pages/Account/Register.razor", + "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "NexusReader.Infrastructure/Services/BookStorageService.cs", + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs" + ], + "warnings": [] + } + }, + { + "id": "method_flows_graph", + "kind": "method-flow", + "title": "Method Flow Details", + "direction": "TD", + "nodes": [ + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_237_237", + "kind": "step", + "label": "Evaluates branch condition", + "shape": "diamond", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 237 + }, + { + "id": "flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1", + "kind": "dependency", + "label": "SyncHub", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 1 + }, + { + "id": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_synchub_14", + "kind": "method", + "label": "SyncHub", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 14 + }, + { + "id": "flow_file_nexusreader_web_client_handlers_authenticationheaderhandler_cs_file_1", + "kind": "dependency", + "label": "AuthenticationHeaderHandler", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 1 + }, + { + "id": "flow_method_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_112", + "kind": "method", + "label": "CloneHttpRequestMessageAsync", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 112 + }, + { + "id": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_branch_119_119", + "kind": "step", + "label": "Evaluates branch condition", + "shape": "diamond", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 119 + }, + { + "id": "flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1", + "kind": "service", + "label": "EpubReaderService", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 1 + }, + { + "id": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_19", + "kind": "method", + "label": "UpdateProgress", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 19 + }, + { + "id": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_repository_read_21_21", + "kind": "step", + "label": "Reads repository or persistence state", + "shape": "rect", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 21 + }, + { + "id": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_28", + "kind": "method", + "label": "OnConnectedAsync", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 28 + }, + { + "id": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_repository_read_30_30", + "kind": "step", + "label": "Reads repository or persistence state", + "shape": "rect", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 30 + }, + { + "id": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_38", + "kind": "method", + "label": "OnDisconnectedAsync", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 38 + }, + { + "id": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_repository_read_40_40", + "kind": "step", + "label": "Reads repository or persistence state", + "shape": "rect", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 40 + }, + { + "id": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_175", + "kind": "method", + "label": "CountWords", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 175 + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_guard_clause_177_177", + "kind": "step", + "label": "Empty text check", + "shape": "diamond", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 177 + } + ], + "edges": [ + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_237_237_flow_method_nexusreader_infrastructure_realtime_synchub_cs_synchub_14_uses_service_247", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_237_237", + "to": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_synchub_14", + "semanticLabel": "SyncHub", + "visibleLabel": "SyncHub", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 247, + "includeInMetadata": true, + "payload": { + "outputSummary": "Hub mapping for realtime sync", + "expandedLabel": "uses-service" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_handlers_authenticationheaderhandler_cs_file_1_flow_method_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_112_invokes_112", + "from": "flow_file_nexusreader_web_client_handlers_authenticationheaderhandler_cs_file_1", + "to": "flow_method_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_112", + "semanticLabel": "CloneHttpRequestMessageAsync", + "visibleLabel": "CloneHttpRequestMessageAsync", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 112, + "includeInMetadata": true, + "payload": { + "outputSummary": "Creates a deep-ish clone of an HttpRequestMessage including method, URI, version, headers and buffered content to allow safe retry.", + "expandedLabel": "invokes" + } + }, + { + "id": "edge_flow_method_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_112_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_branch_119_119_evaluates_condition_119", + "from": "flow_method_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_112", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_branch_119_119", + "semanticLabel": "true / false", + "visibleLabel": "true / false", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 119, + "includeInMetadata": true, + "payload": { + "outputSummary": "if (req.Content != null)", + "expandedLabel": "evaluates-condition" + } + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1_flow_method_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_19_invokes_19", + "from": "flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_19", + "semanticLabel": "UpdateProgress", + "visibleLabel": "UpdateProgress", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 19, + "includeInMetadata": true, + "payload": { + "outputSummary": "Receives client progress updates, obtains the calling user id and forwards an UpdateReadingProgressCommand via MediatR when user is present.", + "expandedLabel": "handles-route" + } + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_19_flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_repository_read_21_21_invokes_21", + "from": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_19", + "to": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_repository_read_21_21", + "semanticLabel": "Reads repository or persistence state", + "visibleLabel": "Reads repository or persistence state", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 21, + "includeInMetadata": true, + "payload": { + "outputSummary": "var userId = Context.User?.FindFirst(ClaimTypes.NameIdentifier)?.Value;", + "expandedLabel": "invokes" + } + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1_flow_method_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_28_invokes_28", + "from": "flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_28", + "semanticLabel": "OnConnectedAsync", + "visibleLabel": "OnConnectedAsync", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 28, + "includeInMetadata": true, + "payload": { + "outputSummary": "When a client connects, adds their connection to a per-user SignalR group (User_{userId}) and calls base connection logic.", + "expandedLabel": "handles-route" + } + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_28_flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_repository_read_30_30_invokes_30", + "from": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_28", + "to": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_repository_read_30_30", + "semanticLabel": "Reads repository or persistence state", + "visibleLabel": "Reads repository or persistence state", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 30, + "includeInMetadata": true, + "payload": { + "outputSummary": "var userId = Context.UserIdentifier;", + "expandedLabel": "invokes" + } + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1_flow_method_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_38_invokes_38", + "from": "flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_38", + "semanticLabel": "OnDisconnectedAsync", + "visibleLabel": "OnDisconnectedAsync", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 38, + "includeInMetadata": true, + "payload": { + "outputSummary": "When a client disconnects, removes their connection from the per-user SignalR group and invokes base disconnect logic.", + "expandedLabel": "handles-route" + } + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_38_flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_repository_read_40_40_invokes_40", + "from": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_38", + "to": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_repository_read_40_40", + "semanticLabel": "Reads repository or persistence state", + "visibleLabel": "Reads repository or persistence state", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 40, + "includeInMetadata": true, + "payload": { + "outputSummary": "var userId = Context.UserIdentifier;", + "expandedLabel": "invokes" + } + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1_flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_175_invokes_175", + "from": "flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_175", + "semanticLabel": "CountWords", + "visibleLabel": "CountWords", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 175, + "includeInMetadata": true, + "payload": { + "outputSummary": "Count words in a string using whitespace separators; returns 0 for null/whitespace.", + "expandedLabel": "invokes" + } + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_175_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_guard_clause_177_177_evaluates_condition_177", + "from": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_175", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_guard_clause_177_177", + "semanticLabel": "return 0 / continue", + "visibleLabel": "return 0 / continue", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 177, + "includeInMetadata": true, + "payload": { + "outputSummary": "Empty text check", + "expandedLabel": "evaluates-condition" + } + } + ], + "subgraphs": [ + { + "id": "NexusReader_Infrastructure_RealTime_SyncHub", + "label": "SyncHub" + }, + { + "id": "NexusReader_Web_Client_Handlers_AuthenticationHeaderHandler", + "label": "AuthenticationHeaderHandler" + }, + { + "id": "NexusReader_Infrastructure_Services_EpubReaderService", + "label": "EpubReaderService" + } + ], + "metadata": { + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs", + "NexusReader.Web.Client/Program.cs", + "NexusReader.Web/Program.cs", + "NexusReader.Application/DependencyInjection.cs", + "NexusReader.Infrastructure/DependencyInjection.cs", + "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "NexusReader.Application/DTOs/User/AuthorDto.cs", + "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "NexusReader.Domain/Entities/Author.cs", + "NexusReader.UI.Shared/Layout/AuthLayout.razor", + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "NexusReader.UI.Shared/Pages/Account/Login.razor", + "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "NexusReader.UI.Shared/Pages/Account/Register.razor", + "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "NexusReader.Infrastructure/Services/BookStorageService.cs", + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs" + ] + } + } + ] +} \ No newline at end of file diff --git a/src/.documentation/business/index.md b/src/.documentation/business/index.md new file mode 100644 index 0000000..5388ca2 --- /dev/null +++ b/src/.documentation/business/index.md @@ -0,0 +1,8 @@ +## Business + +This collection groups business documentation generated from the repository semantic map. + +### Documents + +- [Business Overview](business-overview.md): ## Business Overview Business Overview centers on account, ai token usage / limits, ai tokens and c... +- [Top Business Flows](top-business-flows.md): ## Top Business Flows Highest-value business flows that should be published as first-class system e... \ No newline at end of file diff --git a/src/.documentation/business/top-business-flows.md b/src/.documentation/business/top-business-flows.md new file mode 100644 index 0000000..c754ef5 --- /dev/null +++ b/src/.documentation/business/top-business-flows.md @@ -0,0 +1,337 @@ +## Top Business Flows + +Highest-value business flows that should be published as first-class system entry points. This publication highlights the highest-value business flows selected from the ranked candidate set. Selected: 5. Rejected or deferred: 2. + +### Selected Flows + +#### Ebook Retrieval / Ingestion Flow + +- Rank: 1 +- Score: 0.86 +- Confidence: high +- Reason: Selected because Ebook Retrieval / Ingestion Flow ranked #1 with score 0.86 above the selection threshold 0.60. +- Domains: account, ai token usage / limits, ai tokens, ai tokens (aitokensused, aitokenlimit), auth, authentication, author, authorization policy, command, cookie based sign in, ebook, ebook / epub ingestion, embedding, external (google) login, identity (authenticationstateprovider), jwt, knowledge (knowledge service, graph, summary), knowledgegraph / knowledgecoordinator, nexususer (identity), pro subscription, query, quiz state, reader navigation, real time sync/broadcast, result, result, secure client storage, session/cookie sign in orchestration, subscription / plan, subscriptionplan, sync, tenantid, theme & focus mode, token refresh, user, user registration, userprofile +- Entrypoints: NexusReader.Web/Program.cs, NexusReader.Application/DependencyInjection.cs, NexusReader.Web.Client/Program.cs +- Flow: Ebook Retrieval / Ingestion Flow starts at NexusReader.Web/Program.cs and follows 12 grounded steps: Enter Program (top level) -> Falls back to alternate path -> Repeats work over a collection or condition -> Guards early exit or rejection path -> .... +- Steps: 1. Enter Program (top level) | 2. Falls back to alternate path | 3. Repeats work over a collection or condition | 4. Guards early exit or rejection path | 5. Branches across multiple outcomes | 6. Evaluates branch condition | 7. Reads repository or persistence state | 8. Returns result | 9. Validates input or state | 10. Call Add Application | 11. Call Add Infrastructure | 12. Call Db Initializer + +#### Ensure Database Initialized + +- Rank: 2 +- Score: 0.86 +- Confidence: high +- Reason: Selected because Ensure Database Initialized ranked #2 with score 0.86 above the selection threshold 0.60. +- Domains: account, ai token usage / limits, ai tokens, ai tokens (aitokensused, aitokenlimit), auth, authentication, author, authorization policy, command, cookie based sign in, ebook, ebook / epub ingestion, embedding, external (google) login, identity (authenticationstateprovider), jwt, knowledge (knowledge service, graph, summary), knowledgegraph / knowledgecoordinator, nexususer (identity), pro subscription, query, quiz state, reader navigation, real time sync/broadcast, result, result, secure client storage, session/cookie sign in orchestration, subscription / plan, subscriptionplan, sync, tenantid, theme & focus mode, token refresh, user, user registration, userprofile +- Entrypoints: NexusReader.Web/Program.cs, NexusReader.Application/DependencyInjection.cs, NexusReader.Web.Client/Program.cs +- Flow: Ensure Database Initialized starts at NexusReader.Web/Program.cs and follows 12 grounded steps: Enter Program (top level) -> Falls back to alternate path -> Repeats work over a collection or condition -> Guards early exit or rejection path -> .... +- Steps: 1. Enter Program (top level) | 2. Falls back to alternate path | 3. Repeats work over a collection or condition | 4. Guards early exit or rejection path | 5. Branches across multiple outcomes | 6. Evaluates branch condition | 7. Reads repository or persistence state | 8. Returns result | 9. Validates input or state | 10. Call Add Application | 11. Call Add Infrastructure | 12. Call Db Initializer + +#### Handle Subscription Success + +- Rank: 3 +- Score: 0.86 +- Confidence: high +- Reason: Selected because Handle Subscription Success ranked #3 with score 0.86 above the selection threshold 0.60. +- Domains: account, ai token usage / limits, ai tokens, ai tokens (aitokensused, aitokenlimit), auth, authentication, author, authorization policy, command, cookie based sign in, ebook, ebook / epub ingestion, embedding, external (google) login, identity (authenticationstateprovider), jwt, knowledge (knowledge service, graph, summary), knowledgegraph / knowledgecoordinator, nexususer (identity), pro subscription, query, quiz state, reader navigation, real time sync/broadcast, result, result, secure client storage, session/cookie sign in orchestration, subscription / plan, subscriptionplan, sync, tenantid, theme & focus mode, token refresh, user, user registration, userprofile +- Entrypoints: NexusReader.Web/Program.cs, NexusReader.Application/DependencyInjection.cs, NexusReader.Web.Client/Program.cs +- Flow: Handle Subscription Success starts at NexusReader.Web/Program.cs and follows 12 grounded steps: Enter Program (top level) -> Falls back to alternate path -> Repeats work over a collection or condition -> Guards early exit or rejection path -> .... +- Steps: 1. Enter Program (top level) | 2. Falls back to alternate path | 3. Repeats work over a collection or condition | 4. Guards early exit or rejection path | 5. Branches across multiple outcomes | 6. Evaluates branch condition | 7. Reads repository or persistence state | 8. Returns result | 9. Validates input or state | 10. Call Add Application | 11. Call Add Infrastructure | 12. Call Db Initializer + +#### Knowledge Question / Semantic Search Flow + +- Rank: 4 +- Score: 0.86 +- Confidence: high +- Reason: Selected because Knowledge Question / Semantic Search Flow ranked #4 with score 0.86 above the selection threshold 0.60. +- Domains: account, ai token usage / limits, ai tokens, ai tokens (aitokensused, aitokenlimit), auth, authentication, author, authorization policy, command, cookie based sign in, ebook, ebook / epub ingestion, embedding, external (google) login, identity (authenticationstateprovider), jwt, knowledge (knowledge service, graph, summary), knowledgegraph / knowledgecoordinator, nexususer (identity), pro subscription, query, quiz state, reader navigation, real time sync/broadcast, result, result, secure client storage, session/cookie sign in orchestration, subscription / plan, subscriptionplan, sync, tenantid, theme & focus mode, token refresh, user, user registration, userprofile +- Entrypoints: NexusReader.Web/Program.cs, NexusReader.Application/DependencyInjection.cs, NexusReader.Web.Client/Program.cs +- Flow: Knowledge Question / Semantic Search Flow starts at NexusReader.Web/Program.cs and follows 12 grounded steps: Enter Program (top level) -> Falls back to alternate path -> Repeats work over a collection or condition -> Guards early exit or rejection path -> .... +- Steps: 1. Enter Program (top level) | 2. Falls back to alternate path | 3. Repeats work over a collection or condition | 4. Guards early exit or rejection path | 5. Branches across multiple outcomes | 6. Evaluates branch condition | 7. Reads repository or persistence state | 8. Returns result | 9. Validates input or state | 10. Call Add Application | 11. Call Add Infrastructure | 12. Call Db Initializer + +#### Program (top level) + +- Rank: 5 +- Score: 0.86 +- Confidence: high +- Reason: Selected because Program (top level) ranked #5 with score 0.86 above the selection threshold 0.60. +- Domains: account, ai token usage / limits, ai tokens, ai tokens (aitokensused, aitokenlimit), auth, authentication, author, authorization policy, command, cookie based sign in, ebook, ebook / epub ingestion, embedding, external (google) login, identity (authenticationstateprovider), jwt, knowledge (knowledge service, graph, summary), knowledgegraph / knowledgecoordinator, nexususer (identity), pro subscription, query, quiz state, reader navigation, real time sync/broadcast, result, result, secure client storage, session/cookie sign in orchestration, subscription / plan, subscriptionplan, sync, tenantid, theme & focus mode, token refresh, user, user registration, userprofile +- Entrypoints: NexusReader.Web/Program.cs, NexusReader.Application/DependencyInjection.cs, NexusReader.Web.Client/Program.cs +- Flow: Program (top level) starts at NexusReader.Web/Program.cs and follows 12 grounded steps: Enter Program (top level) -> Falls back to alternate path -> Repeats work over a collection or condition -> Guards early exit or rejection path -> .... +- Steps: 1. Enter Program (top level) | 2. Falls back to alternate path | 3. Repeats work over a collection or condition | 4. Guards early exit or rejection path | 5. Branches across multiple outcomes | 6. Evaluates branch condition | 7. Reads repository or persistence state | 8. Returns result | 9. Validates input or state | 10. Call Add Application | 11. Call Add Infrastructure | 12. Call Db Initializer + + +### Diagrams + +These diagrams highlight the technical paths that anchor the highest-value business flows. + +#### Dependency and Model Map + +```mermaid +--- +config: + flowchart: + defaultRenderer: "elk" +--- +flowchart TD + flow_file_nexusreader_maui_mauiprogram_cs_file_1["MauiProgram"] + flow_file_nexusreader_web_client_program_cs_file_1["Program.cs"] + flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53[/"Handlers from NexusReader.Application assembly"/] + flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38[/"HttpClient (configured)"/] + flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28[/"MauiPlatformService"/] + flow_type_nexusreader_maui_mauiprogram_cs_mauiprogram_10[/"MauiProgram"/] + flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29[/"MauiStorageService"/] + flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32[/"NexusAuthenticationStateProvider"/] + flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33[/"NexusAuthenticationStateProvider (via factory)"/] + flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51[/"NexusReader.Application registrations"/] + flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1[/"ThemeService, FocusModeService, QuizStateService, ReaderNavigationService, KnowledgeGraphService, ReaderInteractionService, KnowledgeCoordinator, SyncService, IdentityService"/] + flow_type_nexusreader_web_client_program_cs_configured_httpclient_40[/"configured HttpClient"/] + flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33[/"NexusAuthenticationStateProvider"/] + flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74[/"ThrowingBookStorageService"/] + flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61[/"ThrowingDbContextFactory"/] + flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84[/"ThrowingEbookRepository"/] + flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66[/"ThrowingEmbeddingGenerator"/] + flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94[/"ThrowingSyncBroadcaster"/] + flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38[/"WasmKnowledgeService"/] + flow_type_nexusreader_web_client_program_cs_webplatformservice_18[/"WebPlatformService"/] + flow_file_nexusreader_maui_mauiprogram_cs_file_1 -->|MediatR handlers| flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53 + flow_file_nexusreader_maui_mauiprogram_cs_file_1 -->|HttpClient| flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38 + flow_file_nexusreader_maui_mauiprogram_cs_file_1 -->|IPlatformService| flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28 + flow_file_nexusreader_maui_mauiprogram_cs_file_1 -->|model MauiProgram| flow_type_nexusreader_maui_mauiprogram_cs_mauiprogram_10 + flow_file_nexusreader_maui_mauiprogram_cs_file_1 -->|INativeStorageService| flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29 + flow_file_nexusreader_maui_mauiprogram_cs_file_1 -->|NexusAuthenticationStateProvider| flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32 + flow_file_nexusreader_maui_mauiprogram_cs_file_1 -->|Microsoft.AspNetCore.Components.Authorization.AuthenticationStateProvider| flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33 + flow_file_nexusreader_maui_mauiprogram_cs_file_1 -->|Application layer services extension| flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51 + flow_file_nexusreader_maui_mauiprogram_cs_file_1 -->|UI and app state services| flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1 + flow_file_nexusreader_web_client_program_cs_file_1 -->|uses| flow_type_nexusreader_web_client_program_cs_configured_httpclient_40 + flow_file_nexusreader_web_client_program_cs_file_1 -->|NexusAuthenticationStateProvider| flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33 + flow_file_nexusreader_web_client_program_cs_file_1 -->|model ThrowingBookStorageService| flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74 + flow_file_nexusreader_web_client_program_cs_file_1 -->|model ThrowingDbContextFactory| flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61 + flow_file_nexusreader_web_client_program_cs_file_1 -->|model ThrowingEbookRepository| flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84 + flow_file_nexusreader_web_client_program_cs_file_1 -->|model ThrowingEmbeddingGenerator| flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66 + flow_file_nexusreader_web_client_program_cs_file_1 -->|model ThrowingSyncBroadcaster| flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94 + flow_file_nexusreader_web_client_program_cs_file_1 -->|IKnowledgeService| flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38 + flow_file_nexusreader_web_client_program_cs_file_1 -->|IPlatformService| flow_type_nexusreader_web_client_program_cs_webplatformservice_18 + click flow_file_nexusreader_maui_mauiprogram_cs_file_1 href "vscode://file/NexusReader.Maui/MauiProgram.cs:1:1" "Open source" + click flow_type_nexusreader_maui_mauiprogram_cs_mauiprogram_10 href "vscode://file/NexusReader.Maui/MauiProgram.cs:10:1" "Open source" + click flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28 href "vscode://file/NexusReader.Maui/MauiProgram.cs:28:1" "Open source" + click flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29 href "vscode://file/NexusReader.Maui/MauiProgram.cs:29:1" "Open source" + click flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32 href "vscode://file/NexusReader.Maui/MauiProgram.cs:32:1" "Open source" + click flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33 href "vscode://file/NexusReader.Maui/MauiProgram.cs:33:1" "Open source" + click flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38 href "vscode://file/NexusReader.Maui/MauiProgram.cs:38:1" "Open source" + click flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1 href "vscode://file/NexusReader.Maui/MauiProgram.cs:1:1" "Open source" + click flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51 href "vscode://file/NexusReader.Maui/MauiProgram.cs:51:1" "Open source" + click flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53 href "vscode://file/NexusReader.Maui/MauiProgram.cs:53:1" "Open source" + click flow_file_nexusreader_web_client_program_cs_file_1 href "vscode://file/NexusReader.Web.Client/Program.cs:1:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61 href "vscode://file/NexusReader.Web.Client/Program.cs:61:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66 href "vscode://file/NexusReader.Web.Client/Program.cs:66:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74 href "vscode://file/NexusReader.Web.Client/Program.cs:74:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84 href "vscode://file/NexusReader.Web.Client/Program.cs:84:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94 href "vscode://file/NexusReader.Web.Client/Program.cs:94:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_webplatformservice_18 href "vscode://file/NexusReader.Web.Client/Program.cs:18:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33 href "vscode://file/NexusReader.Web.Client/Program.cs:33:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38 href "vscode://file/NexusReader.Web.Client/Program.cs:38:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_configured_httpclient_40 href "vscode://file/NexusReader.Web.Client/Program.cs:40:1" "Open source" +``` + +This dependency-map view is included as a grounded technical anchor for the published business interpretation. + +#### Startup and Service Registration Flow + +```mermaid +--- +config: + flowchart: + defaultRenderer: "elk" +--- +flowchart TD + subgraph flow_1_nexusreader_web_client_program_cs["Program.cs"] + end + subgraph flow_2_nexusreader_maui_mauiprogram_cs["MauiProgram"] + end + subgraph Node_xref_top_business_flows_md_user_authentication_login_register_flow["User Authentication (Login/Register) Flow"] + end + subgraph Node_xref_top_business_flows_md_knowledge_question_semantic_search_flow["Knowledge Question / Semantic Search Flow"] + end + subgraph Node_xref_top_business_flows_md_ebook_retrieval_ingestion_flow["Ebook Retrieval / Ingestion Flow"] + end + flow_file_nexusreader_maui_mauiprogram_cs_file_1["MauiProgram"] + flow_file_nexusreader_web_client_program_cs_file_1["Program.cs"] + flow_method_nexusreader_maui_mauiprogram_cs_create_and_build_mauiapp_16["Create and build MauiApp"] + flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53[/"Handlers from NexusReader.Application assembly"/] + flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38[/"HttpClient (configured)"/] + flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28[/"MauiPlatformService"/] + flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29[/"MauiStorageService"/] + flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32[/"NexusAuthenticationStateProvider"/] + flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33[/"NexusAuthenticationStateProvider (via factory)"/] + flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51[/"NexusReader.Application registrations"/] + flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1[/"ThemeService, FocusModeService, QuizStateService, ReaderNavigationService, KnowledgeGraphService, ReaderInteractionService, KnowledgeCoordinator, SyncService, IdentityService"/] + flow_type_nexusreader_web_client_program_cs_configured_httpclient_40[/"configured HttpClient"/] + flow_type_nexusreader_web_client_program_cs_n_a_55[/"N/A"/] + flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33[/"NexusAuthenticationStateProvider"/] + flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49[/"ThrowingDbContextFactory"/] + flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38[/"WasmKnowledgeService"/] + flow_type_nexusreader_web_client_program_cs_webplatformservice_18[/"WebPlatformService"/] + flow_file_nexusreader_maui_mauiprogram_cs_file_1 -->|unknown| flow_method_nexusreader_maui_mauiprogram_cs_create_and_build_mauiapp_16 + flow_file_nexusreader_maui_mauiprogram_cs_file_1 -->|MediatR handlers| flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53 + flow_file_nexusreader_maui_mauiprogram_cs_file_1 -->|HttpClient| flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38 + flow_file_nexusreader_maui_mauiprogram_cs_file_1 -->|IPlatformService| flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28 + flow_file_nexusreader_maui_mauiprogram_cs_file_1 -->|INativeStorageService| flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29 + flow_file_nexusreader_maui_mauiprogram_cs_file_1 -->|NexusAuthenticationStateProvider| flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32 + flow_file_nexusreader_maui_mauiprogram_cs_file_1 -->|Microsoft.AspNetCore.Components.Authorization.AuthenticationStateProvider| flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33 + flow_file_nexusreader_maui_mauiprogram_cs_file_1 -->|Application layer services extension| flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51 + flow_file_nexusreader_maui_mauiprogram_cs_file_1 -->|UI and app state services| flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1 + flow_file_nexusreader_web_client_program_cs_file_1 -->|uses| flow_type_nexusreader_web_client_program_cs_configured_httpclient_40 + flow_file_nexusreader_web_client_program_cs_file_1 -->|application services via extension| flow_type_nexusreader_web_client_program_cs_n_a_55 + flow_file_nexusreader_web_client_program_cs_file_1 -->|NexusAuthenticationStateProvider| flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33 + flow_file_nexusreader_web_client_program_cs_file_1 -->|IDbContextFactory AppDbContext>| flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49 + flow_file_nexusreader_web_client_program_cs_file_1 -->|IKnowledgeService| flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38 + flow_file_nexusreader_web_client_program_cs_file_1 -->|IPlatformService| flow_type_nexusreader_web_client_program_cs_webplatformservice_18 + click flow_file_nexusreader_maui_mauiprogram_cs_file_1 href "vscode://file/NexusReader.Maui/MauiProgram.cs:1:1" "Open source" + click flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28 href "vscode://file/NexusReader.Maui/MauiProgram.cs:28:1" "Open source" + click flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29 href "vscode://file/NexusReader.Maui/MauiProgram.cs:29:1" "Open source" + click flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32 href "vscode://file/NexusReader.Maui/MauiProgram.cs:32:1" "Open source" + click flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33 href "vscode://file/NexusReader.Maui/MauiProgram.cs:33:1" "Open source" + click flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38 href "vscode://file/NexusReader.Maui/MauiProgram.cs:38:1" "Open source" + click flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1 href "vscode://file/NexusReader.Maui/MauiProgram.cs:1:1" "Open source" + click flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51 href "vscode://file/NexusReader.Maui/MauiProgram.cs:51:1" "Open source" + click flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53 href "vscode://file/NexusReader.Maui/MauiProgram.cs:53:1" "Open source" + click flow_method_nexusreader_maui_mauiprogram_cs_create_and_build_mauiapp_16 href "vscode://file/NexusReader.Maui/MauiProgram.cs:16:1" "Open source" + click flow_file_nexusreader_web_client_program_cs_file_1 href "vscode://file/NexusReader.Web.Client/Program.cs:1:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_webplatformservice_18 href "vscode://file/NexusReader.Web.Client/Program.cs:18:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33 href "vscode://file/NexusReader.Web.Client/Program.cs:33:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38 href "vscode://file/NexusReader.Web.Client/Program.cs:38:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_configured_httpclient_40 href "vscode://file/NexusReader.Web.Client/Program.cs:40:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49 href "vscode://file/NexusReader.Web.Client/Program.cs:49:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_n_a_55 href "vscode://file/NexusReader.Web.Client/Program.cs:55:1" "Open source" +``` + +This primary-runtime view is included as a grounded technical anchor for the published business interpretation. + +#### Program.cs Flow + +```mermaid +--- +config: + flowchart: + defaultRenderer: "elk" +--- +flowchart TD + subgraph flow_1_nexusreader_web_client_program_cs["Program.cs"] + end + subgraph flow_2_nexusreader_maui_mauiprogram_cs["MauiProgram"] + end + subgraph flow_0_nexusreader_web_program_cs["Program.cs"] + end + flow_file_nexusreader_web_client_program_cs_file_1["Program.cs"] + flow_file_nexusreader_web_program_cs_file_1["Program.cs"] + flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88["FindAuthorByNameAsync"] + flow_method_nexusreader_web_client_program_cs_getservice_71["GetService"] + flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15["Program (top-level startup)"] + flow_method_nexusreader_web_client_program_cs_run_wasm_host_59["Run WASM Host"] + flow_method_nexusreader_web_program_cs_program_top_level_29["Program (top-level)"] + flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88["Reads repository or persistence state"] + flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62{"Evaluates branch condition"} + flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66{"Falls back to alternate path"} + flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125["Reads repository or persistence state"] + flow_type_nexusreader_web_client_program_cs_configured_httpclient_40[/"configured HttpClient"/] + flow_type_nexusreader_web_client_program_cs_n_a_55[/"N/A"/] + flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33[/"NexusAuthenticationStateProvider"/] + flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74[/"ThrowingBookStorageService"/] + flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49[/"ThrowingDbContextFactory"/] + flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61[/"ThrowingDbContextFactory"/] + flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84[/"ThrowingEbookRepository"/] + flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66[/"ThrowingEmbeddingGenerator"/] + flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94[/"ThrowingSyncBroadcaster"/] + flow_type_nexusreader_web_client_program_cs_wasmepubreader_56[/"WasmEpubReader"/] + flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38[/"WasmKnowledgeService"/] + flow_type_nexusreader_web_client_program_cs_webplatformservice_18[/"WebPlatformService"/] + flow_action_nexusreader_web_client_program_cs_getservice_return_71_71(["returns null"]) + flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62 -->|fallback| flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66 + flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66 -->|Reads repository or persistence state| flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125 + flow_file_nexusreader_web_client_program_cs_file_1 -->|FindAuthorByNameAsync| flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88 + flow_file_nexusreader_web_client_program_cs_file_1 -->|GetService| flow_method_nexusreader_web_client_program_cs_getservice_71 + flow_file_nexusreader_web_client_program_cs_file_1 -->|Program top-level startup| flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15 + flow_file_nexusreader_web_client_program_cs_file_1 -->|unknown| flow_method_nexusreader_web_client_program_cs_run_wasm_host_59 + flow_file_nexusreader_web_client_program_cs_file_1 -->|uses| flow_type_nexusreader_web_client_program_cs_configured_httpclient_40 + flow_file_nexusreader_web_client_program_cs_file_1 -->|application services via extension| flow_type_nexusreader_web_client_program_cs_n_a_55 + flow_file_nexusreader_web_client_program_cs_file_1 -->|NexusAuthenticationStateProvider| flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33 + flow_file_nexusreader_web_client_program_cs_file_1 -->|model ThrowingBookStorageService| flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74 + flow_file_nexusreader_web_client_program_cs_file_1 -->|IDbContextFactory AppDbContext>| flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49 + flow_file_nexusreader_web_client_program_cs_file_1 -->|model ThrowingDbContextFactory| flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61 + flow_file_nexusreader_web_client_program_cs_file_1 -->|model ThrowingEbookRepository| flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84 + flow_file_nexusreader_web_client_program_cs_file_1 -->|model ThrowingEmbeddingGenerator| flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66 + flow_file_nexusreader_web_client_program_cs_file_1 -->|model ThrowingSyncBroadcaster| flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94 + flow_file_nexusreader_web_client_program_cs_file_1 -->|IEpubReader| flow_type_nexusreader_web_client_program_cs_wasmepubreader_56 + flow_file_nexusreader_web_client_program_cs_file_1 -->|IKnowledgeService| flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38 + flow_file_nexusreader_web_client_program_cs_file_1 -->|IPlatformService| flow_type_nexusreader_web_client_program_cs_webplatformservice_18 + flow_file_nexusreader_web_program_cs_file_1 -->|Program top-level| flow_method_nexusreader_web_program_cs_program_top_level_29 + flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88 -->|Reads repository or persistence state| flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88 + flow_method_nexusreader_web_client_program_cs_getservice_71 -->|returns null| flow_action_nexusreader_web_client_program_cs_getservice_return_71_71 + flow_method_nexusreader_web_program_cs_program_top_level_29 -->|true / false| flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62 + click flow_file_nexusreader_web_client_program_cs_file_1 href "vscode://file/NexusReader.Web.Client/Program.cs:1:1" "Open source" + click flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15 href "vscode://file/NexusReader.Web.Client/Program.cs:15:1" "Open source" + click flow_method_nexusreader_web_client_program_cs_getservice_71 href "vscode://file/NexusReader.Web.Client/Program.cs:71:1" "Open source" + click flow_action_nexusreader_web_client_program_cs_getservice_return_71_71 href "vscode://file/NexusReader.Web.Client/Program.cs:71:1" "Open source" + click flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88 href "vscode://file/NexusReader.Web.Client/Program.cs:88:1" "Open source" + click flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88 href "vscode://file/NexusReader.Web.Client/Program.cs:88:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61 href "vscode://file/NexusReader.Web.Client/Program.cs:61:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66 href "vscode://file/NexusReader.Web.Client/Program.cs:66:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74 href "vscode://file/NexusReader.Web.Client/Program.cs:74:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84 href "vscode://file/NexusReader.Web.Client/Program.cs:84:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94 href "vscode://file/NexusReader.Web.Client/Program.cs:94:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_webplatformservice_18 href "vscode://file/NexusReader.Web.Client/Program.cs:18:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33 href "vscode://file/NexusReader.Web.Client/Program.cs:33:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38 href "vscode://file/NexusReader.Web.Client/Program.cs:38:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_configured_httpclient_40 href "vscode://file/NexusReader.Web.Client/Program.cs:40:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49 href "vscode://file/NexusReader.Web.Client/Program.cs:49:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_n_a_55 href "vscode://file/NexusReader.Web.Client/Program.cs:55:1" "Open source" + click flow_type_nexusreader_web_client_program_cs_wasmepubreader_56 href "vscode://file/NexusReader.Web.Client/Program.cs:56:1" "Open source" + click flow_method_nexusreader_web_client_program_cs_run_wasm_host_59 href "vscode://file/NexusReader.Web.Client/Program.cs:59:1" "Open source" + click flow_file_nexusreader_web_program_cs_file_1 href "vscode://file/NexusReader.Web/Program.cs:1:1" "Open source" + click flow_method_nexusreader_web_program_cs_program_top_level_29 href "vscode://file/NexusReader.Web/Program.cs:29:1" "Open source" + click flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62 href "vscode://file/NexusReader.Web/Program.cs:62:1" "Open source" + click flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66 href "vscode://file/NexusReader.Web/Program.cs:66:1" "Open source" + click flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125 href "vscode://file/NexusReader.Web/Program.cs:125:1" "Open source" +``` + +This primary-runtime view is included as a grounded technical anchor for the published business interpretation. + + +### Additional Ranked Candidates + +- **User Authentication (Login/Register) Flow** (rank 6, score 0.86, rejected): Rejected because User Authentication (Login/Register) Flow ranked #6, outside the top 5 publication slots. +- **Token Attach & Refresh Flow (Client HTTP)** (rank 7, score 0.82, rejected): Rejected because Token Attach & Refresh Flow (Client HTTP) ranked #7, outside the top 5 publication slots. + +### Key Files + +- NexusReader.Maui/MauiProgram.cs +- NexusReader.Web.Client/Program.cs +- NexusReader.Web/Program.cs +- NexusReader.Application/DTOs/User/AuthorDto.cs +- NexusReader.Application/Security/Authorization/ProUserHandler.cs +- NexusReader.Application/Security/Authorization/ProUserRequirement.cs +- NexusReader.Domain/Entities/Author.cs +- NexusReader.UI.Shared/Layout/AuthLayout.razor + + + +--- + +## See Also + +- [Business Overview](business-overview.md) +- [Application Layer: Commands, Queries and DTOs](../domains/application-layer.md) +- [Security, Identity and Authorization](../flows/security-identity-auth.md) +- [Blazor WebAssembly Client: hosting, handlers, and platform services](../flows/web-client-wasm.md) +- [MAUI Mobile Host: App wiring and platform services](../domains/maui-mobile.md) +- [Real-Time Sync, SignalR and Broadcast](../flows/realtime-and-sync.md) +- [Project Overview and Architecture](../collections/overview.md) diff --git a/src/.documentation/business/top-business-flows.meta.json b/src/.documentation/business/top-business-flows.meta.json new file mode 100644 index 0000000..6ff649f --- /dev/null +++ b/src/.documentation/business/top-business-flows.meta.json @@ -0,0 +1,33521 @@ +{ + "generatedAt": "2026-05-22T06:57:31.112Z", + "targetPath": "business/top-business-flows.md", + "targetKind": "folder", + "metadataDraft": { + "sectionProvenance": [ + { + "sectionId": "dependency_map_graph", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs", + "NexusReader.Web.Client/Program.cs", + "NexusReader.Web/Program.cs", + "NexusReader.Application/DependencyInjection.cs", + "NexusReader.Infrastructure/DependencyInjection.cs", + "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "NexusReader.Application/DTOs/User/AuthorDto.cs", + "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "NexusReader.Domain/Entities/Author.cs", + "NexusReader.UI.Shared/Layout/AuthLayout.razor", + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "NexusReader.UI.Shared/Pages/Account/Login.razor", + "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "NexusReader.UI.Shared/Pages/Account/Register.razor", + "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "NexusReader.Infrastructure/Services/BookStorageService.cs", + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs" + ] + }, + { + "sectionId": "startup_runtime_graph", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs", + "NexusReader.Web.Client/Program.cs", + "NexusReader.Web/Program.cs", + "NexusReader.Application/DependencyInjection.cs", + "NexusReader.Infrastructure/DependencyInjection.cs", + "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "NexusReader.Application/DTOs/User/AuthorDto.cs", + "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "NexusReader.Domain/Entities/Author.cs", + "NexusReader.UI.Shared/Layout/AuthLayout.razor", + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "NexusReader.UI.Shared/Pages/Account/Login.razor", + "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "NexusReader.UI.Shared/Pages/Account/Register.razor", + "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "NexusReader.Infrastructure/Services/BookStorageService.cs", + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs" + ] + }, + { + "sectionId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs", + "NexusReader.Web.Client/Program.cs", + "NexusReader.Web/Program.cs", + "NexusReader.Application/DependencyInjection.cs", + "NexusReader.Infrastructure/DependencyInjection.cs", + "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "NexusReader.Application/DTOs/User/AuthorDto.cs", + "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "NexusReader.Domain/Entities/Author.cs", + "NexusReader.UI.Shared/Layout/AuthLayout.razor", + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "NexusReader.UI.Shared/Pages/Account/Login.razor", + "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "NexusReader.UI.Shared/Pages/Account/Register.razor", + "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "NexusReader.Infrastructure/Services/BookStorageService.cs", + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs" + ] + }, + { + "sectionId": "control_flow_flow_1_nexusreader_web_client_program_cs", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs", + "NexusReader.Web.Client/Program.cs", + "NexusReader.Web/Program.cs", + "NexusReader.Application/DependencyInjection.cs", + "NexusReader.Infrastructure/DependencyInjection.cs", + "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "NexusReader.Application/DTOs/User/AuthorDto.cs", + "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "NexusReader.Domain/Entities/Author.cs", + "NexusReader.UI.Shared/Layout/AuthLayout.razor", + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "NexusReader.UI.Shared/Pages/Account/Login.razor", + "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "NexusReader.UI.Shared/Pages/Account/Register.razor", + "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "NexusReader.Infrastructure/Services/BookStorageService.cs", + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs" + ] + }, + { + "sectionId": "contracts_flow_1_nexusreader_web_client_program_cs", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs", + "NexusReader.Web.Client/Program.cs", + "NexusReader.Web/Program.cs", + "NexusReader.Application/DependencyInjection.cs", + "NexusReader.Infrastructure/DependencyInjection.cs", + "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "NexusReader.Application/DTOs/User/AuthorDto.cs", + "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "NexusReader.Domain/Entities/Author.cs", + "NexusReader.UI.Shared/Layout/AuthLayout.razor", + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "NexusReader.UI.Shared/Pages/Account/Login.razor", + "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "NexusReader.UI.Shared/Pages/Account/Register.razor", + "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "NexusReader.Infrastructure/Services/BookStorageService.cs", + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs" + ] + }, + { + "sectionId": "layer_flow_1_nexusreader_web_client_program_cs", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs", + "NexusReader.Web.Client/Program.cs", + "NexusReader.Web/Program.cs", + "NexusReader.Application/DependencyInjection.cs", + "NexusReader.Infrastructure/DependencyInjection.cs", + "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "NexusReader.Application/DTOs/User/AuthorDto.cs", + "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "NexusReader.Domain/Entities/Author.cs", + "NexusReader.UI.Shared/Layout/AuthLayout.razor", + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "NexusReader.UI.Shared/Pages/Account/Login.razor", + "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "NexusReader.UI.Shared/Pages/Account/Register.razor", + "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "NexusReader.Infrastructure/Services/BookStorageService.cs", + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs" + ] + }, + { + "sectionId": "failure_flow_1_nexusreader_web_client_program_cs", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs", + "NexusReader.Web.Client/Program.cs", + "NexusReader.Web/Program.cs", + "NexusReader.Application/DependencyInjection.cs", + "NexusReader.Infrastructure/DependencyInjection.cs", + "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "NexusReader.Application/DTOs/User/AuthorDto.cs", + "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "NexusReader.Domain/Entities/Author.cs", + "NexusReader.UI.Shared/Layout/AuthLayout.razor", + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "NexusReader.UI.Shared/Pages/Account/Login.razor", + "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "NexusReader.UI.Shared/Pages/Account/Register.razor", + "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "NexusReader.Infrastructure/Services/BookStorageService.cs", + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs" + ] + }, + { + "sectionId": "method_flows_graph", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs", + "NexusReader.Web.Client/Program.cs", + "NexusReader.Web/Program.cs", + "NexusReader.Application/DependencyInjection.cs", + "NexusReader.Infrastructure/DependencyInjection.cs", + "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "NexusReader.Application/DTOs/User/AuthorDto.cs", + "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "NexusReader.Domain/Entities/Author.cs", + "NexusReader.UI.Shared/Layout/AuthLayout.razor", + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "NexusReader.UI.Shared/Pages/Account/Login.razor", + "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "NexusReader.UI.Shared/Pages/Account/Register.razor", + "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "NexusReader.Infrastructure/Services/BookStorageService.cs", + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs" + ] + } + ], + "claimGrounding": [], + "nodeMetadata": [ + { + "id": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "label": "MauiProgram", + "diagramId": "dependency_map_graph", + "nodeRole": "class", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "Static host for MAUI app startup logic and DI composition.", + "responsibility": "Static host for MAUI app startup logic and DI composition.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Composition Root", + "Service Registration" + ], + "detailItems": [ + { + "label": "Owner", + "value": "MauiProgram" + }, + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "0" + }, + { + "label": "Domain", + "value": "Identity (AuthenticationStateProvider), Sync, KnowledgeGraph / KnowledgeCoordinator" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Maui/MauiProgram.cs:1:1", + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 1, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 1, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_mauiprogram_10", + "label": "MauiProgram", + "diagramId": "dependency_map_graph", + "nodeRole": "class", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "Static host for MAUI app startup logic and DI composition.", + "responsibility": "Static host for MAUI app startup logic and DI composition.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Composition Root", + "Service Registration" + ], + "detailItems": [ + { + "label": "Owner", + "value": "MauiProgram" + }, + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "0" + }, + { + "label": "Domain", + "value": "Identity (AuthenticationStateProvider), Sync, KnowledgeGraph / KnowledgeCoordinator" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Maui/MauiProgram.cs:10:1", + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 10, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 10, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28", + "label": "MauiPlatformService", + "diagramId": "dependency_map_graph", + "nodeRole": "dependency", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "Creates and configures the MAUI application builder: registers DI services (platform, storage, identity, UI state, network), composes the Application layer and MediatR, and returns the built MauiApp inside a try/catch to aid debugging.", + "responsibility": "Sets HttpClient BaseAddress to http://10.0.2.2:5000 (typical Android emulator -> host routing); composes Application layer via AddApplication() and registers MediatR scanning the Application assembly; startup protected by try/catch that writes Debug output and rethrows.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Composition Root", + "Service Registration" + ], + "detailItems": [ + { + "label": "Owner", + "value": "MauiProgram" + }, + { + "label": "Domain", + "value": "Identity (AuthenticationStateProvider), Sync, KnowledgeGraph / KnowledgeCoordinator" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Maui/MauiProgram.cs:28:1", + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 28, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 28, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29", + "label": "MauiStorageService", + "diagramId": "dependency_map_graph", + "nodeRole": "dependency", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "Creates and configures the MAUI application builder: registers DI services (platform, storage, identity, UI state, network), composes the Application layer and MediatR, and returns the built MauiApp inside a try/catch to aid debugging.", + "responsibility": "Sets HttpClient BaseAddress to http://10.0.2.2:5000 (typical Android emulator -> host routing); composes Application layer via AddApplication() and registers MediatR scanning the Application assembly; startup protected by try/catch that writes Debug output and rethrows.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Composition Root", + "Service Registration" + ], + "detailItems": [ + { + "label": "Owner", + "value": "MauiProgram" + }, + { + "label": "Domain", + "value": "Identity (AuthenticationStateProvider), Sync, KnowledgeGraph / KnowledgeCoordinator" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Maui/MauiProgram.cs:29:1", + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 29, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 29, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32", + "label": "NexusAuthenticationStateProvider", + "diagramId": "dependency_map_graph", + "nodeRole": "dependency", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "Creates and configures the MAUI application builder: registers DI services (platform, storage, identity, UI state, network), composes the Application layer and MediatR, and returns the built MauiApp inside a try/catch to aid debugging.", + "responsibility": "Sets HttpClient BaseAddress to http://10.0.2.2:5000 (typical Android emulator -> host routing); composes Application layer via AddApplication() and registers MediatR scanning the Application assembly; startup protected by try/catch that writes Debug output and rethrows.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Composition Root", + "Service Registration" + ], + "detailItems": [ + { + "label": "Owner", + "value": "MauiProgram" + }, + { + "label": "Domain", + "value": "Identity (AuthenticationStateProvider), Sync, KnowledgeGraph / KnowledgeCoordinator" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Maui/MauiProgram.cs:32:1", + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 32, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 32, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33", + "label": "NexusAuthenticationStateProvider (via factory)", + "diagramId": "dependency_map_graph", + "nodeRole": "dependency", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "Creates and configures the MAUI application builder: registers DI services (platform, storage, identity, UI state, network), composes the Application layer and MediatR, and returns the built MauiApp inside a try/catch to aid debugging.", + "responsibility": "Sets HttpClient BaseAddress to http://10.0.2.2:5000 (typical Android emulator -> host routing); composes Application layer via AddApplication() and registers MediatR scanning the Application assembly; startup protected by try/catch that writes Debug output and rethrows.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Composition Root", + "Service Registration" + ], + "detailItems": [ + { + "label": "Owner", + "value": "MauiProgram" + }, + { + "label": "Domain", + "value": "Identity (AuthenticationStateProvider), Sync, KnowledgeGraph / KnowledgeCoordinator" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Maui/MauiProgram.cs:33:1", + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 33, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 33, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38", + "label": "HttpClient (configured)", + "diagramId": "dependency_map_graph", + "nodeRole": "dependency", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "Creates and configures the MAUI application builder: registers DI services (platform, storage, identity, UI state, network), composes the Application layer and MediatR, and returns the built MauiApp inside a try/catch to aid debugging.", + "responsibility": "Sets HttpClient BaseAddress to http://10.0.2.2:5000 (typical Android emulator -> host routing); composes Application layer via AddApplication() and registers MediatR scanning the Application assembly; startup protected by try/catch that writes Debug output and rethrows.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Composition Root", + "Service Registration" + ], + "detailItems": [ + { + "label": "Owner", + "value": "MauiProgram" + }, + { + "label": "Domain", + "value": "Identity (AuthenticationStateProvider), Sync, KnowledgeGraph / KnowledgeCoordinator" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Maui/MauiProgram.cs:38:1", + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 38, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 38, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1", + "label": "ThemeService, FocusModeService, QuizStateService, ReaderNavigationService, KnowledgeGraphService, ReaderInteractionService, KnowledgeCoordinator, SyncService, IdentityService", + "diagramId": "dependency_map_graph", + "nodeRole": "dependency", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "Creates and configures the MAUI application builder: registers DI services (platform, storage, identity, UI state, network), composes the Application layer and MediatR, and returns the built MauiApp inside a try/catch to aid debugging.", + "responsibility": "Sets HttpClient BaseAddress to http://10.0.2.2:5000 (typical Android emulator -> host routing); composes Application layer via AddApplication() and registers MediatR scanning the Application assembly; startup protected by try/catch that writes Debug output and rethrows.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Composition Root", + "Service Registration" + ], + "detailItems": [ + { + "label": "Owner", + "value": "MauiProgram" + }, + { + "label": "Domain", + "value": "Identity (AuthenticationStateProvider), Sync, KnowledgeGraph / KnowledgeCoordinator" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Maui/MauiProgram.cs:1:1", + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 1, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 1, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51", + "label": "NexusReader.Application registrations", + "diagramId": "dependency_map_graph", + "nodeRole": "dependency", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "Creates and configures the MAUI application builder: registers DI services (platform, storage, identity, UI state, network), composes the Application layer and MediatR, and returns the built MauiApp inside a try/catch to aid debugging.", + "responsibility": "Sets HttpClient BaseAddress to http://10.0.2.2:5000 (typical Android emulator -> host routing); composes Application layer via AddApplication() and registers MediatR scanning the Application assembly; startup protected by try/catch that writes Debug output and rethrows.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Composition Root", + "Service Registration" + ], + "detailItems": [ + { + "label": "Owner", + "value": "MauiProgram" + }, + { + "label": "Domain", + "value": "Identity (AuthenticationStateProvider), Sync, KnowledgeGraph / KnowledgeCoordinator" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Maui/MauiProgram.cs:51:1", + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 51, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 51, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53", + "label": "Handlers from NexusReader.Application assembly", + "diagramId": "dependency_map_graph", + "nodeRole": "dependency", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "Creates and configures the MAUI application builder: registers DI services (platform, storage, identity, UI state, network), composes the Application layer and MediatR, and returns the built MauiApp inside a try/catch to aid debugging.", + "responsibility": "Sets HttpClient BaseAddress to http://10.0.2.2:5000 (typical Android emulator -> host routing); composes Application layer via AddApplication() and registers MediatR scanning the Application assembly; startup protected by try/catch that writes Debug output and rethrows.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Composition Root", + "Service Registration" + ], + "detailItems": [ + { + "label": "Owner", + "value": "MauiProgram" + }, + { + "label": "Domain", + "value": "Identity (AuthenticationStateProvider), Sync, KnowledgeGraph / KnowledgeCoordinator" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Maui/MauiProgram.cs:53:1", + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 53, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 53, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "flow_file_nexusreader_web_client_program_cs_file_1", + "label": "Program.cs", + "diagramId": "dependency_map_graph", + "nodeRole": "service", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:1:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 1, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 1, + "sourceTargetKind": "service", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61", + "label": "ThrowingDbContextFactory", + "diagramId": "dependency_map_graph", + "nodeRole": "class", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.", + "responsibility": "IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Signature", + "value": "() -> AppDbContext" + }, + { + "label": "Calls", + "value": "0" + }, + { + "label": "Action:mapping", + "value": "NotSupportedException @L63" + }, + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "0" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:61:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 61, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 61, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66", + "label": "ThrowingEmbeddingGenerator", + "diagramId": "dependency_map_graph", + "nodeRole": "class", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "IEmbeddingGenerator implementation that disables local embedding generation in WASM (throws on GenerateAsync).", + "responsibility": "IEmbeddingGenerator implementation that disables local embedding generation in WASM (throws on GenerateAsync).", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "0" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:66:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 66, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 66, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74", + "label": "ThrowingBookStorageService", + "diagramId": "dependency_map_graph", + "nodeRole": "class", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "IBookStorageService implementation that throws for all file storage operations in WASM.", + "responsibility": "IBookStorageService implementation that throws for all file storage operations in WASM.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "1" + }, + { + "label": "ErrorMessage", + "value": "string required" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:74:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 74, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 74, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84", + "label": "ThrowingEbookRepository", + "diagramId": "dependency_map_graph", + "nodeRole": "class", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "IEbookRepository implementation that throws for all repository operations in WASM.", + "responsibility": "IEbookRepository implementation that throws for all repository operations in WASM.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "1" + }, + { + "label": "ErrorMessage", + "value": "string required" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:84:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 84, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 84, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94", + "label": "ThrowingSyncBroadcaster", + "diagramId": "dependency_map_graph", + "nodeRole": "class", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "ISyncBroadcaster implementation that throws because real-time broadcasting must run on the server.", + "responsibility": "ISyncBroadcaster implementation that throws because real-time broadcasting must run on the server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "0" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:94:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 94, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 94, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_webplatformservice_18", + "label": "WebPlatformService", + "diagramId": "dependency_map_graph", + "nodeRole": "dependency", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:18:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 18, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 18, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33", + "label": "NexusAuthenticationStateProvider", + "diagramId": "dependency_map_graph", + "nodeRole": "dependency", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:33:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 33, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 33, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38", + "label": "WasmKnowledgeService", + "diagramId": "dependency_map_graph", + "nodeRole": "dependency", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:38:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 38, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 38, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_configured_httpclient_40", + "label": "configured HttpClient", + "diagramId": "dependency_map_graph", + "nodeRole": "dependency", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:40:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 40, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 40, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "label": "MauiProgram", + "diagramId": "startup_runtime_graph", + "nodeRole": "class", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Static host for MAUI app startup logic and DI composition.", + "responsibility": "Static host for MAUI app startup logic and DI composition.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Composition Root", + "Service Registration" + ], + "detailItems": [ + { + "label": "Owner", + "value": "MauiProgram" + }, + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "0" + }, + { + "label": "Domain", + "value": "Identity (AuthenticationStateProvider), Sync, KnowledgeGraph / KnowledgeCoordinator" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Maui/MauiProgram.cs:1:1", + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 1, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 1, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28", + "label": "MauiPlatformService", + "diagramId": "startup_runtime_graph", + "nodeRole": "dependency", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Creates and configures the MAUI application builder: registers DI services (platform, storage, identity, UI state, network), composes the Application layer and MediatR, and returns the built MauiApp inside a try/catch to aid debugging.", + "responsibility": "Sets HttpClient BaseAddress to http://10.0.2.2:5000 (typical Android emulator -> host routing); composes Application layer via AddApplication() and registers MediatR scanning the Application assembly; startup protected by try/catch that writes Debug output and rethrows.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Composition Root", + "Service Registration" + ], + "detailItems": [ + { + "label": "Owner", + "value": "MauiProgram" + }, + { + "label": "Domain", + "value": "Identity (AuthenticationStateProvider), Sync, KnowledgeGraph / KnowledgeCoordinator" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Maui/MauiProgram.cs:28:1", + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 28, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 28, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29", + "label": "MauiStorageService", + "diagramId": "startup_runtime_graph", + "nodeRole": "dependency", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Creates and configures the MAUI application builder: registers DI services (platform, storage, identity, UI state, network), composes the Application layer and MediatR, and returns the built MauiApp inside a try/catch to aid debugging.", + "responsibility": "Sets HttpClient BaseAddress to http://10.0.2.2:5000 (typical Android emulator -> host routing); composes Application layer via AddApplication() and registers MediatR scanning the Application assembly; startup protected by try/catch that writes Debug output and rethrows.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Composition Root", + "Service Registration" + ], + "detailItems": [ + { + "label": "Owner", + "value": "MauiProgram" + }, + { + "label": "Domain", + "value": "Identity (AuthenticationStateProvider), Sync, KnowledgeGraph / KnowledgeCoordinator" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Maui/MauiProgram.cs:29:1", + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 29, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 29, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32", + "label": "NexusAuthenticationStateProvider", + "diagramId": "startup_runtime_graph", + "nodeRole": "dependency", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Creates and configures the MAUI application builder: registers DI services (platform, storage, identity, UI state, network), composes the Application layer and MediatR, and returns the built MauiApp inside a try/catch to aid debugging.", + "responsibility": "Sets HttpClient BaseAddress to http://10.0.2.2:5000 (typical Android emulator -> host routing); composes Application layer via AddApplication() and registers MediatR scanning the Application assembly; startup protected by try/catch that writes Debug output and rethrows.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Composition Root", + "Service Registration" + ], + "detailItems": [ + { + "label": "Owner", + "value": "MauiProgram" + }, + { + "label": "Domain", + "value": "Identity (AuthenticationStateProvider), Sync, KnowledgeGraph / KnowledgeCoordinator" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Maui/MauiProgram.cs:32:1", + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 32, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 32, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33", + "label": "NexusAuthenticationStateProvider (via factory)", + "diagramId": "startup_runtime_graph", + "nodeRole": "dependency", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Creates and configures the MAUI application builder: registers DI services (platform, storage, identity, UI state, network), composes the Application layer and MediatR, and returns the built MauiApp inside a try/catch to aid debugging.", + "responsibility": "Sets HttpClient BaseAddress to http://10.0.2.2:5000 (typical Android emulator -> host routing); composes Application layer via AddApplication() and registers MediatR scanning the Application assembly; startup protected by try/catch that writes Debug output and rethrows.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Composition Root", + "Service Registration" + ], + "detailItems": [ + { + "label": "Owner", + "value": "MauiProgram" + }, + { + "label": "Domain", + "value": "Identity (AuthenticationStateProvider), Sync, KnowledgeGraph / KnowledgeCoordinator" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Maui/MauiProgram.cs:33:1", + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 33, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 33, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38", + "label": "HttpClient (configured)", + "diagramId": "startup_runtime_graph", + "nodeRole": "dependency", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Creates and configures the MAUI application builder: registers DI services (platform, storage, identity, UI state, network), composes the Application layer and MediatR, and returns the built MauiApp inside a try/catch to aid debugging.", + "responsibility": "Sets HttpClient BaseAddress to http://10.0.2.2:5000 (typical Android emulator -> host routing); composes Application layer via AddApplication() and registers MediatR scanning the Application assembly; startup protected by try/catch that writes Debug output and rethrows.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Composition Root", + "Service Registration" + ], + "detailItems": [ + { + "label": "Owner", + "value": "MauiProgram" + }, + { + "label": "Domain", + "value": "Identity (AuthenticationStateProvider), Sync, KnowledgeGraph / KnowledgeCoordinator" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Maui/MauiProgram.cs:38:1", + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 38, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 38, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1", + "label": "ThemeService, FocusModeService, QuizStateService, ReaderNavigationService, KnowledgeGraphService, ReaderInteractionService, KnowledgeCoordinator, SyncService, IdentityService", + "diagramId": "startup_runtime_graph", + "nodeRole": "dependency", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Creates and configures the MAUI application builder: registers DI services (platform, storage, identity, UI state, network), composes the Application layer and MediatR, and returns the built MauiApp inside a try/catch to aid debugging.", + "responsibility": "Sets HttpClient BaseAddress to http://10.0.2.2:5000 (typical Android emulator -> host routing); composes Application layer via AddApplication() and registers MediatR scanning the Application assembly; startup protected by try/catch that writes Debug output and rethrows.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Composition Root", + "Service Registration" + ], + "detailItems": [ + { + "label": "Owner", + "value": "MauiProgram" + }, + { + "label": "Domain", + "value": "Identity (AuthenticationStateProvider), Sync, KnowledgeGraph / KnowledgeCoordinator" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Maui/MauiProgram.cs:1:1", + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 1, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 1, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51", + "label": "NexusReader.Application registrations", + "diagramId": "startup_runtime_graph", + "nodeRole": "dependency", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Creates and configures the MAUI application builder: registers DI services (platform, storage, identity, UI state, network), composes the Application layer and MediatR, and returns the built MauiApp inside a try/catch to aid debugging.", + "responsibility": "Sets HttpClient BaseAddress to http://10.0.2.2:5000 (typical Android emulator -> host routing); composes Application layer via AddApplication() and registers MediatR scanning the Application assembly; startup protected by try/catch that writes Debug output and rethrows.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Composition Root", + "Service Registration" + ], + "detailItems": [ + { + "label": "Owner", + "value": "MauiProgram" + }, + { + "label": "Domain", + "value": "Identity (AuthenticationStateProvider), Sync, KnowledgeGraph / KnowledgeCoordinator" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Maui/MauiProgram.cs:51:1", + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 51, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 51, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53", + "label": "Handlers from NexusReader.Application assembly", + "diagramId": "startup_runtime_graph", + "nodeRole": "dependency", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Creates and configures the MAUI application builder: registers DI services (platform, storage, identity, UI state, network), composes the Application layer and MediatR, and returns the built MauiApp inside a try/catch to aid debugging.", + "responsibility": "Sets HttpClient BaseAddress to http://10.0.2.2:5000 (typical Android emulator -> host routing); composes Application layer via AddApplication() and registers MediatR scanning the Application assembly; startup protected by try/catch that writes Debug output and rethrows.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Composition Root", + "Service Registration" + ], + "detailItems": [ + { + "label": "Owner", + "value": "MauiProgram" + }, + { + "label": "Domain", + "value": "Identity (AuthenticationStateProvider), Sync, KnowledgeGraph / KnowledgeCoordinator" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Maui/MauiProgram.cs:53:1", + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 53, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 53, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "flow_method_nexusreader_maui_mauiprogram_cs_create_and_build_mauiapp_16", + "label": "Create and build MauiApp", + "diagramId": "startup_runtime_graph", + "nodeRole": "method", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Creates and configures the MAUI application builder: registers DI services (platform, storage, identity, UI state, network), composes the Application layer and MediatR, and returns the built MauiApp inside a try/catch to aid debugging.", + "responsibility": "Sets HttpClient BaseAddress to http://10.0.2.2:5000 (typical Android emulator -> host routing); composes Application layer via AddApplication() and registers MediatR scanning the Application assembly; startup protected by try/catch that writes Debug output and rethrows.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Composition Root", + "Service Registration" + ], + "detailItems": [ + { + "label": "Owner", + "value": "MauiProgram" + }, + { + "label": "Domain", + "value": "Identity (AuthenticationStateProvider), Sync, KnowledgeGraph / KnowledgeCoordinator" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Maui/MauiProgram.cs:16:1", + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 16, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 16, + "sourceTargetKind": "method", + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "flow_file_nexusreader_web_client_program_cs_file_1", + "label": "Program.cs", + "diagramId": "startup_runtime_graph", + "nodeRole": "service", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:1:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 1, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 1, + "sourceTargetKind": "service", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_webplatformservice_18", + "label": "WebPlatformService", + "diagramId": "startup_runtime_graph", + "nodeRole": "dependency", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:18:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 18, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 18, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33", + "label": "NexusAuthenticationStateProvider", + "diagramId": "startup_runtime_graph", + "nodeRole": "dependency", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:33:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 33, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 33, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38", + "label": "WasmKnowledgeService", + "diagramId": "startup_runtime_graph", + "nodeRole": "dependency", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:38:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 38, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 38, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_configured_httpclient_40", + "label": "configured HttpClient", + "diagramId": "startup_runtime_graph", + "nodeRole": "dependency", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:40:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 40, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 40, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49", + "label": "ThrowingDbContextFactory", + "diagramId": "startup_runtime_graph", + "nodeRole": "class", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.", + "responsibility": "IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "0" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:49:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 49, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 49, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_n_a_55", + "label": "N/A", + "diagramId": "startup_runtime_graph", + "nodeRole": "dependency", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:55:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 55, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 55, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_file_nexusreader_web_client_program_cs_file_1", + "label": "Program.cs", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "service", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:1:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 1, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 1, + "sourceTargetKind": "service", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15", + "label": "Program (top-level startup)", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "method", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Create the WebAssemblyHostBuilder, register application and platform services, add HTTP client and dummy server-only stubs, then build and run the WASM host.", + "responsibility": "Create the WebAssemblyHostBuilder, register application and platform services, add HTTP client and dummy server-only stubs, then build and run the WASM host.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Signature", + "value": "(args: string[]) -> Task" + }, + { + "label": "Calls", + "value": "6" + }, + { + "label": "Action:mapping", + "value": "AddScoped platform & UI services @L18" + }, + { + "label": "Action:mapping", + "value": "AddScoped auth services and auth state provider @L30" + }, + { + "label": "Action:mapping", + "value": "AddHttpClient with auth message handler @L40" + }, + { + "label": "Action:mapping", + "value": "Register throw-only stubs for server-only services @L48" + }, + { + "label": "Action:mapping", + "value": "Build and run WASM host @L59" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:15:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 15, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 15, + "sourceTargetKind": "method", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_method_nexusreader_web_client_program_cs_getservice_71", + "label": "GetService", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "method", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Fallback service resolver stub that always returns null.", + "responsibility": "Fallback service resolver stub that always returns null.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Signature", + "value": "(Type serviceType, object? serviceKey = null) -> object?" + }, + { + "label": "Calls", + "value": "0" + }, + { + "label": "Action:return", + "value": "returns null @L71" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:71:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 71, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 71, + "sourceTargetKind": "method", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_action_nexusreader_web_client_program_cs_getservice_return_71_71", + "label": "returns null", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "return", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "public object? GetService(...) => null", + "responsibility": "public object? GetService(...) => null", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Action", + "value": "return" + }, + { + "label": "Signature", + "value": "(Type serviceType, object? serviceKey = null) -> object?" + }, + { + "label": "Calls", + "value": "0" + }, + { + "label": "Action:return", + "value": "returns null @L71" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:71:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 71, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 71, + "sourceTargetKind": "return", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88", + "label": "FindAuthorByNameAsync", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "method", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Repository lookup stub that throws because repository access is unsupported in WASM.", + "responsibility": "Repository lookup stub that throws because repository access is unsupported in WASM.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Signature", + "value": "(string name, CancellationToken cancellationToken = default) -> Task" + }, + { + "label": "Calls", + "value": "0" + }, + { + "label": "Action:mapping", + "value": "NotSupportedException @L88" + }, + { + "label": "Action:repository-read", + "value": "Reads repository or persistence state @L88" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:88:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 88, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 88, + "sourceTargetKind": "method", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88", + "label": "Reads repository or persistence state", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "step", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "public Task FindAuthorByNameAsync(string name, CancellationToken cancellationToken = default) => throw new NotSupportedException(ErrorMessage);", + "responsibility": "public Task FindAuthorByNameAsync(string name, CancellationToken cancellationToken = default) => throw new NotSupportedException(ErrorMessage);", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Action", + "value": "repository-read" + }, + { + "label": "Signature", + "value": "(string name, CancellationToken cancellationToken = default) -> Task" + }, + { + "label": "Calls", + "value": "0" + }, + { + "label": "Action:mapping", + "value": "NotSupportedException @L88" + }, + { + "label": "Action:repository-read", + "value": "Reads repository or persistence state @L88" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:88:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 88, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 88, + "sourceTargetKind": "step", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61", + "label": "ThrowingDbContextFactory", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "class", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.", + "responsibility": "IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Signature", + "value": "() -> AppDbContext" + }, + { + "label": "Calls", + "value": "0" + }, + { + "label": "Action:mapping", + "value": "NotSupportedException @L63" + }, + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "0" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:61:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 61, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 61, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66", + "label": "ThrowingEmbeddingGenerator", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "class", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "IEmbeddingGenerator implementation that disables local embedding generation in WASM (throws on GenerateAsync).", + "responsibility": "IEmbeddingGenerator implementation that disables local embedding generation in WASM (throws on GenerateAsync).", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "0" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:66:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 66, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 66, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74", + "label": "ThrowingBookStorageService", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "class", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "IBookStorageService implementation that throws for all file storage operations in WASM.", + "responsibility": "IBookStorageService implementation that throws for all file storage operations in WASM.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "1" + }, + { + "label": "ErrorMessage", + "value": "string required" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:74:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 74, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 74, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84", + "label": "ThrowingEbookRepository", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "class", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "IEbookRepository implementation that throws for all repository operations in WASM.", + "responsibility": "IEbookRepository implementation that throws for all repository operations in WASM.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "1" + }, + { + "label": "ErrorMessage", + "value": "string required" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:84:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 84, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 84, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94", + "label": "ThrowingSyncBroadcaster", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "class", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "ISyncBroadcaster implementation that throws because real-time broadcasting must run on the server.", + "responsibility": "ISyncBroadcaster implementation that throws because real-time broadcasting must run on the server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "0" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:94:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 94, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 94, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_webplatformservice_18", + "label": "WebPlatformService", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "dependency", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:18:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 18, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 18, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33", + "label": "NexusAuthenticationStateProvider", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "dependency", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:33:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 33, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 33, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38", + "label": "WasmKnowledgeService", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "dependency", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:38:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 38, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 38, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_configured_httpclient_40", + "label": "configured HttpClient", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "dependency", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:40:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 40, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 40, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49", + "label": "ThrowingDbContextFactory", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "class", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.", + "responsibility": "IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "0" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:49:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 49, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 49, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_n_a_55", + "label": "N/A", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "dependency", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:55:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 55, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 55, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_wasmepubreader_56", + "label": "WasmEpubReader", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "dependency", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:56:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 56, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 56, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_method_nexusreader_web_client_program_cs_run_wasm_host_59", + "label": "Run WASM Host", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "method", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:59:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 59, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 59, + "sourceTargetKind": "method", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_file_nexusreader_web_program_cs_file_1", + "label": "Program.cs", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "service", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Program bootstrap for the NexusReader.Web ASP.NET app: registers services, configures authentication/authorization, initializes DB, maps Minimal API endpoints (including knowledge, library, identity, Stripe webhooks), and starts the web host.", + "responsibility": "Program.cs is the composition root and runtime bootstrap: it registers DI services and policies, configures authentication (including Google), ensures DB migrations and seeding with retry/backoff, maps a set of Minimal API endpoints for knowledge features (protected by token-availability policy), handles Stripe webhooks to update subscription state, and supports both Server and WASM Blazor render modes.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Minimal APIs", + "Mediator/CQRS (MediatR)", + "Retry with exponential backoff" + ], + "detailItems": [ + { + "label": "Domain", + "value": "SubscriptionPlan, Knowledge (knowledge service, graph, summary), Ebook / EPUB ingestion" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web/Program.cs:1:1", + "path": "NexusReader.Web/Program.cs", + "line": 1, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 1, + "sourceTargetKind": "service", + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ] + }, + { + "id": "flow_method_nexusreader_web_program_cs_program_top_level_29", + "label": "Program (top-level)", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "method", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "Top-level program: build host, register services and middleware, map routes/endpoints, run the app.", + "responsibility": "Top-level program: build host, register services and middleware, map routes/endpoints, run the app.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Minimal APIs", + "Mediator/CQRS (MediatR)", + "Retry with exponential backoff" + ], + "detailItems": [ + { + "label": "Signature", + "value": "(args) -> Task" + }, + { + "label": "Calls", + "value": "6" + }, + { + "label": "Action:mapping", + "value": "Registers many scoped services and HTTP client @L33" + }, + { + "label": "Action:branch", + "value": "Evaluates branch condition @L62" + }, + { + "label": "Action:fallback", + "value": "Falls back to alternate path @L66" + }, + { + "label": "Action:mapping", + "value": "Adds policies including 'ProUser' and 'HasAvailableTokens' @L86" + }, + { + "label": "Action:mapping", + "value": "Configures authentication and Identity endpoints @L96" + }, + { + "label": "Action:repository-read", + "value": "Reads repository or persistence state @L125" + }, + { + "label": "Domain", + "value": "SubscriptionPlan, Knowledge (knowledge service, graph, summary), Ebook / EPUB ingestion" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web/Program.cs:29:1", + "path": "NexusReader.Web/Program.cs", + "line": 29, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 29, + "sourceTargetKind": "method", + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "label": "Evaluates branch condition", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "step", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "if (!string.IsNullOrEmpty(apiBaseUrl))", + "responsibility": "if (!string.IsNullOrEmpty(apiBaseUrl))", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Minimal APIs", + "Mediator/CQRS (MediatR)", + "Retry with exponential backoff" + ], + "detailItems": [ + { + "label": "Action", + "value": "branch" + }, + { + "label": "Condition", + "value": "!string.IsNullOrEmpty(apiBaseUrl)" + }, + { + "label": "Outcomes", + "value": "true, false" + }, + { + "label": "Domain", + "value": "SubscriptionPlan, Knowledge (knowledge service, graph, summary), Ebook / EPUB ingestion" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web/Program.cs:62:1", + "path": "NexusReader.Web/Program.cs", + "line": 62, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 62, + "sourceTargetKind": "step", + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "label": "Falls back to alternate path", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "step", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "else", + "responsibility": "else", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Minimal APIs", + "Mediator/CQRS (MediatR)", + "Retry with exponential backoff" + ], + "detailItems": [ + { + "label": "Action", + "value": "fallback" + }, + { + "label": "Outcomes", + "value": "fallback" + }, + { + "label": "Domain", + "value": "SubscriptionPlan, Knowledge (knowledge service, graph, summary), Ebook / EPUB ingestion" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web/Program.cs:66:1", + "path": "NexusReader.Web/Program.cs", + "line": 66, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 66, + "sourceTargetKind": "step", + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125", + "label": "Reads repository or persistence state", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "step", + "diagramFamily": "primary-runtime", + "architecturalLayer": "backend", + "summary": "var isApiRequest = context.Request.Path.StartsWithSegments(\"/api\") ||", + "responsibility": "var isApiRequest = context.Request.Path.StartsWithSegments(\"/api\") ||", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Minimal APIs", + "Mediator/CQRS (MediatR)", + "Retry with exponential backoff" + ], + "detailItems": [ + { + "label": "Action", + "value": "repository-read" + }, + { + "label": "Domain", + "value": "SubscriptionPlan, Knowledge (knowledge service, graph, summary), Ebook / EPUB ingestion" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web/Program.cs:125:1", + "path": "NexusReader.Web/Program.cs", + "line": 125, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 125, + "sourceTargetKind": "step", + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ] + }, + { + "id": "flow_file_nexusreader_web_client_program_cs_file_1", + "label": "Program.cs", + "diagramId": "control_flow_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "service", + "diagramFamily": "control-flow", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:1:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 1, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 1, + "sourceTargetKind": "service", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15", + "label": "Program (top-level startup)", + "diagramId": "control_flow_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "method", + "diagramFamily": "control-flow", + "architecturalLayer": "backend", + "summary": "Create the WebAssemblyHostBuilder, register application and platform services, add HTTP client and dummy server-only stubs, then build and run the WASM host.", + "responsibility": "Create the WebAssemblyHostBuilder, register application and platform services, add HTTP client and dummy server-only stubs, then build and run the WASM host.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Signature", + "value": "(args: string[]) -> Task" + }, + { + "label": "Calls", + "value": "6" + }, + { + "label": "Action:mapping", + "value": "AddScoped platform & UI services @L18" + }, + { + "label": "Action:mapping", + "value": "AddScoped auth services and auth state provider @L30" + }, + { + "label": "Action:mapping", + "value": "AddHttpClient with auth message handler @L40" + }, + { + "label": "Action:mapping", + "value": "Register throw-only stubs for server-only services @L48" + }, + { + "label": "Action:mapping", + "value": "Build and run WASM host @L59" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:15:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 15, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 15, + "sourceTargetKind": "method", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_method_nexusreader_web_client_program_cs_getservice_71", + "label": "GetService", + "diagramId": "control_flow_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "method", + "diagramFamily": "control-flow", + "architecturalLayer": "backend", + "summary": "Fallback service resolver stub that always returns null.", + "responsibility": "Fallback service resolver stub that always returns null.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Signature", + "value": "(Type serviceType, object? serviceKey = null) -> object?" + }, + { + "label": "Calls", + "value": "0" + }, + { + "label": "Action:return", + "value": "returns null @L71" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:71:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 71, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 71, + "sourceTargetKind": "method", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_action_nexusreader_web_client_program_cs_getservice_return_71_71", + "label": "returns null", + "diagramId": "control_flow_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "return", + "diagramFamily": "control-flow", + "architecturalLayer": "backend", + "summary": "public object? GetService(...) => null", + "responsibility": "public object? GetService(...) => null", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Action", + "value": "return" + }, + { + "label": "Signature", + "value": "(Type serviceType, object? serviceKey = null) -> object?" + }, + { + "label": "Calls", + "value": "0" + }, + { + "label": "Action:return", + "value": "returns null @L71" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:71:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 71, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 71, + "sourceTargetKind": "return", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88", + "label": "FindAuthorByNameAsync", + "diagramId": "control_flow_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "method", + "diagramFamily": "control-flow", + "architecturalLayer": "backend", + "summary": "Repository lookup stub that throws because repository access is unsupported in WASM.", + "responsibility": "Repository lookup stub that throws because repository access is unsupported in WASM.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Signature", + "value": "(string name, CancellationToken cancellationToken = default) -> Task" + }, + { + "label": "Calls", + "value": "0" + }, + { + "label": "Action:mapping", + "value": "NotSupportedException @L88" + }, + { + "label": "Action:repository-read", + "value": "Reads repository or persistence state @L88" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:88:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 88, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 88, + "sourceTargetKind": "method", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88", + "label": "Reads repository or persistence state", + "diagramId": "control_flow_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "step", + "diagramFamily": "control-flow", + "architecturalLayer": "backend", + "summary": "public Task FindAuthorByNameAsync(string name, CancellationToken cancellationToken = default) => throw new NotSupportedException(ErrorMessage);", + "responsibility": "public Task FindAuthorByNameAsync(string name, CancellationToken cancellationToken = default) => throw new NotSupportedException(ErrorMessage);", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Action", + "value": "repository-read" + }, + { + "label": "Signature", + "value": "(string name, CancellationToken cancellationToken = default) -> Task" + }, + { + "label": "Calls", + "value": "0" + }, + { + "label": "Action:mapping", + "value": "NotSupportedException @L88" + }, + { + "label": "Action:repository-read", + "value": "Reads repository or persistence state @L88" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:88:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 88, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 88, + "sourceTargetKind": "step", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_method_nexusreader_web_client_program_cs_run_wasm_host_59", + "label": "Run WASM Host", + "diagramId": "control_flow_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "method", + "diagramFamily": "control-flow", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:59:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 59, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 59, + "sourceTargetKind": "method", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_file_nexusreader_web_program_cs_file_1", + "label": "Program.cs", + "diagramId": "control_flow_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "service", + "diagramFamily": "control-flow", + "architecturalLayer": "backend", + "summary": "Program bootstrap for the NexusReader.Web ASP.NET app: registers services, configures authentication/authorization, initializes DB, maps Minimal API endpoints (including knowledge, library, identity, Stripe webhooks), and starts the web host.", + "responsibility": "Program.cs is the composition root and runtime bootstrap: it registers DI services and policies, configures authentication (including Google), ensures DB migrations and seeding with retry/backoff, maps a set of Minimal API endpoints for knowledge features (protected by token-availability policy), handles Stripe webhooks to update subscription state, and supports both Server and WASM Blazor render modes.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Minimal APIs", + "Mediator/CQRS (MediatR)", + "Retry with exponential backoff" + ], + "detailItems": [ + { + "label": "Domain", + "value": "SubscriptionPlan, Knowledge (knowledge service, graph, summary), Ebook / EPUB ingestion" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web/Program.cs:1:1", + "path": "NexusReader.Web/Program.cs", + "line": 1, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 1, + "sourceTargetKind": "service", + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ] + }, + { + "id": "flow_method_nexusreader_web_program_cs_program_top_level_29", + "label": "Program (top-level)", + "diagramId": "control_flow_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "method", + "diagramFamily": "control-flow", + "architecturalLayer": "backend", + "summary": "Top-level program: build host, register services and middleware, map routes/endpoints, run the app.", + "responsibility": "Top-level program: build host, register services and middleware, map routes/endpoints, run the app.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Minimal APIs", + "Mediator/CQRS (MediatR)", + "Retry with exponential backoff" + ], + "detailItems": [ + { + "label": "Signature", + "value": "(args) -> Task" + }, + { + "label": "Calls", + "value": "6" + }, + { + "label": "Action:mapping", + "value": "Registers many scoped services and HTTP client @L33" + }, + { + "label": "Action:branch", + "value": "Evaluates branch condition @L62" + }, + { + "label": "Action:fallback", + "value": "Falls back to alternate path @L66" + }, + { + "label": "Action:mapping", + "value": "Adds policies including 'ProUser' and 'HasAvailableTokens' @L86" + }, + { + "label": "Action:mapping", + "value": "Configures authentication and Identity endpoints @L96" + }, + { + "label": "Action:repository-read", + "value": "Reads repository or persistence state @L125" + }, + { + "label": "Domain", + "value": "SubscriptionPlan, Knowledge (knowledge service, graph, summary), Ebook / EPUB ingestion" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web/Program.cs:29:1", + "path": "NexusReader.Web/Program.cs", + "line": 29, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 29, + "sourceTargetKind": "method", + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "label": "Evaluates branch condition", + "diagramId": "control_flow_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "step", + "diagramFamily": "control-flow", + "architecturalLayer": "backend", + "summary": "if (!string.IsNullOrEmpty(apiBaseUrl))", + "responsibility": "if (!string.IsNullOrEmpty(apiBaseUrl))", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Minimal APIs", + "Mediator/CQRS (MediatR)", + "Retry with exponential backoff" + ], + "detailItems": [ + { + "label": "Action", + "value": "branch" + }, + { + "label": "Condition", + "value": "!string.IsNullOrEmpty(apiBaseUrl)" + }, + { + "label": "Outcomes", + "value": "true, false" + }, + { + "label": "Domain", + "value": "SubscriptionPlan, Knowledge (knowledge service, graph, summary), Ebook / EPUB ingestion" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web/Program.cs:62:1", + "path": "NexusReader.Web/Program.cs", + "line": 62, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 62, + "sourceTargetKind": "step", + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "label": "Falls back to alternate path", + "diagramId": "control_flow_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "step", + "diagramFamily": "control-flow", + "architecturalLayer": "backend", + "summary": "else", + "responsibility": "else", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Minimal APIs", + "Mediator/CQRS (MediatR)", + "Retry with exponential backoff" + ], + "detailItems": [ + { + "label": "Action", + "value": "fallback" + }, + { + "label": "Outcomes", + "value": "fallback" + }, + { + "label": "Domain", + "value": "SubscriptionPlan, Knowledge (knowledge service, graph, summary), Ebook / EPUB ingestion" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web/Program.cs:66:1", + "path": "NexusReader.Web/Program.cs", + "line": 66, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 66, + "sourceTargetKind": "step", + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125", + "label": "Reads repository or persistence state", + "diagramId": "control_flow_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "step", + "diagramFamily": "control-flow", + "architecturalLayer": "backend", + "summary": "var isApiRequest = context.Request.Path.StartsWithSegments(\"/api\") ||", + "responsibility": "var isApiRequest = context.Request.Path.StartsWithSegments(\"/api\") ||", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Minimal APIs", + "Mediator/CQRS (MediatR)", + "Retry with exponential backoff" + ], + "detailItems": [ + { + "label": "Action", + "value": "repository-read" + }, + { + "label": "Domain", + "value": "SubscriptionPlan, Knowledge (knowledge service, graph, summary), Ebook / EPUB ingestion" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web/Program.cs:125:1", + "path": "NexusReader.Web/Program.cs", + "line": 125, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 125, + "sourceTargetKind": "step", + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_126_126", + "label": "Reads repository or persistence state", + "diagramId": "control_flow_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "step", + "diagramFamily": "control-flow", + "architecturalLayer": "backend", + "summary": "context.Request.Path.StartsWithSegments(\"/identity\") ||", + "responsibility": "context.Request.Path.StartsWithSegments(\"/identity\") ||", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Minimal APIs", + "Mediator/CQRS (MediatR)", + "Retry with exponential backoff" + ], + "detailItems": [ + { + "label": "Action", + "value": "repository-read" + }, + { + "label": "Domain", + "value": "SubscriptionPlan, Knowledge (knowledge service, graph, summary), Ebook / EPUB ingestion" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web/Program.cs:126:1", + "path": "NexusReader.Web/Program.cs", + "line": 126, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 126, + "sourceTargetKind": "step", + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ] + }, + { + "id": "flow_method_nexusreader_application_dependencyinjection_cs_addapplication_8", + "label": "AddApplication", + "diagramId": "control_flow_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "method", + "diagramFamily": "control-flow", + "architecturalLayer": "backend", + "summary": "Extension method that registers application mapping configuration and MediatR handlers, returning the IServiceCollection for chaining.", + "responsibility": "Extension method that registers application mapping configuration and MediatR handlers, returning the IServiceCollection for chaining.", + "technologyHints": [ + "csharp", + "Dependency Injection extension", + "Service registration" + ], + "detailItems": [ + { + "label": "Owner", + "value": "DependencyInjection" + }, + { + "label": "Signature", + "value": "(services: IServiceCollection) -> IServiceCollection" + }, + { + "label": "Calls", + "value": "1" + }, + { + "label": "Action:mapping", + "value": "Register mapping configuration @L10" + }, + { + "label": "Action:mapping", + "value": "Register MediatR handlers @L11" + }, + { + "label": "Action:return", + "value": "Return IServiceCollection @L13" + }, + { + "label": "Action:return", + "value": "Returns result @L13" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Application/DependencyInjection.cs:8:1", + "path": "NexusReader.Application/DependencyInjection.cs", + "line": 8, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Application/DependencyInjection.cs", + "sourceLine": 8, + "sourceTargetKind": "method", + "evidencePaths": [ + "NexusReader.Application/DependencyInjection.cs" + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_31", + "label": "AddInfrastructure", + "diagramId": "control_flow_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "method", + "diagramFamily": "control-flow", + "architecturalLayer": "backend", + "summary": "Configures and registers infrastructure services and external clients (DBs, AI, vector/graph stores, job processing, authorization, and app-layer implementations) into the DI container.", + "responsibility": "Configures and registers infrastructure services and external clients (DBs, AI, vector/graph stores, job processing, authorization, and app-layer implementations) into the DI container.", + "technologyHints": [ + "csharp", + "Dependency Injection / Service Registration", + "Factory (DbContextFactory)", + "Resilience (retry pipeline)", + "Repository" + ], + "detailItems": [ + { + "label": "Owner", + "value": "DependencyInjection" + }, + { + "label": "Signature", + "value": "(this IServiceCollection services, IConfiguration configuration) -> IServiceCollection" + }, + { + "label": "Calls", + "value": "12" + }, + { + "label": "Action:branch", + "value": "Selects DB provider @L33" + }, + { + "label": "Action:branch", + "value": "Evaluates branch condition @L34" + }, + { + "label": "Action:fallback", + "value": "Falls back to alternate path @L44" + }, + { + "label": "Action:mapping", + "value": "Qdrant client registration @L56" + }, + { + "label": "Action:mapping", + "value": "Neo4j driver registration @L60" + }, + { + "label": "Action:branch", + "value": "Evaluates branch condition @L64" + }, + { + "label": "Domain", + "value": "Ebook / Epub processing, AI (chat/embeddings), Vector store (Qdrant)" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Infrastructure/DependencyInjection.cs:31:1", + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 31, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 31, + "sourceTargetKind": "method", + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ] + }, + { + "id": "flow_file_nexusreader_web_client_program_cs_file_1", + "label": "Program.cs", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "service", + "diagramFamily": "class-diagram", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:1:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 1, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 1, + "sourceTargetKind": "service", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61", + "label": "ThrowingDbContextFactory", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "class", + "diagramFamily": "class-diagram", + "architecturalLayer": "backend", + "summary": "IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.", + "responsibility": "IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Signature", + "value": "() -> AppDbContext" + }, + { + "label": "Calls", + "value": "0" + }, + { + "label": "Action:mapping", + "value": "NotSupportedException @L63" + }, + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "0" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:61:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 61, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 61, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66", + "label": "ThrowingEmbeddingGenerator", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "class", + "diagramFamily": "class-diagram", + "architecturalLayer": "backend", + "summary": "IEmbeddingGenerator implementation that disables local embedding generation in WASM (throws on GenerateAsync).", + "responsibility": "IEmbeddingGenerator implementation that disables local embedding generation in WASM (throws on GenerateAsync).", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "0" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:66:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 66, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 66, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74", + "label": "ThrowingBookStorageService", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "class", + "diagramFamily": "class-diagram", + "architecturalLayer": "backend", + "summary": "IBookStorageService implementation that throws for all file storage operations in WASM.", + "responsibility": "IBookStorageService implementation that throws for all file storage operations in WASM.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "1" + }, + { + "label": "ErrorMessage", + "value": "string required" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:74:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 74, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 74, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84", + "label": "ThrowingEbookRepository", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "class", + "diagramFamily": "class-diagram", + "architecturalLayer": "backend", + "summary": "IEbookRepository implementation that throws for all repository operations in WASM.", + "responsibility": "IEbookRepository implementation that throws for all repository operations in WASM.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "1" + }, + { + "label": "ErrorMessage", + "value": "string required" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:84:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 84, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 84, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94", + "label": "ThrowingSyncBroadcaster", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "class", + "diagramFamily": "class-diagram", + "architecturalLayer": "backend", + "summary": "ISyncBroadcaster implementation that throws because real-time broadcasting must run on the server.", + "responsibility": "ISyncBroadcaster implementation that throws because real-time broadcasting must run on the server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "0" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:94:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 94, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 94, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_webplatformservice_18", + "label": "WebPlatformService", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "dependency", + "diagramFamily": "class-diagram", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:18:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 18, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 18, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33", + "label": "NexusAuthenticationStateProvider", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "dependency", + "diagramFamily": "class-diagram", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:33:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 33, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 33, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38", + "label": "WasmKnowledgeService", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "dependency", + "diagramFamily": "class-diagram", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:38:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 38, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 38, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_configured_httpclient_40", + "label": "configured HttpClient", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "dependency", + "diagramFamily": "class-diagram", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:40:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 40, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 40, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49", + "label": "ThrowingDbContextFactory", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "class", + "diagramFamily": "class-diagram", + "architecturalLayer": "backend", + "summary": "IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.", + "responsibility": "IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "0" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:49:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 49, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 49, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_n_a_55", + "label": "N/A", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "dependency", + "diagramFamily": "class-diagram", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:55:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 55, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 55, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_wasmepubreader_56", + "label": "WasmEpubReader", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "dependency", + "diagramFamily": "class-diagram", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:56:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 56, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 56, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_file_nexusreader_web_program_cs_file_1", + "label": "Program.cs", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "service", + "diagramFamily": "class-diagram", + "architecturalLayer": "backend", + "summary": "Program bootstrap for the NexusReader.Web ASP.NET app: registers services, configures authentication/authorization, initializes DB, maps Minimal API endpoints (including knowledge, library, identity, Stripe webhooks), and starts the web host.", + "responsibility": "Program.cs is the composition root and runtime bootstrap: it registers DI services and policies, configures authentication (including Google), ensures DB migrations and seeding with retry/backoff, maps a set of Minimal API endpoints for knowledge features (protected by token-availability policy), handles Stripe webhooks to update subscription state, and supports both Server and WASM Blazor render modes.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Minimal APIs", + "Mediator/CQRS (MediatR)", + "Retry with exponential backoff" + ], + "detailItems": [ + { + "label": "Domain", + "value": "SubscriptionPlan, Knowledge (knowledge service, graph, summary), Ebook / EPUB ingestion" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web/Program.cs:1:1", + "path": "NexusReader.Web/Program.cs", + "line": 1, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 1, + "sourceTargetKind": "service", + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_program_cs_knowledgerequest_566", + "label": "KnowledgeRequest", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "dto", + "diagramFamily": "class-diagram", + "architecturalLayer": "backend", + "summary": "Request DTO carrying free-text input and optional ebook context for knowledge APIs.", + "responsibility": "Request DTO carrying free-text input and optional ebook context for knowledge APIs.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Minimal APIs", + "Mediator/CQRS (MediatR)", + "Retry with exponential backoff" + ], + "detailItems": [ + { + "label": "Shape", + "value": "dto" + }, + { + "label": "Fields", + "value": "2" + }, + { + "label": "Text", + "value": "string required" + }, + { + "label": "EbookId", + "value": "Guid?" + }, + { + "label": "Domain", + "value": "SubscriptionPlan, Knowledge (knowledge service, graph, summary), Ebook / EPUB ingestion" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web/Program.cs:566:1", + "path": "NexusReader.Web/Program.cs", + "line": 566, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 566, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_program_cs_groundednessrequest_567", + "label": "GroundednessRequest", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "dto", + "diagramFamily": "class-diagram", + "architecturalLayer": "backend", + "summary": "Request DTO for verifying answer groundedness in a context.", + "responsibility": "Request DTO for verifying answer groundedness in a context.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Minimal APIs", + "Mediator/CQRS (MediatR)", + "Retry with exponential backoff" + ], + "detailItems": [ + { + "label": "Shape", + "value": "dto" + }, + { + "label": "Fields", + "value": "2" + }, + { + "label": "Answer", + "value": "string required" + }, + { + "label": "Context", + "value": "string required" + }, + { + "label": "Domain", + "value": "SubscriptionPlan, Knowledge (knowledge service, graph, summary), Ebook / EPUB ingestion" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web/Program.cs:567:1", + "path": "NexusReader.Web/Program.cs", + "line": 567, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 567, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_program_cs_semanticsearchrequest_568", + "label": "SemanticSearchRequest", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "dto", + "diagramFamily": "class-diagram", + "architecturalLayer": "backend", + "summary": "DTO for semantic search requests with a limit.", + "responsibility": "DTO for semantic search requests with a limit.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Minimal APIs", + "Mediator/CQRS (MediatR)", + "Retry with exponential backoff" + ], + "detailItems": [ + { + "label": "Shape", + "value": "dto" + }, + { + "label": "Fields", + "value": "2" + }, + { + "label": "QueryText", + "value": "string required" + }, + { + "label": "Limit", + "value": "int" + }, + { + "label": "Domain", + "value": "SubscriptionPlan, Knowledge (knowledge service, graph, summary), Ebook / EPUB ingestion" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web/Program.cs:568:1", + "path": "NexusReader.Web/Program.cs", + "line": 568, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 568, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_program_cs_askquestionrequest_569", + "label": "AskQuestionRequest", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "dto", + "diagramFamily": "class-diagram", + "architecturalLayer": "backend", + "summary": "DTO for question-asking APIs including optional ebook context and limit.", + "responsibility": "DTO for question-asking APIs including optional ebook context and limit.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Minimal APIs", + "Mediator/CQRS (MediatR)", + "Retry with exponential backoff" + ], + "detailItems": [ + { + "label": "Shape", + "value": "dto" + }, + { + "label": "Fields", + "value": "3" + }, + { + "label": "Question", + "value": "string required" + }, + { + "label": "EbookId", + "value": "Guid?" + }, + { + "label": "Limit", + "value": "int" + }, + { + "label": "Domain", + "value": "SubscriptionPlan, Knowledge (knowledge service, graph, summary), Ebook / EPUB ingestion" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web/Program.cs:569:1", + "path": "NexusReader.Web/Program.cs", + "line": 569, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 569, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ] + }, + { + "id": "flow_file_nexusreader_web_client_program_cs_file_1", + "label": "Program.cs", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "service", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:1:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 1, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 1, + "sourceTargetKind": "service", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_action_nexusreader_web_client_program_cs_getservice_return_71_71", + "label": "returns null", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "return", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "public object? GetService(...) => null", + "responsibility": "public object? GetService(...) => null", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Action", + "value": "return" + }, + { + "label": "Signature", + "value": "(Type serviceType, object? serviceKey = null) -> object?" + }, + { + "label": "Calls", + "value": "0" + }, + { + "label": "Action:return", + "value": "returns null @L71" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:71:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 71, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 71, + "sourceTargetKind": "return", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88", + "label": "Reads repository or persistence state", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "step", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "public Task FindAuthorByNameAsync(string name, CancellationToken cancellationToken = default) => throw new NotSupportedException(ErrorMessage);", + "responsibility": "public Task FindAuthorByNameAsync(string name, CancellationToken cancellationToken = default) => throw new NotSupportedException(ErrorMessage);", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Action", + "value": "repository-read" + }, + { + "label": "Signature", + "value": "(string name, CancellationToken cancellationToken = default) -> Task" + }, + { + "label": "Calls", + "value": "0" + }, + { + "label": "Action:mapping", + "value": "NotSupportedException @L88" + }, + { + "label": "Action:repository-read", + "value": "Reads repository or persistence state @L88" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:88:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 88, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 88, + "sourceTargetKind": "step", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61", + "label": "ThrowingDbContextFactory", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "class", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.", + "responsibility": "IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Signature", + "value": "() -> AppDbContext" + }, + { + "label": "Calls", + "value": "0" + }, + { + "label": "Action:mapping", + "value": "NotSupportedException @L63" + }, + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "0" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:61:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 61, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 61, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66", + "label": "ThrowingEmbeddingGenerator", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "class", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "IEmbeddingGenerator implementation that disables local embedding generation in WASM (throws on GenerateAsync).", + "responsibility": "IEmbeddingGenerator implementation that disables local embedding generation in WASM (throws on GenerateAsync).", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "0" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:66:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 66, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 66, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74", + "label": "ThrowingBookStorageService", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "class", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "IBookStorageService implementation that throws for all file storage operations in WASM.", + "responsibility": "IBookStorageService implementation that throws for all file storage operations in WASM.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "1" + }, + { + "label": "ErrorMessage", + "value": "string required" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:74:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 74, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 74, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84", + "label": "ThrowingEbookRepository", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "class", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "IEbookRepository implementation that throws for all repository operations in WASM.", + "responsibility": "IEbookRepository implementation that throws for all repository operations in WASM.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "1" + }, + { + "label": "ErrorMessage", + "value": "string required" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:84:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 84, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 84, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94", + "label": "ThrowingSyncBroadcaster", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "class", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "ISyncBroadcaster implementation that throws because real-time broadcasting must run on the server.", + "responsibility": "ISyncBroadcaster implementation that throws because real-time broadcasting must run on the server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "0" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:94:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 94, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 94, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_webplatformservice_18", + "label": "WebPlatformService", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "dependency", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:18:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 18, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 18, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33", + "label": "NexusAuthenticationStateProvider", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "dependency", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:33:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 33, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 33, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38", + "label": "WasmKnowledgeService", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "dependency", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:38:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 38, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 38, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_configured_httpclient_40", + "label": "configured HttpClient", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "dependency", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:40:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 40, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 40, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49", + "label": "ThrowingDbContextFactory", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "class", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.", + "responsibility": "IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "0" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:49:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 49, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 49, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_n_a_55", + "label": "N/A", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "dependency", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:55:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 55, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 55, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_wasmepubreader_56", + "label": "WasmEpubReader", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "dependency", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "Bootstraps the WebAssembly client: configures DI/service registrations for the WASM app, registers WASM-specific implementations, and provides throw-only stubs for server-only services so DI validation passes in the browser.", + "responsibility": "This Program.cs is the WASM client entry: it wires browser-safe implementations and registers throw-only stand-ins for server-side concerns (DbContext, embedding generation, file storage, repository, real-time broadcasting) so the same DI graph compiles and validates in the browser; the actual server implementations must run on the API server.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:56:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 56, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 56, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_file_nexusreader_web_program_cs_file_1", + "label": "Program.cs", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "service", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "Program bootstrap for the NexusReader.Web ASP.NET app: registers services, configures authentication/authorization, initializes DB, maps Minimal API endpoints (including knowledge, library, identity, Stripe webhooks), and starts the web host.", + "responsibility": "Program.cs is the composition root and runtime bootstrap: it registers DI services and policies, configures authentication (including Google), ensures DB migrations and seeding with retry/backoff, maps a set of Minimal API endpoints for knowledge features (protected by token-availability policy), handles Stripe webhooks to update subscription state, and supports both Server and WASM Blazor render modes.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Minimal APIs", + "Mediator/CQRS (MediatR)", + "Retry with exponential backoff" + ], + "detailItems": [ + { + "label": "Domain", + "value": "SubscriptionPlan, Knowledge (knowledge service, graph, summary), Ebook / EPUB ingestion" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web/Program.cs:1:1", + "path": "NexusReader.Web/Program.cs", + "line": 1, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 1, + "sourceTargetKind": "service", + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "label": "Evaluates branch condition", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "step", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "if (!string.IsNullOrEmpty(apiBaseUrl))", + "responsibility": "if (!string.IsNullOrEmpty(apiBaseUrl))", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Minimal APIs", + "Mediator/CQRS (MediatR)", + "Retry with exponential backoff" + ], + "detailItems": [ + { + "label": "Action", + "value": "branch" + }, + { + "label": "Condition", + "value": "!string.IsNullOrEmpty(apiBaseUrl)" + }, + { + "label": "Outcomes", + "value": "true, false" + }, + { + "label": "Domain", + "value": "SubscriptionPlan, Knowledge (knowledge service, graph, summary), Ebook / EPUB ingestion" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web/Program.cs:62:1", + "path": "NexusReader.Web/Program.cs", + "line": 62, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 62, + "sourceTargetKind": "step", + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "label": "Falls back to alternate path", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "step", + "diagramFamily": "dependency-map", + "architecturalLayer": "backend", + "summary": "else", + "responsibility": "else", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Minimal APIs", + "Mediator/CQRS (MediatR)", + "Retry with exponential backoff" + ], + "detailItems": [ + { + "label": "Action", + "value": "fallback" + }, + { + "label": "Outcomes", + "value": "fallback" + }, + { + "label": "Domain", + "value": "SubscriptionPlan, Knowledge (knowledge service, graph, summary), Ebook / EPUB ingestion" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web/Program.cs:66:1", + "path": "NexusReader.Web/Program.cs", + "line": 66, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 66, + "sourceTargetKind": "step", + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ] + }, + { + "id": "flow_method_nexusreader_web_client_program_cs_getservice_71", + "label": "GetService", + "diagramId": "failure_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "method", + "diagramFamily": "control-flow", + "architecturalLayer": "backend", + "summary": "Fallback service resolver stub that always returns null.", + "responsibility": "Fallback service resolver stub that always returns null.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Signature", + "value": "(Type serviceType, object? serviceKey = null) -> object?" + }, + { + "label": "Calls", + "value": "0" + }, + { + "label": "Action:return", + "value": "returns null @L71" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:71:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 71, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 71, + "sourceTargetKind": "method", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_action_nexusreader_web_client_program_cs_getservice_return_71_71", + "label": "returns null", + "diagramId": "failure_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "return", + "diagramFamily": "control-flow", + "architecturalLayer": "backend", + "summary": "public object? GetService(...) => null", + "responsibility": "public object? GetService(...) => null", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Host/Startup bootstrap", + "Null/Throwing stub (platform-specific feature gating)" + ], + "detailItems": [ + { + "label": "Action", + "value": "return" + }, + { + "label": "Signature", + "value": "(Type serviceType, object? serviceKey = null) -> object?" + }, + { + "label": "Calls", + "value": "0" + }, + { + "label": "Action:return", + "value": "returns null @L71" + }, + { + "label": "Domain", + "value": "Ebook, Author, Embedding" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Program.cs:71:1", + "path": "NexusReader.Web.Client/Program.cs", + "line": 71, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 71, + "sourceTargetKind": "return", + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "flow_method_nexusreader_web_program_cs_program_top_level_29", + "label": "Program (top-level)", + "diagramId": "failure_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "method", + "diagramFamily": "control-flow", + "architecturalLayer": "backend", + "summary": "Top-level program: build host, register services and middleware, map routes/endpoints, run the app.", + "responsibility": "Top-level program: build host, register services and middleware, map routes/endpoints, run the app.", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Minimal APIs", + "Mediator/CQRS (MediatR)", + "Retry with exponential backoff" + ], + "detailItems": [ + { + "label": "Signature", + "value": "(args) -> Task" + }, + { + "label": "Calls", + "value": "6" + }, + { + "label": "Action:mapping", + "value": "Registers many scoped services and HTTP client @L33" + }, + { + "label": "Action:branch", + "value": "Evaluates branch condition @L62" + }, + { + "label": "Action:fallback", + "value": "Falls back to alternate path @L66" + }, + { + "label": "Action:mapping", + "value": "Adds policies including 'ProUser' and 'HasAvailableTokens' @L86" + }, + { + "label": "Action:mapping", + "value": "Configures authentication and Identity endpoints @L96" + }, + { + "label": "Action:repository-read", + "value": "Reads repository or persistence state @L125" + }, + { + "label": "Domain", + "value": "SubscriptionPlan, Knowledge (knowledge service, graph, summary), Ebook / EPUB ingestion" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web/Program.cs:29:1", + "path": "NexusReader.Web/Program.cs", + "line": 29, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 29, + "sourceTargetKind": "method", + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "label": "Evaluates branch condition", + "diagramId": "failure_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "step", + "diagramFamily": "control-flow", + "architecturalLayer": "backend", + "summary": "if (!string.IsNullOrEmpty(apiBaseUrl))", + "responsibility": "if (!string.IsNullOrEmpty(apiBaseUrl))", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Minimal APIs", + "Mediator/CQRS (MediatR)", + "Retry with exponential backoff" + ], + "detailItems": [ + { + "label": "Action", + "value": "branch" + }, + { + "label": "Condition", + "value": "!string.IsNullOrEmpty(apiBaseUrl)" + }, + { + "label": "Outcomes", + "value": "true, false" + }, + { + "label": "Domain", + "value": "SubscriptionPlan, Knowledge (knowledge service, graph, summary), Ebook / EPUB ingestion" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web/Program.cs:62:1", + "path": "NexusReader.Web/Program.cs", + "line": 62, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 62, + "sourceTargetKind": "step", + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "label": "Falls back to alternate path", + "diagramId": "failure_flow_1_nexusreader_web_client_program_cs", + "nodeRole": "step", + "diagramFamily": "control-flow", + "architecturalLayer": "backend", + "summary": "else", + "responsibility": "else", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Minimal APIs", + "Mediator/CQRS (MediatR)", + "Retry with exponential backoff" + ], + "detailItems": [ + { + "label": "Action", + "value": "fallback" + }, + { + "label": "Outcomes", + "value": "fallback" + }, + { + "label": "Domain", + "value": "SubscriptionPlan, Knowledge (knowledge service, graph, summary), Ebook / EPUB ingestion" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web/Program.cs:66:1", + "path": "NexusReader.Web/Program.cs", + "line": 66, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 66, + "sourceTargetKind": "step", + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_237_237", + "label": "Evaluates branch condition", + "diagramId": "method_flows_graph", + "nodeRole": "step", + "diagramFamily": "method-flow", + "architecturalLayer": "backend", + "summary": "if (!app.Environment.IsDevelopment())", + "responsibility": "if (!app.Environment.IsDevelopment())", + "technologyHints": [ + "csharp", + "Dependency Injection", + "Minimal APIs", + "Mediator/CQRS (MediatR)", + "Retry with exponential backoff" + ], + "detailItems": [ + { + "label": "Action", + "value": "branch" + }, + { + "label": "Condition", + "value": "!app.Environment.IsDevelopment()" + }, + { + "label": "Outcomes", + "value": "true, false" + }, + { + "label": "Domain", + "value": "SubscriptionPlan, Knowledge (knowledge service, graph, summary), Ebook / EPUB ingestion" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web/Program.cs:237:1", + "path": "NexusReader.Web/Program.cs", + "line": 237, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 237, + "sourceTargetKind": "step", + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ] + }, + { + "id": "flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1", + "label": "SyncHub", + "diagramId": "method_flows_graph", + "nodeRole": "class", + "diagramFamily": "method-flow", + "architecturalLayer": "backend", + "summary": "SignalR hub that mediates client realtime interactions for syncing reading progress and manages user groups.", + "responsibility": "SignalR hub that mediates client realtime interactions for syncing reading progress and manages user groups.", + "technologyHints": [ + "csharp", + "Mediator", + "SignalR Hub", + "Per-user group (User_{userId})" + ], + "detailItems": [ + { + "label": "Owner", + "value": "SyncHub" + }, + { + "label": "Signature", + "value": "(mediator: IMediator) -> void" + }, + { + "label": "Calls", + "value": "0" + }, + { + "label": "Action:mapping", + "value": "Depends on IMediator @L14" + }, + { + "label": "Action:mapping", + "value": "Stores mediator @L16" + }, + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "1" + }, + { + "label": "_mediator", + "value": "IMediator required" + }, + { + "label": "Domain", + "value": "ReadingProgress, User, Ebook" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Infrastructure/RealTime/SyncHub.cs:1:1", + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 1, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 1, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_synchub_14", + "label": "SyncHub", + "diagramId": "method_flows_graph", + "nodeRole": "class", + "diagramFamily": "method-flow", + "architecturalLayer": "backend", + "summary": "SignalR hub that mediates client realtime interactions for syncing reading progress and manages user groups.", + "responsibility": "SignalR hub that mediates client realtime interactions for syncing reading progress and manages user groups.", + "technologyHints": [ + "csharp", + "Mediator", + "SignalR Hub", + "Per-user group (User_{userId})" + ], + "detailItems": [ + { + "label": "Owner", + "value": "SyncHub" + }, + { + "label": "Signature", + "value": "(mediator: IMediator) -> void" + }, + { + "label": "Calls", + "value": "0" + }, + { + "label": "Action:mapping", + "value": "Depends on IMediator @L14" + }, + { + "label": "Action:mapping", + "value": "Stores mediator @L16" + }, + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "1" + }, + { + "label": "_mediator", + "value": "IMediator required" + }, + { + "label": "Domain", + "value": "ReadingProgress, User, Ebook" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Infrastructure/RealTime/SyncHub.cs:14:1", + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 14, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 14, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ] + }, + { + "id": "flow_file_nexusreader_web_client_handlers_authenticationheaderhandler_cs_file_1", + "label": "AuthenticationHeaderHandler", + "diagramId": "method_flows_graph", + "nodeRole": "class", + "diagramFamily": "method-flow", + "architecturalLayer": "backend", + "summary": "DelegatingHandler that attaches JWTs to trusted requests and orchestrates token refresh and retry behavior.", + "responsibility": "DelegatingHandler that attaches JWTs to trusted requests and orchestrates token refresh and retry behavior.", + "technologyHints": [ + "csharp", + "DelegatingHandler", + "Token auto-refresh", + "Semaphore-based concurrency guard", + "Scoped service resolution for transient operations" + ], + "detailItems": [ + { + "label": "Owner", + "value": "AuthenticationHeaderHandler" + }, + { + "label": "Signature", + "value": "(INativeStorageService storageService, IServiceProvider serviceProvider) -> AuthenticationHeaderHandler" + }, + { + "label": "Calls", + "value": "0" + }, + { + "label": "Action:mapping", + "value": "Store injected services @L23" + }, + { + "label": "Shape", + "value": "model" + }, + { + "label": "Fields", + "value": "4" + }, + { + "label": "_storageService", + "value": "INativeStorageService required" + }, + { + "label": "_serviceProvider", + "value": "IServiceProvider required" + }, + { + "label": "TokenKey", + "value": "const string required" + }, + { + "label": "_refreshSemaphore", + "value": "SemaphoreSlim required" + }, + { + "label": "Domain", + "value": "Authentication, JWT, Token refresh" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs:1:1", + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 1, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 1, + "sourceTargetKind": "dependency", + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ] + }, + { + "id": "flow_method_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_112", + "label": "CloneHttpRequestMessageAsync", + "diagramId": "method_flows_graph", + "nodeRole": "method", + "diagramFamily": "method-flow", + "architecturalLayer": "backend", + "summary": "Creates a deep-ish clone of an HttpRequestMessage including method, URI, version, headers and buffered content to allow safe retry.", + "responsibility": "Creates a deep-ish clone of an HttpRequestMessage including method, URI, version, headers and buffered content to allow safe retry.", + "technologyHints": [ + "csharp", + "DelegatingHandler", + "Token auto-refresh", + "Semaphore-based concurrency guard", + "Scoped service resolution for transient operations" + ], + "detailItems": [ + { + "label": "Owner", + "value": "AuthenticationHeaderHandler" + }, + { + "label": "Signature", + "value": "(HttpRequestMessage req) -> Task" + }, + { + "label": "Calls", + "value": "0" + }, + { + "label": "Action:mapping", + "value": "Create new HttpRequestMessage clone @L114" + }, + { + "label": "Action:mapping", + "value": "Copy request content stream and headers @L119" + }, + { + "label": "Action:branch", + "value": "Evaluates branch condition @L119" + }, + { + "label": "Action:loop", + "value": "Repeats work over a collection or condition @L126" + }, + { + "label": "Action:mapping", + "value": "Copy request headers @L132" + }, + { + "label": "Action:loop", + "value": "Repeats work over a collection or condition @L132" + }, + { + "label": "Domain", + "value": "Authentication, JWT, Token refresh" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs:112:1", + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 112, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 112, + "sourceTargetKind": "method", + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ] + }, + { + "id": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_branch_119_119", + "label": "Evaluates branch condition", + "diagramId": "method_flows_graph", + "nodeRole": "step", + "diagramFamily": "method-flow", + "architecturalLayer": "backend", + "summary": "if (req.Content != null)", + "responsibility": "if (req.Content != null)", + "technologyHints": [ + "csharp", + "DelegatingHandler", + "Token auto-refresh", + "Semaphore-based concurrency guard", + "Scoped service resolution for transient operations" + ], + "detailItems": [ + { + "label": "Owner", + "value": "AuthenticationHeaderHandler" + }, + { + "label": "Action", + "value": "branch" + }, + { + "label": "Condition", + "value": "req.Content != null" + }, + { + "label": "Outcomes", + "value": "true, false" + }, + { + "label": "Domain", + "value": "Authentication, JWT, Token refresh" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs:119:1", + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 119, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 119, + "sourceTargetKind": "step", + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ] + }, + { + "id": "flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1", + "label": "EpubReaderService", + "diagramId": "method_flows_graph", + "nodeRole": "service", + "diagramFamily": "method-flow", + "architecturalLayer": "backend", + "summary": "Service that locates EPUB files recorded in the database, parses a requested chapter, splits the chapter into sanitized content blocks, injects AI-action trigger blocks at thresholds, and returns a ReaderPageViewModel for consumption by the application.", + "responsibility": "Important behaviors: DB lookup with user guard, file path resolution that handles dev/prod layouts, EPUB parsing via external library, paragraph extraction and HTML sanitization, word-count-based insertion of AI trigger blocks (WordThreshold = 1000), recursive navigation-title lookup, and robust error logging with Result-based failure propagation.", + "technologyHints": [ + "csharp", + "Service", + "Repository-access (via DbContext)", + "Factory (CreateAiTrigger)", + "Parsing & sanitization pipeline" + ], + "detailItems": [ + { + "label": "Owner", + "value": "EpubReaderService" + }, + { + "label": "Domain", + "value": "Ebook, Chapter/ReadingOrder, ContentBlock (TextSegmentBlock, AiActionTriggerBlock)" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Infrastructure/Services/EpubReaderService.cs:1:1", + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 1, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 1, + "sourceTargetKind": "service", + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_19", + "label": "UpdateProgress", + "diagramId": "method_flows_graph", + "nodeRole": "method", + "diagramFamily": "method-flow", + "architecturalLayer": "backend", + "summary": "Receives client progress updates, obtains the calling user id and forwards an UpdateReadingProgressCommand via MediatR when user is present.", + "responsibility": "Receives client progress updates, obtains the calling user id and forwards an UpdateReadingProgressCommand via MediatR when user is present.", + "technologyHints": [ + "csharp", + "Mediator", + "SignalR Hub", + "Per-user group (User_{userId})" + ], + "detailItems": [ + { + "label": "Owner", + "value": "SyncHub" + }, + { + "label": "Signature", + "value": "(pageId: string, ebookId: Guid, progress: double, chapterTitle: string? , chapterIndex: int) -> Task" + }, + { + "label": "Calls", + "value": "1" + }, + { + "label": "Action:repository-read", + "value": "Reads repository or persistence state @L21" + }, + { + "label": "Action:external-call", + "value": "Reads user id from connection context @L21" + }, + { + "label": "Action:guard-clause", + "value": "Requires authenticated user id @L21" + }, + { + "label": "Action:branch", + "value": "Evaluates branch condition @L22" + }, + { + "label": "Action:external-call", + "value": "Dispatches command to application layer @L24" + }, + { + "label": "Action:mapping", + "value": "Includes connection id in command @L24" + }, + { + "label": "Domain", + "value": "ReadingProgress, User, Ebook" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Infrastructure/RealTime/SyncHub.cs:19:1", + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 19, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 19, + "sourceTargetKind": "method", + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_repository_read_21_21", + "label": "Reads repository or persistence state", + "diagramId": "method_flows_graph", + "nodeRole": "step", + "diagramFamily": "method-flow", + "architecturalLayer": "backend", + "summary": "var userId = Context.User?.FindFirst(ClaimTypes.NameIdentifier)?.Value;", + "responsibility": "var userId = Context.User?.FindFirst(ClaimTypes.NameIdentifier)?.Value;", + "technologyHints": [ + "csharp", + "Mediator", + "SignalR Hub", + "Per-user group (User_{userId})" + ], + "detailItems": [ + { + "label": "Owner", + "value": "SyncHub" + }, + { + "label": "Action", + "value": "repository-read" + }, + { + "label": "Domain", + "value": "ReadingProgress, User, Ebook" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Infrastructure/RealTime/SyncHub.cs:21:1", + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 21, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 21, + "sourceTargetKind": "step", + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_28", + "label": "OnConnectedAsync", + "diagramId": "method_flows_graph", + "nodeRole": "method", + "diagramFamily": "method-flow", + "architecturalLayer": "backend", + "summary": "When a client connects, adds their connection to a per-user SignalR group (User_{userId}) and calls base connection logic.", + "responsibility": "When a client connects, adds their connection to a per-user SignalR group (User_{userId}) and calls base connection logic.", + "technologyHints": [ + "csharp", + "Mediator", + "SignalR Hub", + "Per-user group (User_{userId})" + ], + "detailItems": [ + { + "label": "Owner", + "value": "SyncHub" + }, + { + "label": "Signature", + "value": "() -> Task" + }, + { + "label": "Calls", + "value": "0" + }, + { + "label": "Action:external-call", + "value": "Reads Context.UserIdentifier @L30" + }, + { + "label": "Action:repository-read", + "value": "Reads repository or persistence state @L30" + }, + { + "label": "Action:branch", + "value": "Evaluates branch condition @L31" + }, + { + "label": "Action:guard-clause", + "value": "Only add to group if userId present @L31" + }, + { + "label": "Action:external-call", + "value": "Adds connection to per-user group @L33" + }, + { + "label": "Action:repository-read", + "value": "Reads repository or persistence state @L33" + }, + { + "label": "Domain", + "value": "ReadingProgress, User, Ebook" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Infrastructure/RealTime/SyncHub.cs:28:1", + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 28, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 28, + "sourceTargetKind": "method", + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_repository_read_30_30", + "label": "Reads repository or persistence state", + "diagramId": "method_flows_graph", + "nodeRole": "step", + "diagramFamily": "method-flow", + "architecturalLayer": "backend", + "summary": "var userId = Context.UserIdentifier;", + "responsibility": "var userId = Context.UserIdentifier;", + "technologyHints": [ + "csharp", + "Mediator", + "SignalR Hub", + "Per-user group (User_{userId})" + ], + "detailItems": [ + { + "label": "Owner", + "value": "SyncHub" + }, + { + "label": "Action", + "value": "repository-read" + }, + { + "label": "Domain", + "value": "ReadingProgress, User, Ebook" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Infrastructure/RealTime/SyncHub.cs:30:1", + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 30, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 30, + "sourceTargetKind": "step", + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_38", + "label": "OnDisconnectedAsync", + "diagramId": "method_flows_graph", + "nodeRole": "method", + "diagramFamily": "method-flow", + "architecturalLayer": "backend", + "summary": "When a client disconnects, removes their connection from the per-user SignalR group and invokes base disconnect logic.", + "responsibility": "When a client disconnects, removes their connection from the per-user SignalR group and invokes base disconnect logic.", + "technologyHints": [ + "csharp", + "Mediator", + "SignalR Hub", + "Per-user group (User_{userId})" + ], + "detailItems": [ + { + "label": "Owner", + "value": "SyncHub" + }, + { + "label": "Signature", + "value": "(exception: Exception?) -> Task" + }, + { + "label": "Calls", + "value": "0" + }, + { + "label": "Action:external-call", + "value": "Reads Context.UserIdentifier @L40" + }, + { + "label": "Action:repository-read", + "value": "Reads repository or persistence state @L40" + }, + { + "label": "Action:branch", + "value": "Evaluates branch condition @L41" + }, + { + "label": "Action:guard-clause", + "value": "Only remove from group if userId present @L41" + }, + { + "label": "Action:repository-read", + "value": "Reads repository or persistence state @L43" + }, + { + "label": "Action:external-call", + "value": "Removes connection from per-user group @L43" + }, + { + "label": "Domain", + "value": "ReadingProgress, User, Ebook" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Infrastructure/RealTime/SyncHub.cs:38:1", + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 38, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 38, + "sourceTargetKind": "method", + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_repository_read_40_40", + "label": "Reads repository or persistence state", + "diagramId": "method_flows_graph", + "nodeRole": "step", + "diagramFamily": "method-flow", + "architecturalLayer": "backend", + "summary": "var userId = Context.UserIdentifier;", + "responsibility": "var userId = Context.UserIdentifier;", + "technologyHints": [ + "csharp", + "Mediator", + "SignalR Hub", + "Per-user group (User_{userId})" + ], + "detailItems": [ + { + "label": "Owner", + "value": "SyncHub" + }, + { + "label": "Action", + "value": "repository-read" + }, + { + "label": "Domain", + "value": "ReadingProgress, User, Ebook" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Infrastructure/RealTime/SyncHub.cs:40:1", + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 40, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 40, + "sourceTargetKind": "step", + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_175", + "label": "CountWords", + "diagramId": "method_flows_graph", + "nodeRole": "method", + "diagramFamily": "method-flow", + "architecturalLayer": "backend", + "summary": "Count words in a string using whitespace separators; returns 0 for null/whitespace.", + "responsibility": "Count words in a string using whitespace separators; returns 0 for null/whitespace.", + "technologyHints": [ + "csharp", + "Service", + "Repository-access (via DbContext)", + "Factory (CreateAiTrigger)", + "Parsing & sanitization pipeline" + ], + "detailItems": [ + { + "label": "Owner", + "value": "EpubReaderService" + }, + { + "label": "Signature", + "value": "(text: string) -> int" + }, + { + "label": "Calls", + "value": "0" + }, + { + "label": "Action:guard-clause", + "value": "Empty text check @L177" + }, + { + "label": "Action:guard-clause", + "value": "Guards early exit or rejection path @L177" + }, + { + "label": "Action:return", + "value": "Returns result @L178" + }, + { + "label": "Action:mapping", + "value": "Split and count words @L178" + }, + { + "label": "Domain", + "value": "Ebook, Chapter/ReadingOrder, ContentBlock (TextSegmentBlock, AiActionTriggerBlock)" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Infrastructure/Services/EpubReaderService.cs:175:1", + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 175, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 175, + "sourceTargetKind": "method", + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_guard_clause_177_177", + "label": "Empty text check", + "diagramId": "method_flows_graph", + "nodeRole": "step", + "diagramFamily": "method-flow", + "architecturalLayer": "backend", + "summary": "Empty text check", + "responsibility": "Important behaviors: DB lookup with user guard, file path resolution that handles dev/prod layouts, EPUB parsing via external library, paragraph extraction and HTML sanitization, word-count-based insertion of AI trigger blocks (WordThreshold = 1000), recursive navigation-title lookup, and robust error logging with Result-based failure propagation.", + "technologyHints": [ + "csharp", + "Service", + "Repository-access (via DbContext)", + "Factory (CreateAiTrigger)", + "Parsing & sanitization pipeline" + ], + "detailItems": [ + { + "label": "Owner", + "value": "EpubReaderService" + }, + { + "label": "Action", + "value": "guard-clause" + }, + { + "label": "Condition", + "value": "string.IsNullOrWhiteSpace(text)" + }, + { + "label": "Outcomes", + "value": "return 0, continue" + }, + { + "label": "Domain", + "value": "Ebook, Chapter/ReadingOrder, ContentBlock (TextSegmentBlock, AiActionTriggerBlock)" + } + ], + "navigationTargets": [ + { + "key": "source", + "href": "vscode://file/NexusReader.Infrastructure/Services/EpubReaderService.cs:177:1", + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 177, + "tooltip": "Open source" + } + ], + "confidence": "high", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 177, + "sourceTargetKind": "step", + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ] + } + ], + "edgeMetadata": [ + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauiprogram_10_defines_type_10", + "diagramId": "dependency_map_graph", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_mauiprogram_10", + "relation": "transforms", + "label": "model MauiProgram", + "semanticLabel": "model MauiProgram", + "semanticTitle": "model MauiProgram", + "collapsedLabel": "model MauiProgram", + "expandedLabel": "defines-type", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 10, + "sourceTargetKind": "call-site", + "outputSummary": "Static host for MAUI app startup logic and DI composition.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28_registers_service_28", + "diagramId": "dependency_map_graph", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28", + "relation": "uses", + "label": "IPlatformService", + "semanticLabel": "IPlatformService", + "semanticTitle": "IPlatformService", + "collapsedLabel": "IPlatformService", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 28, + "sourceTargetKind": "call-site", + "outputSummary": "Registers platform abstraction implemented for MAUI", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29_registers_service_29", + "diagramId": "dependency_map_graph", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29", + "relation": "uses", + "label": "INativeStorageService", + "semanticLabel": "INativeStorageService", + "semanticTitle": "INativeStorageService", + "collapsedLabel": "INativeStorageService", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 29, + "sourceTargetKind": "call-site", + "outputSummary": "Registers platform native storage implementation", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32_registers_service_32", + "diagramId": "dependency_map_graph", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32", + "relation": "uses", + "label": "NexusAuthenticationStateProvider", + "semanticLabel": "NexusAuthenticationStateProvider", + "semanticTitle": "NexusAuthenticationStateProvider", + "collapsedLabel": "NexusAuthenticationStateProvider", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 32, + "sourceTargetKind": "call-site", + "outputSummary": "Concrete auth state provider registered", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33_registers_service_33", + "diagramId": "dependency_map_graph", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33", + "relation": "uses", + "label": "Microsoft.AspNetCore.Components.Authorization.AuthenticationStateProvider", + "semanticLabel": "Microsoft.AspNetCore.Components.Authorization.AuthenticationStateProvider", + "semanticTitle": "Microsoft.AspNetCore.Components.Authorization.AuthenticationStateProvider", + "collapsedLabel": "Microsoft.AspNetCore.Components.Authorization.AuthenticationStateProvider", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 33, + "sourceTargetKind": "call-site", + "outputSummary": "Maps framework AuthenticationStateProvider to NexusAuthenticationStateProvider via service locator factory", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38_registers_service_38", + "diagramId": "dependency_map_graph", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38", + "relation": "uses", + "label": "HttpClient", + "semanticLabel": "HttpClient", + "semanticTitle": "HttpClient", + "collapsedLabel": "HttpClient", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 38, + "sourceTargetKind": "call-site", + "outputSummary": "Registers HttpClient with BaseAddress = http://10.0.2.2:5000 (Android emulator to local server)", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1_registers_service_1", + "diagramId": "dependency_map_graph", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1", + "relation": "uses", + "label": "UI and app state services", + "semanticLabel": "UI and app state services", + "semanticTitle": "UI and app state services", + "collapsedLabel": "UI and app state services", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 1, + "sourceTargetKind": "call-site", + "outputSummary": "Registers multiple scoped services handling UI state, knowledge coordination, sync and identity", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51_registers_service_51", + "diagramId": "dependency_map_graph", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51", + "relation": "uses", + "label": "Application layer services extension", + "semanticLabel": "Application layer services (extension)", + "semanticTitle": "Application layer services (extension)", + "collapsedLabel": "Application layer services extension", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 51, + "sourceTargetKind": "call-site", + "outputSummary": "Calls AddApplication() extension to register Application-layer services", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53_registers_service_53", + "diagramId": "dependency_map_graph", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53", + "relation": "uses", + "label": "MediatR handlers", + "semanticLabel": "MediatR handlers", + "semanticTitle": "MediatR handlers", + "collapsedLabel": "MediatR handlers", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 53, + "sourceTargetKind": "call-site", + "outputSummary": "Registers MediatR and scans NexusReader.Application assembly for handlers", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61_defines_type_61", + "diagramId": "dependency_map_graph", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61", + "relation": "transforms", + "label": "model ThrowingDbContextFactory", + "semanticLabel": "model ThrowingDbContextFactory", + "semanticTitle": "model ThrowingDbContextFactory", + "collapsedLabel": "model ThrowingDbContextFactory", + "expandedLabel": "defines-type", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 61, + "sourceTargetKind": "call-site", + "outputSummary": "IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66_defines_type_66", + "diagramId": "dependency_map_graph", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66", + "relation": "transforms", + "label": "model ThrowingEmbeddingGenerator", + "semanticLabel": "model ThrowingEmbeddingGenerator", + "semanticTitle": "model ThrowingEmbeddingGenerator", + "collapsedLabel": "model ThrowingEmbeddingGenerator", + "expandedLabel": "defines-type", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 66, + "sourceTargetKind": "call-site", + "outputSummary": "IEmbeddingGenerator implementation that disables local embedding generation in WASM (throws on GenerateAsync).", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74_defines_type_74", + "diagramId": "dependency_map_graph", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74", + "relation": "transforms", + "label": "model ThrowingBookStorageService", + "semanticLabel": "model ThrowingBookStorageService", + "semanticTitle": "model ThrowingBookStorageService", + "collapsedLabel": "model ThrowingBookStorageService", + "expandedLabel": "defines-type", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 74, + "sourceTargetKind": "call-site", + "outputSummary": "IBookStorageService implementation that throws for all file storage operations in WASM.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84_defines_type_84", + "diagramId": "dependency_map_graph", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84", + "relation": "transforms", + "label": "model ThrowingEbookRepository", + "semanticLabel": "model ThrowingEbookRepository", + "semanticTitle": "model ThrowingEbookRepository", + "collapsedLabel": "model ThrowingEbookRepository", + "expandedLabel": "defines-type", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 84, + "sourceTargetKind": "call-site", + "outputSummary": "IEbookRepository implementation that throws for all repository operations in WASM.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94_defines_type_94", + "diagramId": "dependency_map_graph", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94", + "relation": "transforms", + "label": "model ThrowingSyncBroadcaster", + "semanticLabel": "model ThrowingSyncBroadcaster", + "semanticTitle": "model ThrowingSyncBroadcaster", + "collapsedLabel": "model ThrowingSyncBroadcaster", + "expandedLabel": "defines-type", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 94, + "sourceTargetKind": "call-site", + "outputSummary": "ISyncBroadcaster implementation that throws because real-time broadcasting must run on the server.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_webplatformservice_18_registers_service_18", + "diagramId": "dependency_map_graph", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_webplatformservice_18", + "relation": "uses", + "label": "IPlatformService", + "semanticLabel": "IPlatformService", + "semanticTitle": "IPlatformService", + "collapsedLabel": "IPlatformService", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 18, + "sourceTargetKind": "call-site", + "outputSummary": "Registers platform abstraction for browser.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33_registers_service_33", + "diagramId": "dependency_map_graph", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33", + "relation": "uses", + "label": "NexusAuthenticationStateProvider", + "semanticLabel": "NexusAuthenticationStateProvider", + "semanticTitle": "NexusAuthenticationStateProvider", + "collapsedLabel": "NexusAuthenticationStateProvider", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 33, + "sourceTargetKind": "call-site", + "outputSummary": "Authentication state provider and wiring to AuthenticationStateProvider.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38_registers_service_38", + "diagramId": "dependency_map_graph", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38", + "relation": "uses", + "label": "IKnowledgeService", + "semanticLabel": "IKnowledgeService", + "semanticTitle": "IKnowledgeService", + "collapsedLabel": "IKnowledgeService", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 38, + "sourceTargetKind": "call-site", + "outputSummary": "Registers a WASM-specific knowledge service implementation.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_configured_httpclient_40_registers_service_40", + "diagramId": "dependency_map_graph", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_configured_httpclient_40", + "relation": "uses", + "label": "uses", + "semanticLabel": "HttpClient (named 'NexusAPI')", + "semanticTitle": "HttpClient (named 'NexusAPI')", + "collapsedLabel": "uses", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 40, + "sourceTargetKind": "call-site", + "outputSummary": "Adds named HTTP client with base address and authentication header handler.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28_registers_service_28", + "diagramId": "startup_runtime_graph", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28", + "relation": "uses", + "label": "IPlatformService", + "semanticLabel": "IPlatformService", + "semanticTitle": "IPlatformService", + "collapsedLabel": "IPlatformService", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 28, + "sourceTargetKind": "call-site", + "outputSummary": "Registers platform abstraction implemented for MAUI", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29_registers_service_29", + "diagramId": "startup_runtime_graph", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29", + "relation": "uses", + "label": "INativeStorageService", + "semanticLabel": "INativeStorageService", + "semanticTitle": "INativeStorageService", + "collapsedLabel": "INativeStorageService", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 29, + "sourceTargetKind": "call-site", + "outputSummary": "Registers platform native storage implementation", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32_registers_service_32", + "diagramId": "startup_runtime_graph", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32", + "relation": "uses", + "label": "NexusAuthenticationStateProvider", + "semanticLabel": "NexusAuthenticationStateProvider", + "semanticTitle": "NexusAuthenticationStateProvider", + "collapsedLabel": "NexusAuthenticationStateProvider", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 32, + "sourceTargetKind": "call-site", + "outputSummary": "Concrete auth state provider registered", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33_registers_service_33", + "diagramId": "startup_runtime_graph", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33", + "relation": "uses", + "label": "Microsoft.AspNetCore.Components.Authorization.AuthenticationStateProvider", + "semanticLabel": "Microsoft.AspNetCore.Components.Authorization.AuthenticationStateProvider", + "semanticTitle": "Microsoft.AspNetCore.Components.Authorization.AuthenticationStateProvider", + "collapsedLabel": "Microsoft.AspNetCore.Components.Authorization.AuthenticationStateProvider", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 33, + "sourceTargetKind": "call-site", + "outputSummary": "Maps framework AuthenticationStateProvider to NexusAuthenticationStateProvider via service locator factory", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38_registers_service_38", + "diagramId": "startup_runtime_graph", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38", + "relation": "uses", + "label": "HttpClient", + "semanticLabel": "HttpClient", + "semanticTitle": "HttpClient", + "collapsedLabel": "HttpClient", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 38, + "sourceTargetKind": "call-site", + "outputSummary": "Registers HttpClient with BaseAddress = http://10.0.2.2:5000 (Android emulator to local server)", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1_registers_service_1", + "diagramId": "startup_runtime_graph", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1", + "relation": "uses", + "label": "UI and app state services", + "semanticLabel": "UI and app state services", + "semanticTitle": "UI and app state services", + "collapsedLabel": "UI and app state services", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 1, + "sourceTargetKind": "call-site", + "outputSummary": "Registers multiple scoped services handling UI state, knowledge coordination, sync and identity", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51_registers_service_51", + "diagramId": "startup_runtime_graph", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51", + "relation": "uses", + "label": "Application layer services extension", + "semanticLabel": "Application layer services (extension)", + "semanticTitle": "Application layer services (extension)", + "collapsedLabel": "Application layer services extension", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 51, + "sourceTargetKind": "call-site", + "outputSummary": "Calls AddApplication() extension to register Application-layer services", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53_registers_service_53", + "diagramId": "startup_runtime_graph", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53", + "relation": "uses", + "label": "MediatR handlers", + "semanticLabel": "MediatR handlers", + "semanticTitle": "MediatR handlers", + "collapsedLabel": "MediatR handlers", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 53, + "sourceTargetKind": "call-site", + "outputSummary": "Registers MediatR and scans NexusReader.Application assembly for handlers", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_method_nexusreader_maui_mauiprogram_cs_create_and_build_mauiapp_16_configures_pipeline_16", + "diagramId": "startup_runtime_graph", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_method_nexusreader_maui_mauiprogram_cs_create_and_build_mauiapp_16", + "relation": "calls", + "label": "unknown", + "semanticLabel": "unknown", + "semanticTitle": "unknown", + "collapsedLabel": "unknown", + "expandedLabel": "configures-pipeline", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 16, + "sourceTargetKind": "call-site", + "outputSummary": "unknown", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_webplatformservice_18_registers_service_18", + "diagramId": "startup_runtime_graph", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_webplatformservice_18", + "relation": "uses", + "label": "IPlatformService", + "semanticLabel": "IPlatformService", + "semanticTitle": "IPlatformService", + "collapsedLabel": "IPlatformService", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 18, + "sourceTargetKind": "call-site", + "outputSummary": "Registers platform abstraction for browser.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33_registers_service_33", + "diagramId": "startup_runtime_graph", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33", + "relation": "uses", + "label": "NexusAuthenticationStateProvider", + "semanticLabel": "NexusAuthenticationStateProvider", + "semanticTitle": "NexusAuthenticationStateProvider", + "collapsedLabel": "NexusAuthenticationStateProvider", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 33, + "sourceTargetKind": "call-site", + "outputSummary": "Authentication state provider and wiring to AuthenticationStateProvider.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38_registers_service_38", + "diagramId": "startup_runtime_graph", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38", + "relation": "uses", + "label": "IKnowledgeService", + "semanticLabel": "IKnowledgeService", + "semanticTitle": "IKnowledgeService", + "collapsedLabel": "IKnowledgeService", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 38, + "sourceTargetKind": "call-site", + "outputSummary": "Registers a WASM-specific knowledge service implementation.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_configured_httpclient_40_registers_service_40", + "diagramId": "startup_runtime_graph", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_configured_httpclient_40", + "relation": "uses", + "label": "uses", + "semanticLabel": "HttpClient (named 'NexusAPI')", + "semanticTitle": "HttpClient (named 'NexusAPI')", + "collapsedLabel": "uses", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 40, + "sourceTargetKind": "call-site", + "outputSummary": "Adds named HTTP client with base address and authentication header handler.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49_registers_service_49", + "diagramId": "startup_runtime_graph", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49", + "relation": "uses", + "label": "IDbContextFactory AppDbContext>", + "semanticLabel": "IDbContextFactory", + "semanticTitle": "IDbContextFactory", + "collapsedLabel": "IDbContextFactory AppDbContext>", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 49, + "sourceTargetKind": "call-site", + "outputSummary": "Registers throw-only stub to avoid using DbContext in WASM.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_n_a_55_registers_service_55", + "diagramId": "startup_runtime_graph", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_n_a_55", + "relation": "uses", + "label": "application services via extension", + "semanticLabel": "application services (via extension)", + "semanticTitle": "application services (via extension)", + "collapsedLabel": "application services via extension", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 55, + "sourceTargetKind": "call-site", + "outputSummary": "Calls AddApplication() to register application-layer services.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15_invokes_15", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15", + "relation": "calls", + "label": "Program top-level startup", + "semanticLabel": "Program (top-level startup)", + "semanticTitle": "Program (top-level startup)", + "collapsedLabel": "Program top-level startup", + "expandedLabel": "handles-route", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 15, + "sourceTargetKind": "call-site", + "outputSummary": "Create the WebAssemblyHostBuilder, register application and platform services, add HTTP client and dummy server-only stubs, then build and run the WASM host.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_getservice_71_invokes_71", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_method_nexusreader_web_client_program_cs_getservice_71", + "relation": "calls", + "label": "GetService", + "semanticLabel": "GetService", + "semanticTitle": "GetService", + "collapsedLabel": "GetService", + "expandedLabel": "handles-route", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 71, + "sourceTargetKind": "call-site", + "outputSummary": "Fallback service resolver stub that always returns null.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_method_nexusreader_web_client_program_cs_getservice_71_flow_action_nexusreader_web_client_program_cs_getservice_return_71_71_returns_71", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "from": "flow_method_nexusreader_web_client_program_cs_getservice_71", + "to": "flow_action_nexusreader_web_client_program_cs_getservice_return_71_71", + "relation": "returns", + "label": "returns null", + "semanticLabel": "returns null", + "semanticTitle": "returns null", + "collapsedLabel": "returns null", + "expandedLabel": "returns", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 71, + "sourceTargetKind": "return-source", + "outputSummary": "public object? GetService(...) => null", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88_invokes_88", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88", + "relation": "calls", + "label": "FindAuthorByNameAsync", + "semanticLabel": "FindAuthorByNameAsync", + "semanticTitle": "FindAuthorByNameAsync", + "collapsedLabel": "FindAuthorByNameAsync", + "expandedLabel": "handles-route", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 88, + "sourceTargetKind": "call-site", + "outputSummary": "Repository lookup stub that throws because repository access is unsupported in WASM.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88_flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88_invokes_88", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "from": "flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88", + "to": "flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88", + "relation": "calls", + "label": "Reads repository or persistence state", + "semanticLabel": "Reads repository or persistence state", + "semanticTitle": "Reads repository or persistence state", + "collapsedLabel": "Reads repository or persistence state", + "expandedLabel": "invokes", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 88, + "sourceTargetKind": "call-site", + "outputSummary": "public Task FindAuthorByNameAsync(string name, CancellationToken cancellationToken = default) => throw new NotSupportedException(ErrorMessage);", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61_defines_type_61", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61", + "relation": "transforms", + "label": "model ThrowingDbContextFactory", + "semanticLabel": "model ThrowingDbContextFactory", + "semanticTitle": "model ThrowingDbContextFactory", + "collapsedLabel": "model ThrowingDbContextFactory", + "expandedLabel": "defines-type", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 61, + "sourceTargetKind": "call-site", + "outputSummary": "IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66_defines_type_66", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66", + "relation": "transforms", + "label": "model ThrowingEmbeddingGenerator", + "semanticLabel": "model ThrowingEmbeddingGenerator", + "semanticTitle": "model ThrowingEmbeddingGenerator", + "collapsedLabel": "model ThrowingEmbeddingGenerator", + "expandedLabel": "defines-type", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 66, + "sourceTargetKind": "call-site", + "outputSummary": "IEmbeddingGenerator implementation that disables local embedding generation in WASM (throws on GenerateAsync).", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74_defines_type_74", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74", + "relation": "transforms", + "label": "model ThrowingBookStorageService", + "semanticLabel": "model ThrowingBookStorageService", + "semanticTitle": "model ThrowingBookStorageService", + "collapsedLabel": "model ThrowingBookStorageService", + "expandedLabel": "defines-type", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 74, + "sourceTargetKind": "call-site", + "outputSummary": "IBookStorageService implementation that throws for all file storage operations in WASM.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84_defines_type_84", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84", + "relation": "transforms", + "label": "model ThrowingEbookRepository", + "semanticLabel": "model ThrowingEbookRepository", + "semanticTitle": "model ThrowingEbookRepository", + "collapsedLabel": "model ThrowingEbookRepository", + "expandedLabel": "defines-type", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 84, + "sourceTargetKind": "call-site", + "outputSummary": "IEbookRepository implementation that throws for all repository operations in WASM.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94_defines_type_94", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94", + "relation": "transforms", + "label": "model ThrowingSyncBroadcaster", + "semanticLabel": "model ThrowingSyncBroadcaster", + "semanticTitle": "model ThrowingSyncBroadcaster", + "collapsedLabel": "model ThrowingSyncBroadcaster", + "expandedLabel": "defines-type", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 94, + "sourceTargetKind": "call-site", + "outputSummary": "ISyncBroadcaster implementation that throws because real-time broadcasting must run on the server.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_webplatformservice_18_registers_service_18", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_webplatformservice_18", + "relation": "uses", + "label": "IPlatformService", + "semanticLabel": "IPlatformService", + "semanticTitle": "IPlatformService", + "collapsedLabel": "IPlatformService", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 18, + "sourceTargetKind": "call-site", + "outputSummary": "Registers platform abstraction for browser.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33_registers_service_33", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33", + "relation": "uses", + "label": "NexusAuthenticationStateProvider", + "semanticLabel": "NexusAuthenticationStateProvider", + "semanticTitle": "NexusAuthenticationStateProvider", + "collapsedLabel": "NexusAuthenticationStateProvider", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 33, + "sourceTargetKind": "call-site", + "outputSummary": "Authentication state provider and wiring to AuthenticationStateProvider.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38_registers_service_38", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38", + "relation": "uses", + "label": "IKnowledgeService", + "semanticLabel": "IKnowledgeService", + "semanticTitle": "IKnowledgeService", + "collapsedLabel": "IKnowledgeService", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 38, + "sourceTargetKind": "call-site", + "outputSummary": "Registers a WASM-specific knowledge service implementation.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_configured_httpclient_40_registers_service_40", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_configured_httpclient_40", + "relation": "uses", + "label": "uses", + "semanticLabel": "HttpClient (named 'NexusAPI')", + "semanticTitle": "HttpClient (named 'NexusAPI')", + "collapsedLabel": "uses", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 40, + "sourceTargetKind": "call-site", + "outputSummary": "Adds named HTTP client with base address and authentication header handler.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49_registers_service_49", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49", + "relation": "uses", + "label": "IDbContextFactory AppDbContext>", + "semanticLabel": "IDbContextFactory", + "semanticTitle": "IDbContextFactory", + "collapsedLabel": "IDbContextFactory AppDbContext>", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 49, + "sourceTargetKind": "call-site", + "outputSummary": "Registers throw-only stub to avoid using DbContext in WASM.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_n_a_55_registers_service_55", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_n_a_55", + "relation": "uses", + "label": "application services via extension", + "semanticLabel": "application services (via extension)", + "semanticTitle": "application services (via extension)", + "collapsedLabel": "application services via extension", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 55, + "sourceTargetKind": "call-site", + "outputSummary": "Calls AddApplication() to register application-layer services.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_wasmepubreader_56_registers_service_56", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_wasmepubreader_56", + "relation": "uses", + "label": "IEpubReader", + "semanticLabel": "IEpubReader", + "semanticTitle": "IEpubReader", + "collapsedLabel": "IEpubReader", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 56, + "sourceTargetKind": "call-site", + "outputSummary": "Registers WASM epub reader implementation.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_run_wasm_host_59_configures_pipeline_59", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_method_nexusreader_web_client_program_cs_run_wasm_host_59", + "relation": "calls", + "label": "unknown", + "semanticLabel": "unknown", + "semanticTitle": "unknown", + "collapsedLabel": "unknown", + "expandedLabel": "configures-pipeline", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 59, + "sourceTargetKind": "call-site", + "outputSummary": "unknown", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_program_top_level_29_invokes_29", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_method_nexusreader_web_program_cs_program_top_level_29", + "relation": "calls", + "label": "Program top-level", + "semanticLabel": "Program (top-level)", + "semanticTitle": "Program (top-level)", + "collapsedLabel": "Program top-level", + "expandedLabel": "handles-route", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 29, + "sourceTargetKind": "call-site", + "outputSummary": "Top-level program: build host, register services and middleware, map routes/endpoints, run the app.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs" + ] + }, + { + "id": "edge_flow_method_nexusreader_web_program_cs_program_top_level_29_flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62_evaluates_condition_62", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "from": "flow_method_nexusreader_web_program_cs_program_top_level_29", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "relation": "calls", + "label": "true / false", + "semanticLabel": "true / false", + "semanticTitle": "true / false", + "collapsedLabel": "true / false", + "expandedLabel": "evaluates-condition", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 62, + "sourceTargetKind": "call-site", + "outputSummary": "if (!string.IsNullOrEmpty(apiBaseUrl))", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs" + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_falls_back_66", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "relation": "calls", + "label": "fallback", + "semanticLabel": "fallback", + "semanticTitle": "fallback", + "collapsedLabel": "fallback", + "expandedLabel": "falls-back", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 66, + "sourceTargetKind": "call-site", + "outputSummary": "else", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs" + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125_invokes_125", + "diagramId": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125", + "relation": "calls", + "label": "Reads repository or persistence state", + "semanticLabel": "Reads repository or persistence state", + "semanticTitle": "Reads repository or persistence state", + "collapsedLabel": "Reads repository or persistence state", + "expandedLabel": "invokes", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 125, + "sourceTargetKind": "call-site", + "outputSummary": "var isApiRequest = context.Request.Path.StartsWithSegments(\"/api\") ||", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs" + ] + }, + { + "id": "edge_flow_method_nexusreader_web_client_program_cs_getservice_71_flow_action_nexusreader_web_client_program_cs_getservice_return_71_71_returns_71", + "diagramId": "control_flow_flow_1_nexusreader_web_client_program_cs", + "from": "flow_method_nexusreader_web_client_program_cs_getservice_71", + "to": "flow_action_nexusreader_web_client_program_cs_getservice_return_71_71", + "relation": "returns", + "label": "returns null", + "semanticLabel": "returns null", + "semanticTitle": "returns null", + "collapsedLabel": "returns null", + "expandedLabel": "returns", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 71, + "sourceTargetKind": "return-source", + "outputSummary": "public object? GetService(...) => null", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88_flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88_invokes_88", + "diagramId": "control_flow_flow_1_nexusreader_web_client_program_cs", + "from": "flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88", + "to": "flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88", + "relation": "calls", + "label": "Reads repository or persistence state", + "semanticLabel": "Reads repository or persistence state", + "semanticTitle": "Reads repository or persistence state", + "collapsedLabel": "Reads repository or persistence state", + "expandedLabel": "invokes", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 88, + "sourceTargetKind": "call-site", + "outputSummary": "public Task FindAuthorByNameAsync(string name, CancellationToken cancellationToken = default) => throw new NotSupportedException(ErrorMessage);", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_method_nexusreader_web_program_cs_program_top_level_29_flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62_evaluates_condition_62", + "diagramId": "control_flow_flow_1_nexusreader_web_client_program_cs", + "from": "flow_method_nexusreader_web_program_cs_program_top_level_29", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "relation": "calls", + "label": "true / false", + "semanticLabel": "true / false", + "semanticTitle": "true / false", + "collapsedLabel": "true / false", + "expandedLabel": "evaluates-condition", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 62, + "sourceTargetKind": "call-site", + "outputSummary": "if (!string.IsNullOrEmpty(apiBaseUrl))", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs" + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_falls_back_66", + "diagramId": "control_flow_flow_1_nexusreader_web_client_program_cs", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "relation": "calls", + "label": "fallback", + "semanticLabel": "fallback", + "semanticTitle": "fallback", + "collapsedLabel": "fallback", + "expandedLabel": "falls-back", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 66, + "sourceTargetKind": "call-site", + "outputSummary": "else", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs" + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125_invokes_125", + "diagramId": "control_flow_flow_1_nexusreader_web_client_program_cs", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125", + "relation": "calls", + "label": "Reads repository or persistence state", + "semanticLabel": "Reads repository or persistence state", + "semanticTitle": "Reads repository or persistence state", + "collapsedLabel": "Reads repository or persistence state", + "expandedLabel": "invokes", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 125, + "sourceTargetKind": "call-site", + "outputSummary": "var isApiRequest = context.Request.Path.StartsWithSegments(\"/api\") ||", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs" + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_126_126_invokes_126", + "diagramId": "control_flow_flow_1_nexusreader_web_client_program_cs", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_126_126", + "relation": "calls", + "label": "Reads repository or persistence state", + "semanticLabel": "Reads repository or persistence state", + "semanticTitle": "Reads repository or persistence state", + "collapsedLabel": "Reads repository or persistence state", + "expandedLabel": "invokes", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 126, + "sourceTargetKind": "call-site", + "outputSummary": "context.Request.Path.StartsWithSegments(\"/identity\") ||", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs" + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_flow_method_nexusreader_application_dependencyinjection_cs_addapplication_8_uses_service_78", + "diagramId": "control_flow_flow_1_nexusreader_web_client_program_cs", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "to": "flow_method_nexusreader_application_dependencyinjection_cs_addapplication_8", + "relation": "uses", + "label": "AddApplication", + "semanticLabel": "AddApplication", + "semanticTitle": "AddApplication", + "collapsedLabel": "AddApplication", + "expandedLabel": "uses-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 78, + "sourceTargetKind": "call-site", + "outputSummary": "IServiceCollection", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs" + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_flow_method_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_31_uses_service_79", + "diagramId": "control_flow_flow_1_nexusreader_web_client_program_cs", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "to": "flow_method_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_31", + "relation": "uses", + "label": "AddInfrastructure", + "semanticLabel": "AddInfrastructure", + "semanticTitle": "AddInfrastructure", + "collapsedLabel": "AddInfrastructure", + "expandedLabel": "uses-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 79, + "sourceTargetKind": "call-site", + "outputSummary": "IServiceCollection, IConfiguration", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61_defines_type_61", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61", + "relation": "transforms", + "label": "model ThrowingDbContextFactory", + "semanticLabel": "model ThrowingDbContextFactory", + "semanticTitle": "model ThrowingDbContextFactory", + "collapsedLabel": "model ThrowingDbContextFactory", + "expandedLabel": "defines-type", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 61, + "sourceTargetKind": "call-site", + "outputSummary": "IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66_defines_type_66", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66", + "relation": "transforms", + "label": "model ThrowingEmbeddingGenerator", + "semanticLabel": "model ThrowingEmbeddingGenerator", + "semanticTitle": "model ThrowingEmbeddingGenerator", + "collapsedLabel": "model ThrowingEmbeddingGenerator", + "expandedLabel": "defines-type", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 66, + "sourceTargetKind": "call-site", + "outputSummary": "IEmbeddingGenerator implementation that disables local embedding generation in WASM (throws on GenerateAsync).", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74_defines_type_74", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74", + "relation": "transforms", + "label": "model ThrowingBookStorageService", + "semanticLabel": "model ThrowingBookStorageService", + "semanticTitle": "model ThrowingBookStorageService", + "collapsedLabel": "model ThrowingBookStorageService", + "expandedLabel": "defines-type", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 74, + "sourceTargetKind": "call-site", + "outputSummary": "IBookStorageService implementation that throws for all file storage operations in WASM.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84_defines_type_84", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84", + "relation": "transforms", + "label": "model ThrowingEbookRepository", + "semanticLabel": "model ThrowingEbookRepository", + "semanticTitle": "model ThrowingEbookRepository", + "collapsedLabel": "model ThrowingEbookRepository", + "expandedLabel": "defines-type", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 84, + "sourceTargetKind": "call-site", + "outputSummary": "IEbookRepository implementation that throws for all repository operations in WASM.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94_defines_type_94", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94", + "relation": "transforms", + "label": "model ThrowingSyncBroadcaster", + "semanticLabel": "model ThrowingSyncBroadcaster", + "semanticTitle": "model ThrowingSyncBroadcaster", + "collapsedLabel": "model ThrowingSyncBroadcaster", + "expandedLabel": "defines-type", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 94, + "sourceTargetKind": "call-site", + "outputSummary": "ISyncBroadcaster implementation that throws because real-time broadcasting must run on the server.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_knowledgerequest_566_maps_dto_566", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_type_nexusreader_web_program_cs_knowledgerequest_566", + "relation": "transforms", + "label": "dto KnowledgeRequest", + "semanticLabel": "dto KnowledgeRequest", + "semanticTitle": "dto KnowledgeRequest", + "collapsedLabel": "dto KnowledgeRequest", + "expandedLabel": "maps-dto", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 566, + "sourceTargetKind": "call-site", + "outputSummary": "Request DTO carrying free-text input and optional ebook context for knowledge APIs.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_groundednessrequest_567_maps_dto_567", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_type_nexusreader_web_program_cs_groundednessrequest_567", + "relation": "transforms", + "label": "dto GroundednessRequest", + "semanticLabel": "dto GroundednessRequest", + "semanticTitle": "dto GroundednessRequest", + "collapsedLabel": "dto GroundednessRequest", + "expandedLabel": "maps-dto", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 567, + "sourceTargetKind": "call-site", + "outputSummary": "Request DTO for verifying answer groundedness in a context.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_semanticsearchrequest_568_maps_dto_568", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_type_nexusreader_web_program_cs_semanticsearchrequest_568", + "relation": "transforms", + "label": "dto SemanticSearchRequest", + "semanticLabel": "dto SemanticSearchRequest", + "semanticTitle": "dto SemanticSearchRequest", + "collapsedLabel": "dto SemanticSearchRequest", + "expandedLabel": "maps-dto", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 568, + "sourceTargetKind": "call-site", + "outputSummary": "DTO for semantic search requests with a limit.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_askquestionrequest_569_maps_dto_569", + "diagramId": "contracts_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_type_nexusreader_web_program_cs_askquestionrequest_569", + "relation": "transforms", + "label": "dto AskQuestionRequest", + "semanticLabel": "dto AskQuestionRequest", + "semanticTitle": "dto AskQuestionRequest", + "collapsedLabel": "dto AskQuestionRequest", + "expandedLabel": "maps-dto", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 569, + "sourceTargetKind": "call-site", + "outputSummary": "DTO for question-asking APIs including optional ebook context and limit.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61_defines_type_61", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61", + "relation": "transforms", + "label": "model ThrowingDbContextFactory", + "semanticLabel": "model ThrowingDbContextFactory", + "semanticTitle": "model ThrowingDbContextFactory", + "collapsedLabel": "model ThrowingDbContextFactory", + "expandedLabel": "defines-type", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 61, + "sourceTargetKind": "call-site", + "outputSummary": "IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66_defines_type_66", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66", + "relation": "transforms", + "label": "model ThrowingEmbeddingGenerator", + "semanticLabel": "model ThrowingEmbeddingGenerator", + "semanticTitle": "model ThrowingEmbeddingGenerator", + "collapsedLabel": "model ThrowingEmbeddingGenerator", + "expandedLabel": "defines-type", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 66, + "sourceTargetKind": "call-site", + "outputSummary": "IEmbeddingGenerator implementation that disables local embedding generation in WASM (throws on GenerateAsync).", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74_defines_type_74", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74", + "relation": "transforms", + "label": "model ThrowingBookStorageService", + "semanticLabel": "model ThrowingBookStorageService", + "semanticTitle": "model ThrowingBookStorageService", + "collapsedLabel": "model ThrowingBookStorageService", + "expandedLabel": "defines-type", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 74, + "sourceTargetKind": "call-site", + "outputSummary": "IBookStorageService implementation that throws for all file storage operations in WASM.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84_defines_type_84", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84", + "relation": "transforms", + "label": "model ThrowingEbookRepository", + "semanticLabel": "model ThrowingEbookRepository", + "semanticTitle": "model ThrowingEbookRepository", + "collapsedLabel": "model ThrowingEbookRepository", + "expandedLabel": "defines-type", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 84, + "sourceTargetKind": "call-site", + "outputSummary": "IEbookRepository implementation that throws for all repository operations in WASM.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94_defines_type_94", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94", + "relation": "transforms", + "label": "model ThrowingSyncBroadcaster", + "semanticLabel": "model ThrowingSyncBroadcaster", + "semanticTitle": "model ThrowingSyncBroadcaster", + "collapsedLabel": "model ThrowingSyncBroadcaster", + "expandedLabel": "defines-type", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 94, + "sourceTargetKind": "call-site", + "outputSummary": "ISyncBroadcaster implementation that throws because real-time broadcasting must run on the server.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_webplatformservice_18_registers_service_18", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_webplatformservice_18", + "relation": "uses", + "label": "IPlatformService", + "semanticLabel": "IPlatformService", + "semanticTitle": "IPlatformService", + "collapsedLabel": "IPlatformService", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 18, + "sourceTargetKind": "call-site", + "outputSummary": "Registers platform abstraction for browser.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33_registers_service_33", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33", + "relation": "uses", + "label": "NexusAuthenticationStateProvider", + "semanticLabel": "NexusAuthenticationStateProvider", + "semanticTitle": "NexusAuthenticationStateProvider", + "collapsedLabel": "NexusAuthenticationStateProvider", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 33, + "sourceTargetKind": "call-site", + "outputSummary": "Authentication state provider and wiring to AuthenticationStateProvider.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38_registers_service_38", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38", + "relation": "uses", + "label": "IKnowledgeService", + "semanticLabel": "IKnowledgeService", + "semanticTitle": "IKnowledgeService", + "collapsedLabel": "IKnowledgeService", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 38, + "sourceTargetKind": "call-site", + "outputSummary": "Registers a WASM-specific knowledge service implementation.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_configured_httpclient_40_registers_service_40", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_configured_httpclient_40", + "relation": "uses", + "label": "uses", + "semanticLabel": "HttpClient (named 'NexusAPI')", + "semanticTitle": "HttpClient (named 'NexusAPI')", + "collapsedLabel": "uses", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 40, + "sourceTargetKind": "call-site", + "outputSummary": "Adds named HTTP client with base address and authentication header handler.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49_registers_service_49", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49", + "relation": "uses", + "label": "IDbContextFactory AppDbContext>", + "semanticLabel": "IDbContextFactory", + "semanticTitle": "IDbContextFactory", + "collapsedLabel": "IDbContextFactory AppDbContext>", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 49, + "sourceTargetKind": "call-site", + "outputSummary": "Registers throw-only stub to avoid using DbContext in WASM.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_n_a_55_registers_service_55", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_n_a_55", + "relation": "uses", + "label": "application services via extension", + "semanticLabel": "application services (via extension)", + "semanticTitle": "application services (via extension)", + "collapsedLabel": "application services via extension", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 55, + "sourceTargetKind": "call-site", + "outputSummary": "Calls AddApplication() to register application-layer services.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_wasmepubreader_56_registers_service_56", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_wasmepubreader_56", + "relation": "uses", + "label": "IEpubReader", + "semanticLabel": "IEpubReader", + "semanticTitle": "IEpubReader", + "collapsedLabel": "IEpubReader", + "expandedLabel": "registers-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 56, + "sourceTargetKind": "call-site", + "outputSummary": "Registers WASM epub reader implementation.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_falls_back_66", + "diagramId": "layer_flow_1_nexusreader_web_client_program_cs", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "relation": "calls", + "label": "fallback", + "semanticLabel": "fallback", + "semanticTitle": "fallback", + "collapsedLabel": "fallback", + "expandedLabel": "falls-back", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 66, + "sourceTargetKind": "call-site", + "outputSummary": "else", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs" + ] + }, + { + "id": "edge_flow_method_nexusreader_web_client_program_cs_getservice_71_flow_action_nexusreader_web_client_program_cs_getservice_return_71_71_returns_71", + "diagramId": "failure_flow_1_nexusreader_web_client_program_cs", + "from": "flow_method_nexusreader_web_client_program_cs_getservice_71", + "to": "flow_action_nexusreader_web_client_program_cs_getservice_return_71_71", + "relation": "returns", + "label": "returns null", + "semanticLabel": "returns null", + "semanticTitle": "returns null", + "collapsedLabel": "returns null", + "expandedLabel": "returns", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 71, + "sourceTargetKind": "return-source", + "outputSummary": "public object? GetService(...) => null", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs" + ] + }, + { + "id": "edge_flow_method_nexusreader_web_program_cs_program_top_level_29_flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62_evaluates_condition_62", + "diagramId": "failure_flow_1_nexusreader_web_client_program_cs", + "from": "flow_method_nexusreader_web_program_cs_program_top_level_29", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "relation": "calls", + "label": "true / false", + "semanticLabel": "true / false", + "semanticTitle": "true / false", + "collapsedLabel": "true / false", + "expandedLabel": "evaluates-condition", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 62, + "sourceTargetKind": "call-site", + "outputSummary": "if (!string.IsNullOrEmpty(apiBaseUrl))", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs" + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_falls_back_66", + "diagramId": "failure_flow_1_nexusreader_web_client_program_cs", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "relation": "calls", + "label": "fallback", + "semanticLabel": "fallback", + "semanticTitle": "fallback", + "collapsedLabel": "fallback", + "expandedLabel": "falls-back", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 66, + "sourceTargetKind": "call-site", + "outputSummary": "else", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs" + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_237_237_flow_method_nexusreader_infrastructure_realtime_synchub_cs_synchub_14_uses_service_247", + "diagramId": "method_flows_graph", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_237_237", + "to": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_synchub_14", + "relation": "uses", + "label": "SyncHub", + "semanticLabel": "SyncHub", + "semanticTitle": "SyncHub", + "collapsedLabel": "SyncHub", + "expandedLabel": "uses-service", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 247, + "sourceTargetKind": "call-site", + "outputSummary": "Hub mapping for realtime sync", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_handlers_authenticationheaderhandler_cs_file_1_flow_method_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_112_invokes_112", + "diagramId": "method_flows_graph", + "from": "flow_file_nexusreader_web_client_handlers_authenticationheaderhandler_cs_file_1", + "to": "flow_method_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_112", + "relation": "calls", + "label": "CloneHttpRequestMessageAsync", + "semanticLabel": "CloneHttpRequestMessageAsync", + "semanticTitle": "CloneHttpRequestMessageAsync", + "collapsedLabel": "CloneHttpRequestMessageAsync", + "expandedLabel": "invokes", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 112, + "sourceTargetKind": "call-site", + "outputSummary": "Creates a deep-ish clone of an HttpRequestMessage including method, URI, version, headers and buffered content to allow safe retry.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ] + }, + { + "id": "edge_flow_method_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_112_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_branch_119_119_evaluates_condition_119", + "diagramId": "method_flows_graph", + "from": "flow_method_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_112", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_branch_119_119", + "relation": "calls", + "label": "true / false", + "semanticLabel": "true / false", + "semanticTitle": "true / false", + "collapsedLabel": "true / false", + "expandedLabel": "evaluates-condition", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 119, + "sourceTargetKind": "call-site", + "outputSummary": "if (req.Content != null)", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1_flow_method_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_19_invokes_19", + "diagramId": "method_flows_graph", + "from": "flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_19", + "relation": "calls", + "label": "UpdateProgress", + "semanticLabel": "UpdateProgress", + "semanticTitle": "UpdateProgress", + "collapsedLabel": "UpdateProgress", + "expandedLabel": "handles-route", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 19, + "sourceTargetKind": "call-site", + "outputSummary": "Receives client progress updates, obtains the calling user id and forwards an UpdateReadingProgressCommand via MediatR when user is present.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs" + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_19_flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_repository_read_21_21_invokes_21", + "diagramId": "method_flows_graph", + "from": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_19", + "to": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_repository_read_21_21", + "relation": "calls", + "label": "Reads repository or persistence state", + "semanticLabel": "Reads repository or persistence state", + "semanticTitle": "Reads repository or persistence state", + "collapsedLabel": "Reads repository or persistence state", + "expandedLabel": "invokes", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 21, + "sourceTargetKind": "call-site", + "outputSummary": "var userId = Context.User?.FindFirst(ClaimTypes.NameIdentifier)?.Value;", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1_flow_method_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_28_invokes_28", + "diagramId": "method_flows_graph", + "from": "flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_28", + "relation": "calls", + "label": "OnConnectedAsync", + "semanticLabel": "OnConnectedAsync", + "semanticTitle": "OnConnectedAsync", + "collapsedLabel": "OnConnectedAsync", + "expandedLabel": "handles-route", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 28, + "sourceTargetKind": "call-site", + "outputSummary": "When a client connects, adds their connection to a per-user SignalR group (User_{userId}) and calls base connection logic.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs" + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_28_flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_repository_read_30_30_invokes_30", + "diagramId": "method_flows_graph", + "from": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_28", + "to": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_repository_read_30_30", + "relation": "calls", + "label": "Reads repository or persistence state", + "semanticLabel": "Reads repository or persistence state", + "semanticTitle": "Reads repository or persistence state", + "collapsedLabel": "Reads repository or persistence state", + "expandedLabel": "invokes", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 30, + "sourceTargetKind": "call-site", + "outputSummary": "var userId = Context.UserIdentifier;", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1_flow_method_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_38_invokes_38", + "diagramId": "method_flows_graph", + "from": "flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_38", + "relation": "calls", + "label": "OnDisconnectedAsync", + "semanticLabel": "OnDisconnectedAsync", + "semanticTitle": "OnDisconnectedAsync", + "collapsedLabel": "OnDisconnectedAsync", + "expandedLabel": "handles-route", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 38, + "sourceTargetKind": "call-site", + "outputSummary": "When a client disconnects, removes their connection from the per-user SignalR group and invokes base disconnect logic.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs" + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_38_flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_repository_read_40_40_invokes_40", + "diagramId": "method_flows_graph", + "from": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_38", + "to": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_repository_read_40_40", + "relation": "calls", + "label": "Reads repository or persistence state", + "semanticLabel": "Reads repository or persistence state", + "semanticTitle": "Reads repository or persistence state", + "collapsedLabel": "Reads repository or persistence state", + "expandedLabel": "invokes", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 40, + "sourceTargetKind": "call-site", + "outputSummary": "var userId = Context.UserIdentifier;", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs" + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1_flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_175_invokes_175", + "diagramId": "method_flows_graph", + "from": "flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_175", + "relation": "calls", + "label": "CountWords", + "semanticLabel": "CountWords", + "semanticTitle": "CountWords", + "collapsedLabel": "CountWords", + "expandedLabel": "invokes", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 175, + "sourceTargetKind": "call-site", + "outputSummary": "Count words in a string using whitespace separators; returns 0 for null/whitespace.", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs" + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_175_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_guard_clause_177_177_evaluates_condition_177", + "diagramId": "method_flows_graph", + "from": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_175", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_guard_clause_177_177", + "relation": "calls", + "label": "return 0 / continue", + "semanticLabel": "return 0 / continue", + "semanticTitle": "return 0 / continue", + "collapsedLabel": "return 0 / continue", + "expandedLabel": "evaluates-condition", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 177, + "sourceTargetKind": "call-site", + "outputSummary": "Empty text check", + "inputTypePaths": [], + "outputTypePaths": [], + "evidencePaths": [ + "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs" + ] + } + ], + "contextBagDebug": { + "id": "top_business_flows_md", + "bagType": "module", + "title": "Top Business Flows context bag", + "anchorFiles": [ + "NexusReader.Web.Client/Program.cs", + "NexusReader.Maui/MauiProgram.cs", + "NexusReader.Web/Program.cs" + ], + "includedFiles": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "reason": "Selected as an entrypoint anchor for this flow scope", + "source": "entrypoint" + }, + { + "path": "NexusReader.Web.Client/Program.cs", + "reason": "Selected as an entrypoint anchor for this flow scope", + "source": "entrypoint" + }, + { + "path": "NexusReader.Web/Program.cs", + "reason": "Selected as an entrypoint anchor for this flow scope", + "source": "entrypoint" + }, + { + "path": "NexusReader.Application/DTOs/User/AuthorDto.cs", + "reason": "Included because it likely stabilizes the contracts or business data in this scope", + "source": "type-reference" + }, + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "reason": "Included because it likely participates in the core orchestration path", + "source": "scope" + }, + { + "path": "NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "reason": "Included because it belongs to the resolved document scope", + "source": "scope" + }, + { + "path": "NexusReader.Domain/Entities/Author.cs", + "reason": "Included because it belongs to the resolved document scope", + "source": "scope" + }, + { + "path": "NexusReader.UI.Shared/Layout/AuthLayout.razor", + "reason": "Included because it belongs to the resolved document scope", + "source": "scope" + }, + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "reason": "Included because it likely participates in the core orchestration path", + "source": "scope" + }, + { + "path": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "reason": "Included because it belongs to the resolved document scope", + "source": "scope" + }, + { + "path": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "reason": "Included because it belongs to the resolved document scope", + "source": "scope" + }, + { + "path": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "reason": "Included because it belongs to the resolved document scope", + "source": "scope" + }, + { + "path": "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "reason": "Included because it likely stabilizes the contracts or business data in this scope", + "source": "type-reference" + }, + { + "path": "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "reason": "Included because it likely stabilizes the contracts or business data in this scope", + "source": "type-reference" + }, + { + "path": "NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "reason": "Included because it likely stabilizes the contracts or business data in this scope", + "source": "type-reference" + }, + { + "path": "NexusReader.Application/DependencyInjection.cs", + "reason": "Included because it is called by an anchor method (call-chain widening)", + "source": "call-chain" + }, + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "reason": "Included because it is called by an anchor method (call-chain widening)", + "source": "call-chain" + }, + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "reason": "Included because it is called by an anchor method (call-chain widening)", + "source": "call-chain" + }, + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "reason": "Included because it is called by an anchor method (call-chain widening)", + "source": "call-chain" + }, + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "reason": "Included because it is called by an anchor method (call-chain widening)", + "source": "call-chain" + }, + { + "path": "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "reason": "Included because it is called by an anchor method (call-chain widening)", + "source": "call-chain" + }, + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "reason": "Included because it is called by an anchor method (call-chain widening)", + "source": "call-chain" + }, + { + "path": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "reason": "Included because it is called by an anchor method (call-chain widening)", + "source": "call-chain" + }, + { + "path": "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs", + "reason": "Included because it is called by an anchor method (call-chain widening)", + "source": "call-chain" + } + ], + "relatedDomains": [ + "auth", + "account" + ], + "relatedEntrypoints": [ + "NexusReader.Web.Client/Program.cs", + "NexusReader.Maui/MauiProgram.cs", + "NexusReader.Web/Program.cs" + ], + "confidence": 0.75 + }, + "flowGraph": { + "contextBagId": "top_business_flows_md", + "nodes": [ + { + "id": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "label": "MauiProgram", + "role": "startup", + "layer": "frontend", + "kind": "entrypoint", + "filePath": "NexusReader.Maui/MauiProgram.cs", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 1 + } + ] + }, + { + "id": "flow_method_nexusreader_maui_mauiprogram_cs_createmauiapp_12", + "label": "CreateMauiApp", + "role": "startup", + "layer": "frontend", + "kind": "method", + "filePath": "NexusReader.Maui/MauiProgram.cs", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 12, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 12 + } + ] + }, + { + "id": "flow_action_nexusreader_maui_mauiprogram_cs_createmauiapp_return_57_57", + "label": "Returns result", + "role": "startup", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Maui/MauiProgram.cs", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 57, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 57 + } + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_mauiprogram_10", + "label": "MauiProgram", + "role": "unknown", + "layer": "frontend", + "kind": "type", + "filePath": "NexusReader.Maui/MauiProgram.cs", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 10, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 10 + } + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28", + "label": "MauiPlatformService", + "role": "service", + "layer": "frontend", + "kind": "type", + "filePath": "NexusReader.Maui/MauiProgram.cs", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 28, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 28 + } + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29", + "label": "MauiStorageService", + "role": "service", + "layer": "frontend", + "kind": "type", + "filePath": "NexusReader.Maui/MauiProgram.cs", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 29, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 29 + } + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32", + "label": "NexusAuthenticationStateProvider", + "role": "service", + "layer": "frontend", + "kind": "type", + "filePath": "NexusReader.Maui/MauiProgram.cs", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 32, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 32 + } + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33", + "label": "NexusAuthenticationStateProvider (via factory)", + "role": "service", + "layer": "frontend", + "kind": "type", + "filePath": "NexusReader.Maui/MauiProgram.cs", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 33, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 33 + } + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38", + "label": "HttpClient (configured)", + "role": "service", + "layer": "frontend", + "kind": "type", + "filePath": "NexusReader.Maui/MauiProgram.cs", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 38, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 38 + } + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1", + "label": "ThemeService, FocusModeService, QuizStateService, ReaderNavigationService, KnowledgeGraphService, ReaderInteractionService, KnowledgeCoordinator, SyncService, IdentityService", + "role": "service", + "layer": "frontend", + "kind": "type", + "filePath": "NexusReader.Maui/MauiProgram.cs", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 1 + } + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51", + "label": "NexusReader.Application registrations", + "role": "service", + "layer": "frontend", + "kind": "type", + "filePath": "NexusReader.Maui/MauiProgram.cs", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 51, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 51 + } + ] + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53", + "label": "Handlers from NexusReader.Application assembly", + "role": "service", + "layer": "frontend", + "kind": "type", + "filePath": "NexusReader.Maui/MauiProgram.cs", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 53, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 53 + } + ] + }, + { + "id": "flow_method_nexusreader_maui_mauiprogram_cs_create_and_build_mauiapp_16", + "label": "Create and build MauiApp", + "role": "startup", + "layer": "frontend", + "kind": "method", + "filePath": "NexusReader.Maui/MauiProgram.cs", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 16, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 16 + } + ] + }, + { + "id": "flow_file_nexusreader_web_client_program_cs_file_1", + "label": "Program.cs", + "role": "startup", + "layer": "frontend", + "kind": "entrypoint", + "filePath": "NexusReader.Web.Client/Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 1 + } + ] + }, + { + "id": "flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15", + "label": "Program (top-level startup)", + "role": "startup", + "layer": "frontend", + "kind": "method", + "filePath": "NexusReader.Web.Client/Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 15, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 15 + } + ] + }, + { + "id": "flow_method_nexusreader_web_client_program_cs_getservice_71", + "label": "GetService", + "role": "startup", + "layer": "frontend", + "kind": "method", + "filePath": "NexusReader.Web.Client/Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 71, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 71 + } + ] + }, + { + "id": "flow_action_nexusreader_web_client_program_cs_getservice_return_71_71", + "label": "returns null", + "role": "startup", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Web.Client/Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 71, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 71 + } + ] + }, + { + "id": "flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88", + "label": "FindAuthorByNameAsync", + "role": "startup", + "layer": "frontend", + "kind": "method", + "filePath": "NexusReader.Web.Client/Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 88, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 88 + } + ] + }, + { + "id": "flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Web.Client/Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 88, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 88 + } + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61", + "label": "ThrowingDbContextFactory", + "role": "unknown", + "layer": "frontend", + "kind": "type", + "filePath": "NexusReader.Web.Client/Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 61, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 61 + } + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66", + "label": "ThrowingEmbeddingGenerator", + "role": "unknown", + "layer": "frontend", + "kind": "type", + "filePath": "NexusReader.Web.Client/Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 66, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 66 + } + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74", + "label": "ThrowingBookStorageService", + "role": "unknown", + "layer": "frontend", + "kind": "type", + "filePath": "NexusReader.Web.Client/Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 74, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 74 + } + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84", + "label": "ThrowingEbookRepository", + "role": "unknown", + "layer": "frontend", + "kind": "type", + "filePath": "NexusReader.Web.Client/Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 84, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 84 + } + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94", + "label": "ThrowingSyncBroadcaster", + "role": "unknown", + "layer": "frontend", + "kind": "type", + "filePath": "NexusReader.Web.Client/Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 94, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 94 + } + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_webplatformservice_18", + "label": "WebPlatformService", + "role": "service", + "layer": "frontend", + "kind": "type", + "filePath": "NexusReader.Web.Client/Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 18, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 18 + } + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33", + "label": "NexusAuthenticationStateProvider", + "role": "service", + "layer": "frontend", + "kind": "type", + "filePath": "NexusReader.Web.Client/Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 33, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 33 + } + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38", + "label": "WasmKnowledgeService", + "role": "service", + "layer": "frontend", + "kind": "type", + "filePath": "NexusReader.Web.Client/Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 38, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 38 + } + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_configured_httpclient_40", + "label": "configured HttpClient", + "role": "service", + "layer": "frontend", + "kind": "type", + "filePath": "NexusReader.Web.Client/Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 40, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 40 + } + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49", + "label": "ThrowingDbContextFactory", + "role": "service", + "layer": "frontend", + "kind": "type", + "filePath": "NexusReader.Web.Client/Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 49, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 49 + } + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_n_a_55", + "label": "N/A", + "role": "service", + "layer": "frontend", + "kind": "type", + "filePath": "NexusReader.Web.Client/Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 55, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 55 + } + ] + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_wasmepubreader_56", + "label": "WasmEpubReader", + "role": "service", + "layer": "frontend", + "kind": "type", + "filePath": "NexusReader.Web.Client/Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 56, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 56 + } + ] + }, + { + "id": "flow_method_nexusreader_web_client_program_cs_run_wasm_host_59", + "label": "Run WASM Host", + "role": "startup", + "layer": "frontend", + "kind": "method", + "filePath": "NexusReader.Web.Client/Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 59, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 59 + } + ] + }, + { + "id": "flow_file_nexusreader_web_program_cs_file_1", + "label": "Program.cs", + "role": "startup", + "layer": "application", + "kind": "entrypoint", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 1 + } + ] + }, + { + "id": "flow_method_nexusreader_web_program_cs_program_top_level_29", + "label": "Program (top-level)", + "role": "startup", + "layer": "application", + "kind": "method", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 29, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 29 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "label": "Evaluates branch condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 62, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 62 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "label": "Falls back to alternate path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 66, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 66 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 125, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 125 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_126_126", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 126, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 126 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_127_127", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 127, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 127 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_129_129", + "label": "Evaluates branch condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 129, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 129 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_131_131", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 131, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 131 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_133_133", + "label": "Falls back to alternate path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 133, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 133 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_135_135", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 135, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 135 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_137_137", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 137, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 137 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_169_169", + "label": "Evaluates branch condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 169, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 169 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_validation_171_171", + "label": "Validates input or state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 171, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 171 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_loop_186_186", + "label": "Repeats work over a collection or condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 186, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 186 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_190_190", + "label": "Evaluates branch condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 190, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 190 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_198_198", + "label": "Evaluates branch condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 198, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 198 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_206_206", + "label": "Evaluates branch condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 206, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 206 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_log_206_206", + "label": "Logs runtime state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 206, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 206 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_log_208_208", + "label": "Logs runtime state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 208, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 208 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_216_216", + "label": "Evaluates branch condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 216, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 216 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_log_216_216", + "label": "Logs runtime state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 216, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 216 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_log_218_218", + "label": "Logs runtime state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 218, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 218 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_226_226", + "label": "Evaluates branch condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 226, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 226 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_230_230", + "label": "Falls back to alternate path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 230, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 230 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_237_237", + "label": "Evaluates branch condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 237, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 237 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_252_252", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 252, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 252 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_255_255", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 255, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 255 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_258_258", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 258, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 258 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_267_267", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 267, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 267 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_269_269", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 269, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 269 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_270_270", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 270, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 270 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_275_275", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 275, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 275 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_277_277", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 277, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 277 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_278_278", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 278, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 278 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_283_283", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 283, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 283 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_285_285", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 285, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 285 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_286_286", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 286, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 286 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_291_291", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 291, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 291 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_293_293", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 293, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 293 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_294_294", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 294, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 294 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_299_299", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 299, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 299 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_301_301", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 301, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 301 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_302_302", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 302, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 302 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_307_307", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 307, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 307 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_309_309", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 309, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 309 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_310_310", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 310, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 310 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_315_315", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 315, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 315 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_317_317", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 317, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 317 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_318_318", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 318, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 318 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_324_324", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 324, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 324 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_327_327", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 327, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 327 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_332_332", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 332, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 332 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_333_333", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 333, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 333 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_350_350", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 350, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 350 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_352_352", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 352, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 352 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_352_352", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 352, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 352 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_357_357", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 357, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 357 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_358_358", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 358, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 358 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_361_361", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 361, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 361 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_364_364", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 364, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 364 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_374_374", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 374, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 374 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_381_381", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 381, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 381 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_switch_385_385", + "label": "Branches across multiple outcomes", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 385, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 385 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_402_402", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 402, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 402 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_406_406", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 406, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 406 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_416_416", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 416, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 416 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_418_418", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 418, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 418 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_419_419", + "label": "Evaluates branch condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 419, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 419 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_424_424", + "label": "Evaluates branch condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 424, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 424 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_439_439", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 439, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 439 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_441_441", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 441, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 441 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_442_442", + "label": "Evaluates branch condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 442, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 442 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_444_444", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 444, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 444 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_460_460", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 460, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 460 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_470_470", + "label": "Evaluates branch condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 470, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 470 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_log_472_472", + "label": "Logs runtime state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 472, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 472 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_473_473", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 473, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 473 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_477_477", + "label": "Evaluates branch condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 477, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 477 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_479_479", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 479, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 479 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_480_480", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 480, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 480 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_483_483", + "label": "Evaluates branch condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 483, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 483 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_log_485_485", + "label": "Logs runtime state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 485, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 485 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_485_485", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 485, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 485 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_486_486", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 486, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 486 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_490_490", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 490, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 490 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_491_491", + "label": "Evaluates branch condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 491, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 491 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_496_496", + "label": "Evaluates branch condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 496, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 496 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_501_501", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 501, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 501 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_loop_505_505", + "label": "Repeats work over a collection or condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 505, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 505 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_log_507_507", + "label": "Logs runtime state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 507, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 507 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_510_510", + "label": "Evaluates branch condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 510, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 510 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_512_512", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 512, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 512 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_log_516_516", + "label": "Logs runtime state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 516, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 516 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_517_517", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 517, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 517 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_529_529", + "label": "Evaluates branch condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 529, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 529 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_532_532", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 532, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 532 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_536_536", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 536, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 536 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_545_545", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 545, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 545 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_550_550", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 550, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 550 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_551_551", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 551, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 551 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_554_554", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 554, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 554 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_554_554", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 554, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 554 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_return_556_556", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 556, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 556 + } + ] + }, + { + "id": "flow_file_nexusreader_application_dependencyinjection_cs_file_1", + "label": "DependencyInjection", + "role": "service-registration", + "layer": "application", + "kind": "file", + "filePath": "NexusReader.Application/DependencyInjection.cs", + "sourcePath": "NexusReader.Application/DependencyInjection.cs", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.Application/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/DependencyInjection.cs", + "line": 1 + } + ] + }, + { + "id": "flow_method_nexusreader_application_dependencyinjection_cs_addapplication_8", + "label": "AddApplication", + "role": "service-registration", + "layer": "application", + "kind": "method", + "filePath": "NexusReader.Application/DependencyInjection.cs", + "sourcePath": "NexusReader.Application/DependencyInjection.cs", + "sourceLine": 8, + "evidencePaths": [ + "NexusReader.Application/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/DependencyInjection.cs", + "line": 8 + } + ] + }, + { + "id": "flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1", + "label": "DependencyInjection", + "role": "service-registration", + "layer": "infrastructure", + "kind": "file", + "filePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourcePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 1 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_31", + "label": "AddInfrastructure", + "role": "service-registration", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourcePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 31, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 31 + } + ] + }, + { + "id": "flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1", + "label": "SyncHub", + "role": "endpoint", + "layer": "infrastructure", + "kind": "file", + "filePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 1 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_synchub_14", + "label": "SyncHub", + "role": "endpoint", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 14, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 14 + } + ] + }, + { + "id": "flow_method_nexusreader_web_program_cs_startupvalidation_scope_check_165", + "label": "StartupValidation (scope check)", + "role": "startup", + "layer": "application", + "kind": "method", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 165, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 165 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_startupvalidation_scope_check_branch_169_169", + "label": "Evaluates branch condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 169, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 169 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_startupvalidation_scope_check_guard_clause_169_169", + "label": "Fail if infrastructure missing", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 169, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 169 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_startupvalidation_scope_check_validation_171_171", + "label": "Validates input or state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 171, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 171 + } + ] + }, + { + "id": "flow_method_nexusreader_web_program_cs_ensuredatabaseinitialized_175", + "label": "EnsureDatabaseInitialized", + "role": "startup", + "layer": "application", + "kind": "method", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 175, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 175 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_loop_186_186", + "label": "Repeats work over a collection or condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 186, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 186 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_branch_190_190", + "label": "Evaluates branch condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 190, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 190 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_branch_198_198", + "label": "Evaluates branch condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 198, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 198 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_branch_206_206", + "label": "Evaluates branch condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 206, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 206 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_log_206_206", + "label": "Logs runtime state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 206, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 206 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_log_208_208", + "label": "Logs runtime state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 208, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 208 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_branch_216_216", + "label": "Evaluates branch condition", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 216, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 216 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_log_216_216", + "label": "Logs runtime state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 216, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 216 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_log_218_218", + "label": "Logs runtime state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 218, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 218 + } + ] + }, + { + "id": "flow_method_nexusreader_web_program_cs_get_api_epub_ebookid_index_249", + "label": "GET /api/epub/{ebookId}/{index}", + "role": "startup", + "layer": "application", + "kind": "method", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 249, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 249 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_get_api_epub_ebookid_index_guard_clause_252_252", + "label": "Extracts userId from ClaimsPrincipal", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 252, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 252 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_get_api_epub_ebookid_index_repository_read_252_252", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 252, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 252 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_get_api_epub_ebookid_index_guard_clause_255_255", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 255, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 255 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_get_api_epub_ebookid_index_branch_255_255", + "label": "Return Ok on success, BadRequest on failure", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 255, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 255 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_get_api_epub_ebookid_index_return_258_258", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 258, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 258 + } + ] + }, + { + "id": "flow_method_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_265", + "label": "KnowledgeApi POST /api/knowledge/ (GetKnowledge)", + "role": "startup", + "layer": "application", + "kind": "method", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 265, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 265 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_repository_read_267_267", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 267, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 267 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_guard_clause_267_267", + "label": "Resolve tenantId from claims with default", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 267, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 267 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_guard_clause_269_269", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 269, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 269 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_branch_269_269", + "label": "Return Ok or BadRequest based on result.IsSuccess", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 269, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 269 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_return_270_270", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 270, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 270 + } + ] + }, + { + "id": "flow_method_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_273", + "label": "KnowledgeApi POST /graph (GetGraphDataAsync)", + "role": "startup", + "layer": "application", + "kind": "method", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 273, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 273 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_repository_read_275_275", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 275, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 275 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_guard_clause_277_277", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 277, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 277 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_branch_277_277", + "label": "Return Ok or BadRequest based on result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 277, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 277 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_return_278_278", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 278, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 278 + } + ] + }, + { + "id": "flow_method_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_281", + "label": "KnowledgeApi POST /summary (GetSummaryAndQuizAsync)", + "role": "startup", + "layer": "application", + "kind": "method", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 281, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 281 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_repository_read_283_283", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 283, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 283 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_guard_clause_285_285", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 285, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 285 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_branch_285_285", + "label": "Return Ok or BadRequest based on result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 285, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 285 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_return_286_286", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 286, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 286 + } + ] + }, + { + "id": "flow_method_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_289", + "label": "KnowledgeApi POST /map (GetKnowledgeMapAsync)", + "role": "startup", + "layer": "application", + "kind": "method", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 289, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 289 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_repository_read_291_291", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 291, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 291 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_guard_clause_293_293", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 293, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 293 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_branch_293_293", + "label": "Return Ok or BadRequest based on result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 293, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 293 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_return_294_294", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 294, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 294 + } + ] + }, + { + "id": "flow_method_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_297", + "label": "KnowledgeApi POST /verify-groundedness", + "role": "startup", + "layer": "application", + "kind": "method", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 297, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 297 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_repository_read_299_299", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 299, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 299 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_guard_clause_301_301", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 301, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 301 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_branch_301_301", + "label": "Return Ok or BadRequest based on verification result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 301, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 301 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_return_302_302", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 302, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 302 + } + ] + }, + { + "id": "flow_method_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_305", + "label": "KnowledgeApi POST /search (SearchLibrarySemanticallyAsync)", + "role": "startup", + "layer": "application", + "kind": "method", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 305, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 305 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_repository_read_307_307", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 307, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 307 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_guard_clause_309_309", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 309, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 309 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_branch_309_309", + "label": "Return Ok or BadRequest based on result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 309, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 309 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_return_310_310", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 310, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 310 + } + ] + }, + { + "id": "flow_method_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_313", + "label": "KnowledgeApi POST /ask (AskQuestionAsync)", + "role": "startup", + "layer": "application", + "kind": "method", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 313, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 313 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_repository_read_315_315", + "label": "Reads repository or persistence state", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 315, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 315 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_guard_clause_317_317", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 317, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 317 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_branch_317_317", + "label": "Return Ok or BadRequest based on result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 317, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 317 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_return_318_318", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 318, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 318 + } + ] + }, + { + "id": "flow_method_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_321", + "label": "KnowledgeApi DELETE /api/knowledge/ (ClearCacheAsync)", + "role": "startup", + "layer": "application", + "kind": "method", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 321, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 321 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_branch_323_323", + "label": "Return Ok on success; BadRequest with message on failure", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 323, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 323 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_guard_clause_324_324", + "label": "Guards early exit or rejection path", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 324, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 324 + } + ] + }, + { + "id": "flow_action_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_return_327_327", + "label": "Returns result", + "role": "startup", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 327, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 327 + } + ] + }, + { + "id": "flow_type_nexusreader_web_program_cs_knowledgerequest_566", + "label": "KnowledgeRequest", + "role": "dto", + "layer": "application", + "kind": "type", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 566, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 566 + } + ] + }, + { + "id": "flow_type_nexusreader_web_program_cs_groundednessrequest_567", + "label": "GroundednessRequest", + "role": "dto", + "layer": "application", + "kind": "type", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 567, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 567 + } + ] + }, + { + "id": "flow_type_nexusreader_web_program_cs_semanticsearchrequest_568", + "label": "SemanticSearchRequest", + "role": "dto", + "layer": "application", + "kind": "type", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 568, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 568 + } + ] + }, + { + "id": "flow_type_nexusreader_web_program_cs_askquestionrequest_569", + "label": "AskQuestionRequest", + "role": "dto", + "layer": "application", + "kind": "type", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 569, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 569 + } + ] + }, + { + "id": "flow_type_nexusreader_web_program_cs_webplatformservice_47", + "label": "WebPlatformService", + "role": "service", + "layer": "application", + "kind": "type", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 47, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 47 + } + ] + }, + { + "id": "flow_type_nexusreader_web_program_cs_knowledgecoordinator_55", + "label": "KnowledgeCoordinator", + "role": "service", + "layer": "application", + "kind": "type", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 55, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 55 + } + ] + }, + { + "id": "flow_type_nexusreader_web_program_cs_httpclient_configured_with_base_address_58", + "label": "HttpClient configured with base address", + "role": "service", + "layer": "application", + "kind": "type", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 58, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 58 + } + ] + }, + { + "id": "flow_type_nexusreader_web_program_cs_nexusreader_application_assembly_extension_78", + "label": "NexusReader.Application (assembly extension)", + "role": "service", + "layer": "application", + "kind": "type", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 78, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 78 + } + ] + }, + { + "id": "flow_type_nexusreader_web_program_cs_nexusreader_infrastructure_assembly_extension_79", + "label": "NexusReader.Infrastructure (assembly extension)", + "role": "service", + "layer": "application", + "kind": "type", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 79, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 79 + } + ] + }, + { + "id": "flow_type_nexusreader_web_program_cs_identity_with_appdbcontext_107", + "label": "Identity with AppDbContext", + "role": "service", + "layer": "application", + "kind": "type", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 107, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 107 + } + ] + }, + { + "id": "flow_method_nexusreader_web_program_cs_usehangfiredashboard_163", + "label": "UseHangfireDashboard", + "role": "startup", + "layer": "application", + "kind": "method", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 163, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 163 + } + ] + }, + { + "id": "flow_method_nexusreader_web_program_cs_configure_request_pipeline_routing_auth_antiforgery_static_assets_hubs_225", + "label": "Configure request pipeline (routing, auth, antiforgery, static assets, hubs)", + "role": "startup", + "layer": "application", + "kind": "method", + "filePath": "NexusReader.Web/Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 225, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 225 + } + ] + }, + { + "id": "flow_file_nexusreader_application_dtos_user_authordto_cs_file_1", + "label": "AuthorDto", + "role": "dto", + "layer": "application", + "kind": "file", + "filePath": "NexusReader.Application/DTOs/User/AuthorDto.cs", + "sourcePath": "NexusReader.Application/DTOs/User/AuthorDto.cs", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.Application/DTOs/User/AuthorDto.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/DTOs/User/AuthorDto.cs", + "line": 1 + } + ] + }, + { + "id": "flow_type_nexusreader_application_dtos_user_authordto_cs_authordto_3", + "label": "AuthorDto", + "role": "dto", + "layer": "application", + "kind": "type", + "filePath": "NexusReader.Application/DTOs/User/AuthorDto.cs", + "sourcePath": "NexusReader.Application/DTOs/User/AuthorDto.cs", + "sourceLine": 3, + "evidencePaths": [ + "NexusReader.Application/DTOs/User/AuthorDto.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/DTOs/User/AuthorDto.cs", + "line": 3 + } + ] + }, + { + "id": "flow_file_nexusreader_application_security_authorization_prouserhandler_cs_file_1", + "label": "ProUserHandler", + "role": "handler", + "layer": "application", + "kind": "file", + "filePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourcePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 1 + } + ] + }, + { + "id": "flow_method_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_20", + "label": "HandleRequirementAsync", + "role": "handler", + "layer": "application", + "kind": "method", + "filePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourcePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 20, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 20 + } + ] + }, + { + "id": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_guard_clause_24_24", + "label": "Missing user id", + "role": "handler", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourcePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 24, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 24 + } + ] + }, + { + "id": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_repository_read_24_24", + "label": "Reads repository or persistence state", + "role": "handler", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourcePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 24, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 24 + } + ] + }, + { + "id": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_25_25", + "label": "Evaluates branch condition", + "role": "handler", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourcePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 25, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 25 + } + ] + }, + { + "id": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_return_27_27", + "label": "Returns result", + "role": "handler", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourcePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 27, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 27 + } + ] + }, + { + "id": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_35_35", + "label": "Evaluates branch condition", + "role": "handler", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourcePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 35, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 35 + } + ] + }, + { + "id": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_guard_clause_35_35", + "label": "User not found", + "role": "handler", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourcePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 35, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 35 + } + ] + }, + { + "id": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_return_37_37", + "label": "Returns result", + "role": "handler", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourcePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 37, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 37 + } + ] + }, + { + "id": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_40_40", + "label": "Unlimited subscription rule", + "role": "handler", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourcePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 40, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 40 + } + ] + }, + { + "id": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_41_41", + "label": "Evaluates branch condition", + "role": "handler", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourcePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 41, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 41 + } + ] + }, + { + "id": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_repository_read_43_43", + "label": "Reads repository or persistence state", + "role": "handler", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourcePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 43, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 43 + } + ] + }, + { + "id": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_return_44_44", + "label": "Returns result", + "role": "handler", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourcePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 44, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 44 + } + ] + }, + { + "id": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_47_47", + "label": "Token limit rule (SaaS)", + "role": "handler", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourcePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 47, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 47 + } + ] + }, + { + "id": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_48_48", + "label": "Evaluates branch condition", + "role": "handler", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourcePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 48, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 48 + } + ] + }, + { + "id": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_repository_read_50_50", + "label": "Reads repository or persistence state", + "role": "handler", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourcePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 50, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 50 + } + ] + }, + { + "id": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_return_51_51", + "label": "Returns result", + "role": "handler", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourcePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 51, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 51 + } + ] + }, + { + "id": "flow_type_nexusreader_application_security_authorization_prouserhandler_cs_prouserhandler_11", + "label": "ProUserHandler", + "role": "unknown", + "layer": "application", + "kind": "type", + "filePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourcePath": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 11, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 11 + } + ] + }, + { + "id": "flow_file_nexusreader_application_security_authorization_prouserrequirement_cs_file_1", + "label": "ProUserRequirement", + "role": "unknown", + "layer": "application", + "kind": "file", + "filePath": "NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "sourcePath": "NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserRequirement.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "line": 1 + } + ] + }, + { + "id": "flow_type_nexusreader_application_security_authorization_prouserrequirement_cs_prouserrequirement_8", + "label": "ProUserRequirement", + "role": "unknown", + "layer": "application", + "kind": "type", + "filePath": "NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "sourcePath": "NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "sourceLine": 8, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserRequirement.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "line": 8 + } + ] + }, + { + "id": "flow_file_nexusreader_domain_entities_author_cs_file_1", + "label": "Author", + "role": "entity", + "layer": "domain", + "kind": "file", + "filePath": "NexusReader.Domain/Entities/Author.cs", + "sourcePath": "NexusReader.Domain/Entities/Author.cs", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.Domain/Entities/Author.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Domain/Entities/Author.cs", + "line": 1 + } + ] + }, + { + "id": "flow_type_nexusreader_domain_entities_author_cs_author_5", + "label": "Author", + "role": "entity", + "layer": "domain", + "kind": "type", + "filePath": "NexusReader.Domain/Entities/Author.cs", + "sourcePath": "NexusReader.Domain/Entities/Author.cs", + "sourceLine": 5, + "evidencePaths": [ + "NexusReader.Domain/Entities/Author.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Domain/Entities/Author.cs", + "line": 5 + } + ] + }, + { + "id": "flow_file_nexusreader_ui_shared_layout_authlayout_razor_file_1", + "label": "AuthLayout.razor", + "role": "ui-component", + "layer": "frontend", + "kind": "file", + "filePath": "NexusReader.UI.Shared/Layout/AuthLayout.razor", + "sourcePath": "NexusReader.UI.Shared/Layout/AuthLayout.razor", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.UI.Shared/Layout/AuthLayout.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Layout/AuthLayout.razor", + "line": 1 + } + ] + }, + { + "id": "flow_method_nexusreader_ui_shared_layout_authlayout_razor_authlayout_render_markup_1", + "label": "AuthLayout (render/markup)", + "role": "ui-component", + "layer": "frontend", + "kind": "method", + "filePath": "NexusReader.UI.Shared/Layout/AuthLayout.razor", + "sourcePath": "NexusReader.UI.Shared/Layout/AuthLayout.razor", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.UI.Shared/Layout/AuthLayout.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Layout/AuthLayout.razor", + "line": 1 + } + ] + }, + { + "id": "flow_file_nexusreader_web_client_handlers_authenticationheaderhandler_cs_file_1", + "label": "AuthenticationHeaderHandler", + "role": "handler", + "layer": "frontend", + "kind": "file", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 1 + } + ] + }, + { + "id": "flow_method_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_27", + "label": "SendAsync", + "role": "handler", + "layer": "frontend", + "kind": "method", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 27, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 27 + } + ] + }, + { + "id": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_external_call_27_27", + "label": "Calls external dependency", + "role": "handler", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 27, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 27 + } + ] + }, + { + "id": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_32_32", + "label": "Detect auth endpoints", + "role": "handler", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 32, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 32 + } + ] + }, + { + "id": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_39_39", + "label": "Trusted host check", + "role": "handler", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 39, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 39 + } + ] + }, + { + "id": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_guard_clause_45_45", + "label": "Attach token to request", + "role": "handler", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 45, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 45 + } + ] + }, + { + "id": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_45_45", + "label": "Evaluates branch condition", + "role": "handler", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 45, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 45 + } + ] + }, + { + "id": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_48_48", + "label": "Evaluates branch condition", + "role": "handler", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 48, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 48 + } + ] + }, + { + "id": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_external_call_55_55", + "label": "Calls external dependency", + "role": "handler", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 55, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 55 + } + ] + }, + { + "id": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_58_58", + "label": "Evaluates branch condition", + "role": "handler", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 58, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 58 + } + ] + }, + { + "id": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_guard_clause_69_69", + "label": "Concurrent-refresh detection", + "role": "handler", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 69, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 69 + } + ] + }, + { + "id": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_69_69", + "label": "Evaluates branch condition", + "role": "handler", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 69, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 69 + } + ] + }, + { + "id": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_fallback_73_73", + "label": "Falls back to alternate path", + "role": "handler", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 73, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 73 + } + ] + }, + { + "id": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_79_79", + "label": "Evaluates branch condition", + "role": "handler", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 79, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 79 + } + ] + }, + { + "id": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_fallback_85_85", + "label": "Falls back to alternate path", + "role": "handler", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 85, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 85 + } + ] + }, + { + "id": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_91_91", + "label": "Evaluates branch condition", + "role": "handler", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 91, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 91 + } + ] + }, + { + "id": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_retry_91_91", + "label": "Retry original request with new token", + "role": "handler", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 91, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 91 + } + ] + }, + { + "id": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_external_call_95_95", + "label": "Calls external dependency", + "role": "handler", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 95, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 95 + } + ] + }, + { + "id": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_return_95_95", + "label": "Returns result", + "role": "handler", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 95, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 95 + } + ] + }, + { + "id": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_return_109_109", + "label": "Return response", + "role": "handler", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 109, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 109 + } + ] + }, + { + "id": "flow_method_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_112", + "label": "CloneHttpRequestMessageAsync", + "role": "handler", + "layer": "frontend", + "kind": "method", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 112, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 112 + } + ] + }, + { + "id": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_branch_119_119", + "label": "Evaluates branch condition", + "role": "handler", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 119, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 119 + } + ] + }, + { + "id": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_loop_126_126", + "label": "Repeats work over a collection or condition", + "role": "handler", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 126, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 126 + } + ] + }, + { + "id": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_loop_132_132", + "label": "Repeats work over a collection or condition", + "role": "handler", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 132, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 132 + } + ] + }, + { + "id": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_return_139_139", + "label": "Return cloned request", + "role": "handler", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 139, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 139 + } + ] + }, + { + "id": "flow_type_nexusreader_web_client_handlers_authenticationheaderhandler_cs_authenticationheaderhandler_14", + "label": "AuthenticationHeaderHandler", + "role": "unknown", + "layer": "frontend", + "kind": "type", + "filePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 14, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 14 + } + ] + }, + { + "id": "flow_file_nexusreader_ui_shared_pages_account_login_razor_file_1", + "label": "Login.razor", + "role": "ui-page", + "layer": "frontend", + "kind": "file", + "filePath": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Login.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "line": 1 + } + ] + }, + { + "id": "flow_method_nexusreader_ui_shared_pages_account_login_razor_oninitialized_110", + "label": "OnInitialized", + "role": "ui-page", + "layer": "frontend", + "kind": "method", + "filePath": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourceLine": 110, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Login.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "line": 110 + } + ] + }, + { + "id": "flow_action_nexusreader_ui_shared_pages_account_login_razor_oninitialized_branch_112_112", + "label": "Evaluates branch condition", + "role": "ui-page", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourceLine": 112, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Login.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "line": 112 + } + ] + }, + { + "id": "flow_action_nexusreader_ui_shared_pages_account_login_razor_oninitialized_guard_clause_112_112", + "label": "Only map ErrorCode when present", + "role": "ui-page", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourceLine": 112, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Login.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "line": 112 + } + ] + }, + { + "id": "flow_action_nexusreader_ui_shared_pages_account_login_razor_oninitialized_branch_114_114", + "label": "Map specific error codes to localized messages", + "role": "ui-page", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourceLine": 114, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Login.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "line": 114 + } + ] + }, + { + "id": "flow_method_nexusreader_ui_shared_pages_account_login_razor_handlelogin_126", + "label": "HandleLogin", + "role": "ui-page", + "layer": "frontend", + "kind": "method", + "filePath": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourceLine": 126, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Login.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "line": 126 + } + ] + }, + { + "id": "flow_action_nexusreader_ui_shared_pages_account_login_razor_handlelogin_branch_134_134", + "label": "Evaluates branch condition", + "role": "ui-page", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourceLine": 134, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Login.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "line": 134 + } + ] + }, + { + "id": "flow_action_nexusreader_ui_shared_pages_account_login_razor_handlelogin_fallback_139_139", + "label": "Falls back to alternate path", + "role": "ui-page", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourceLine": 139, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Login.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "line": 139 + } + ] + }, + { + "id": "flow_action_nexusreader_ui_shared_pages_account_login_razor_handlelogin_repository_read_141_141", + "label": "Reads repository or persistence state", + "role": "ui-page", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourceLine": 141, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Login.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "line": 141 + } + ] + }, + { + "id": "flow_method_nexusreader_ui_shared_pages_account_login_razor_handlegooglelogin_154", + "label": "HandleGoogleLogin", + "role": "ui-page", + "layer": "frontend", + "kind": "method", + "filePath": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourceLine": 154, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Login.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "line": 154 + } + ] + }, + { + "id": "flow_type_nexusreader_ui_shared_pages_account_login_razor_loginmodel_157", + "label": "LoginModel", + "role": "dto", + "layer": "frontend", + "kind": "type", + "filePath": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourceLine": 157, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Login.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "line": 157 + } + ] + }, + { + "id": "flow_file_nexusreader_ui_shared_pages_account_profile_razor_file_1", + "label": "Profile (Razor component)", + "role": "ui-page", + "layer": "frontend", + "kind": "file", + "filePath": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Profile.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "line": 1 + } + ] + }, + { + "id": "flow_method_nexusreader_ui_shared_pages_account_profile_razor_oninitializedasync_111", + "label": "OnInitializedAsync", + "role": "ui-page", + "layer": "frontend", + "kind": "method", + "filePath": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "sourceLine": 111, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Profile.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "line": 111 + } + ] + }, + { + "id": "flow_action_nexusreader_ui_shared_pages_account_profile_razor_oninitializedasync_branch_114_114", + "label": "Apply result on success", + "role": "ui-page", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "sourceLine": 114, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Profile.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "line": 114 + } + ] + }, + { + "id": "flow_method_nexusreader_ui_shared_pages_account_profile_razor_calculateprogress_121", + "label": "CalculateProgress", + "role": "ui-page", + "layer": "frontend", + "kind": "method", + "filePath": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "sourceLine": 121, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Profile.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "line": 121 + } + ] + }, + { + "id": "flow_action_nexusreader_ui_shared_pages_account_profile_razor_calculateprogress_guard_clause_123_123", + "label": "Guards early exit or rejection path", + "role": "ui-page", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "sourceLine": 123, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Profile.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "line": 123 + } + ] + }, + { + "id": "flow_action_nexusreader_ui_shared_pages_account_profile_razor_calculateprogress_return_125_125", + "label": "Returns result", + "role": "ui-page", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "sourceLine": 125, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Profile.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "line": 125 + } + ] + }, + { + "id": "flow_method_nexusreader_ui_shared_pages_account_profile_razor_handlelogout_133", + "label": "HandleLogout", + "role": "ui-page", + "layer": "frontend", + "kind": "method", + "filePath": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "sourceLine": 133, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Profile.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "line": 133 + } + ] + }, + { + "id": "flow_file_nexusreader_ui_shared_pages_account_register_razor_file_1", + "label": "Register.razor", + "role": "ui-page", + "layer": "frontend", + "kind": "file", + "filePath": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Register.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "line": 1 + } + ] + }, + { + "id": "flow_method_nexusreader_ui_shared_pages_account_register_razor_handleregister_84", + "label": "HandleRegister", + "role": "ui-page", + "layer": "frontend", + "kind": "method", + "filePath": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "sourceLine": 84, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Register.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "line": 84 + } + ] + }, + { + "id": "flow_action_nexusreader_ui_shared_pages_account_register_razor_handleregister_branch_92_92", + "label": "Evaluates branch condition", + "role": "ui-page", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "sourceLine": 92, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Register.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "line": 92 + } + ] + }, + { + "id": "flow_action_nexusreader_ui_shared_pages_account_register_razor_handleregister_branch_95_95", + "label": "Evaluates branch condition", + "role": "ui-page", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "sourceLine": 95, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Register.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "line": 95 + } + ] + }, + { + "id": "flow_action_nexusreader_ui_shared_pages_account_register_razor_handleregister_fallback_100_100", + "label": "Falls back to alternate path", + "role": "ui-page", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "sourceLine": 100, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Register.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "line": 100 + } + ] + }, + { + "id": "flow_action_nexusreader_ui_shared_pages_account_register_razor_handleregister_fallback_105_105", + "label": "Falls back to alternate path", + "role": "ui-page", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "sourceLine": 105, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Register.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "line": 105 + } + ] + }, + { + "id": "flow_action_nexusreader_ui_shared_pages_account_register_razor_handleregister_repository_read_107_107", + "label": "Reads repository or persistence state", + "role": "ui-page", + "layer": "frontend", + "kind": "action", + "filePath": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "sourceLine": 107, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Register.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "line": 107 + } + ] + }, + { + "id": "flow_type_nexusreader_ui_shared_pages_account_register_razor_registermodel_120", + "label": "RegisterModel", + "role": "dto", + "layer": "frontend", + "kind": "type", + "filePath": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "sourcePath": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "sourceLine": 120, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Register.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "line": 120 + } + ] + }, + { + "id": "flow_file_nexusreader_application_abstractions_messaging_icommand_cs_file_1", + "label": "ICommand.cs", + "role": "handler", + "layer": "application", + "kind": "file", + "filePath": "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "sourcePath": "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.Application/Abstractions/Messaging/ICommand.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "line": 1 + } + ] + }, + { + "id": "flow_type_nexusreader_application_abstractions_messaging_icommand_cs_icommand_6", + "label": "ICommand", + "role": "unknown", + "layer": "application", + "kind": "type", + "filePath": "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "sourcePath": "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "sourceLine": 6, + "evidencePaths": [ + "NexusReader.Application/Abstractions/Messaging/ICommand.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "line": 6 + } + ] + }, + { + "id": "flow_type_nexusreader_application_abstractions_messaging_icommand_cs_icommand_tresponse_10", + "label": "ICommand", + "role": "unknown", + "layer": "application", + "kind": "type", + "filePath": "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "sourcePath": "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "sourceLine": 10, + "evidencePaths": [ + "NexusReader.Application/Abstractions/Messaging/ICommand.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "line": 10 + } + ] + }, + { + "id": "flow_file_nexusreader_application_abstractions_messaging_icommandhandler_cs_file_1", + "label": "ICommandHandler", + "role": "handler", + "layer": "application", + "kind": "file", + "filePath": "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "sourcePath": "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "line": 1 + } + ] + }, + { + "id": "flow_type_nexusreader_application_abstractions_messaging_icommandhandler_cs_icommandhandler_tcommand_6", + "label": "ICommandHandler", + "role": "unknown", + "layer": "application", + "kind": "type", + "filePath": "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "sourcePath": "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "sourceLine": 6, + "evidencePaths": [ + "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "line": 6 + } + ] + }, + { + "id": "flow_type_nexusreader_application_abstractions_messaging_icommandhandler_cs_icommandhandler_tcommand_tresponse_11", + "label": "ICommandHandler", + "role": "unknown", + "layer": "application", + "kind": "type", + "filePath": "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "sourcePath": "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "sourceLine": 11, + "evidencePaths": [ + "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "line": 11 + } + ] + }, + { + "id": "flow_file_nexusreader_application_abstractions_messaging_iquery_cs_file_1", + "label": "IQuery.cs", + "role": "handler", + "layer": "application", + "kind": "file", + "filePath": "NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "sourcePath": "NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.Application/Abstractions/Messaging/IQuery.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "line": 1 + } + ] + }, + { + "id": "flow_type_nexusreader_application_abstractions_messaging_iquery_cs_iquery_tresponse_6", + "label": "IQuery", + "role": "unknown", + "layer": "application", + "kind": "type", + "filePath": "NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "sourcePath": "NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "sourceLine": 6, + "evidencePaths": [ + "NexusReader.Application/Abstractions/Messaging/IQuery.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "line": 6 + } + ] + }, + { + "id": "flow_action_nexusreader_application_dependencyinjection_cs_addapplication_return_13_13", + "label": "Return IServiceCollection", + "role": "service-registration", + "layer": "application", + "kind": "action", + "filePath": "NexusReader.Application/DependencyInjection.cs", + "sourcePath": "NexusReader.Application/DependencyInjection.cs", + "sourceLine": 13, + "evidencePaths": [ + "NexusReader.Application/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/DependencyInjection.cs", + "line": 13 + } + ] + }, + { + "id": "flow_type_nexusreader_application_dependencyinjection_cs_configured_via_addmapsterconfiguration_extension_10", + "label": "configured via AddMapsterConfiguration extension", + "role": "service", + "layer": "application", + "kind": "type", + "filePath": "NexusReader.Application/DependencyInjection.cs", + "sourcePath": "NexusReader.Application/DependencyInjection.cs", + "sourceLine": 10, + "evidencePaths": [ + "NexusReader.Application/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/DependencyInjection.cs", + "line": 10 + } + ] + }, + { + "id": "flow_type_nexusreader_application_dependencyinjection_cs_handlers_discovered_in_this_assembly_11", + "label": "handlers discovered in this assembly", + "role": "service", + "layer": "application", + "kind": "type", + "filePath": "NexusReader.Application/DependencyInjection.cs", + "sourcePath": "NexusReader.Application/DependencyInjection.cs", + "sourceLine": 11, + "evidencePaths": [ + "NexusReader.Application/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/DependencyInjection.cs", + "line": 11 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_33_33", + "label": "Selects DB provider", + "role": "service-registration", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourcePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 33, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 33 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_34_34", + "label": "Evaluates branch condition", + "role": "service-registration", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourcePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 34, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 34 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_fallback_44_44", + "label": "Falls back to alternate path", + "role": "service-registration", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourcePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 44, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 44 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_64_64", + "label": "Evaluates branch condition", + "role": "service-registration", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourcePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 64, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 64 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_76_76", + "label": "Evaluates branch condition", + "role": "service-registration", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourcePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 76, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 76 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_return_134_134", + "label": "Returns IServiceCollection", + "role": "service-registration", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourcePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 134, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 134 + } + ] + }, + { + "id": "flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1", + "label": "KnowledgeService", + "role": "service", + "layer": "infrastructure", + "kind": "file", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 1 + } + ] + }, + { + "id": "flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1", + "label": "EpubReaderService", + "role": "service", + "layer": "infrastructure", + "kind": "file", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 1 + } + ] + }, + { + "id": "flow_file_nexusreader_infrastructure_services_epubmetadataextractor_cs_file_1", + "label": "EpubMetadataExtractor", + "role": "service", + "layer": "infrastructure", + "kind": "file", + "filePath": "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "line": 1 + } + ] + }, + { + "id": "flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1", + "label": "BookStorageService", + "role": "service", + "layer": "infrastructure", + "kind": "file", + "filePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 1 + } + ] + }, + { + "id": "flow_file_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_file_1", + "label": "SignalRSyncBroadcaster", + "role": "integration-client", + "layer": "infrastructure", + "kind": "file", + "filePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "line": 1 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_dependencyinjection_cs_assembly_137", + "label": "Assembly", + "role": "service-registration", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourcePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 137, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 137 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_assembly_return_137_137", + "label": "Return assembly", + "role": "service-registration", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourcePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 137, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 137 + } + ] + }, + { + "id": "flow_type_nexusreader_infrastructure_dependencyinjection_cs_iinfrastructuremarker_140", + "label": "IInfrastructureMarker", + "role": "unknown", + "layer": "infrastructure", + "kind": "type", + "filePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourcePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 140, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 140 + } + ] + }, + { + "id": "flow_type_nexusreader_infrastructure_dependencyinjection_cs_infrastructuremarker_141", + "label": "InfrastructureMarker", + "role": "unknown", + "layer": "infrastructure", + "kind": "type", + "filePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourcePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 141, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 141 + } + ] + }, + { + "id": "flow_type_nexusreader_infrastructure_dependencyinjection_cs_appdbcontext_36", + "label": "AppDbContext", + "role": "service", + "layer": "infrastructure", + "kind": "type", + "filePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourcePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 36, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 36 + } + ] + }, + { + "id": "flow_type_nexusreader_infrastructure_dependencyinjection_cs_appdbcontext_41", + "label": "AppDbContext", + "role": "service", + "layer": "infrastructure", + "kind": "type", + "filePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourcePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 41, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 41 + } + ] + }, + { + "id": "flow_type_nexusreader_infrastructure_dependencyinjection_cs_appdbcontext_47", + "label": "AppDbContext", + "role": "service", + "layer": "infrastructure", + "kind": "type", + "filePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourcePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 47, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 47 + } + ] + }, + { + "id": "flow_type_nexusreader_infrastructure_dependencyinjection_cs_appdbcontext_51", + "label": "AppDbContext", + "role": "service", + "layer": "infrastructure", + "kind": "type", + "filePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourcePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 51, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 51 + } + ] + }, + { + "id": "flow_type_nexusreader_infrastructure_dependencyinjection_cs_qdrantclient_57", + "label": "QdrantClient", + "role": "service", + "layer": "infrastructure", + "kind": "type", + "filePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourcePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 57, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 57 + } + ] + }, + { + "id": "flow_type_nexusreader_infrastructure_dependencyinjection_cs_neo4j_driver_graphdatabase_driver_61", + "label": "Neo4j.Driver (GraphDatabase.Driver)", + "role": "service", + "layer": "infrastructure", + "kind": "type", + "filePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourcePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 61, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 61 + } + ] + }, + { + "id": "flow_type_nexusreader_infrastructure_dependencyinjection_cs_hangfire_postgres_storage_66", + "label": "Hangfire/Postgres storage", + "role": "service", + "layer": "infrastructure", + "kind": "type", + "filePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourcePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 66, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 66 + } + ] + }, + { + "id": "flow_type_nexusreader_infrastructure_dependencyinjection_cs_geminichatclient_99", + "label": "GeminiChatClient", + "role": "service", + "layer": "infrastructure", + "kind": "type", + "filePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourcePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 99, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 99 + } + ] + }, + { + "id": "flow_type_nexusreader_infrastructure_dependencyinjection_cs_geminiembeddinggenerator_105", + "label": "GeminiEmbeddingGenerator", + "role": "service", + "layer": "infrastructure", + "kind": "type", + "filePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourcePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 105, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 105 + } + ] + }, + { + "id": "flow_type_nexusreader_infrastructure_dependencyinjection_cs_knowledgeservice_112", + "label": "KnowledgeService", + "role": "service", + "layer": "infrastructure", + "kind": "type", + "filePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourcePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 112, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 112 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_19", + "label": "UpdateProgress", + "role": "endpoint", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 19, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 19 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_repository_read_21_21", + "label": "Reads repository or persistence state", + "role": "endpoint", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 21, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 21 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_guard_clause_21_21", + "label": "Requires authenticated user id", + "role": "endpoint", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 21, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 21 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_branch_22_22", + "label": "Evaluates branch condition", + "role": "endpoint", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 22, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 22 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_repository_read_24_24", + "label": "Reads repository or persistence state", + "role": "endpoint", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 24, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 24 + } + ] + }, + { + "id": "flow_file_nexusreader_application_commands_sync_updatereadingprogresscommand_cs_file_1", + "label": "UpdateReadingProgressCommand", + "role": "handler", + "layer": "application", + "kind": "file", + "filePath": "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs", + "sourcePath": "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs", + "line": 1 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_28", + "label": "OnConnectedAsync", + "role": "endpoint", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 28, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 28 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_repository_read_30_30", + "label": "Reads repository or persistence state", + "role": "endpoint", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 30, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 30 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_branch_31_31", + "label": "Evaluates branch condition", + "role": "endpoint", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 31, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 31 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_guard_clause_31_31", + "label": "Only add to group if userId present", + "role": "endpoint", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 31, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 31 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_repository_read_33_33", + "label": "Reads repository or persistence state", + "role": "endpoint", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 33, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 33 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_38", + "label": "OnDisconnectedAsync", + "role": "endpoint", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 38, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 38 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_repository_read_40_40", + "label": "Reads repository or persistence state", + "role": "endpoint", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 40, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 40 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_branch_41_41", + "label": "Evaluates branch condition", + "role": "endpoint", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 41, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 41 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_guard_clause_41_41", + "label": "Only remove from group if userId present", + "role": "endpoint", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 41, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 41 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_repository_read_43_43", + "label": "Reads repository or persistence state", + "role": "endpoint", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 43, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 43 + } + ] + }, + { + "id": "flow_type_nexusreader_infrastructure_realtime_synchub_cs_synchub_10", + "label": "SyncHub", + "role": "unknown", + "layer": "infrastructure", + "kind": "type", + "filePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 10, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 10 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_knowledgeservice_38", + "label": "KnowledgeService", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 38, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 38 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeasync_61", + "label": "GetKnowledgeAsync", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 61, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 61 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeasync_return_63_63", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 63, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 63 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getgraphdataasync_66", + "label": "GetGraphDataAsync", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 66, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 66 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getgraphdataasync_return_68_68", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 68, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 68 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getsummaryandquizasync_71", + "label": "GetSummaryAndQuizAsync", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 71, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 71 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getsummaryandquizasync_return_73_73", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 73, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 73 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgemapasync_76", + "label": "GetKnowledgeMapAsync", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 76, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 76 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgemapasync_return_78_78", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 78, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 78 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_81", + "label": "GetKnowledgeInternalAsync", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 81, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 81 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_guard_clause_83_83", + "label": "Guards early exit or rejection path", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 83, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 83 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_branch_93_93", + "label": "Cache hit path", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 93, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 93 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_guard_clause_99_99", + "label": "Guards early exit or rejection path", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 99, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 99 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_log_103_103", + "label": "Logs runtime state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 103, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 103 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_branch_122_122", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 122, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 122 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_return_127_127", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 127, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 127 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_140", + "label": "ExecuteAiRequestAndCacheAsync", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 140, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 140 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_validation_166_166", + "label": "Rejects empty AI response", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 166, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 166 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_guard_clause_167_167", + "label": "Guards early exit or rejection path", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 167, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 167 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_guard_clause_176_176", + "label": "Guards early exit or rejection path", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 176, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 176 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_branch_193_193", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 193, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 193 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_repository_write_193_193", + "label": "Writes repository or persistence state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 193, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 193 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_fallback_194_194", + "label": "Falls back to alternate path", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 194, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 194 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_return_205_205", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 205, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 205 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_log_209_209", + "label": "Logs runtime state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 209, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 209 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_return_210_210", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 210, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 210 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_return_215_215", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 215, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 215 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_225", + "label": "ProcessKnowledgeUnitsAsync", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 225, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 225 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_repository_read_235_235", + "label": "Reads repository or persistence state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 235, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 235 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_loop_240_240", + "label": "Repeats work over a collection or condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 240, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 240 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_branch_245_245", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 245, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 245 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_repository_write_248_248", + "label": "Writes repository or persistence state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 248, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 248 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_loop_266_266", + "label": "Maps links to KnowledgeUnitLink entities", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 266, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 266 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_branch_271_271", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 271, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 271 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_repository_write_281_281", + "label": "Writes repository or persistence state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 281, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 281 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_fallback_283_283", + "label": "Falls back to alternate path", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 283, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 283 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_log_285_285", + "label": "Logs runtime state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 285, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 285 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_verifygroundednessasync_290", + "label": "VerifyGroundednessAsync", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 290, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 290 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_verifygroundednessasync_return_295_295", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 295, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 295 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_verifygroundednessasync_return_320_320", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 320, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 320 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_verifygroundednessasync_return_324_324", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 324, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 324 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_328", + "label": "GetRelevantContextAsync", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 328, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 328 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_336_336", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 336, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 336 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_337_337", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 337, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 337 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_339_339", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 339, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 339 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_342_342", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 342, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 342 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_345_345", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 345, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 345 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_347_347", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 347, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 347 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_350_350", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 350, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 350 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_354_354", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 354, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 354 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_368_368", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 368, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 368 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_return_377_377", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 377, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 377 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_return_381_381", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 381, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 381 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_385", + "label": "SearchLibrarySemanticallyAsync", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 385, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 385 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_399_399", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 399, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 399 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_400_400", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 400, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 400 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_402_402", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 402, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 402 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_405_405", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 405, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 405 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_408_408", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 408, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 408 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_410_410", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 410, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 410 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_413_413", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 413, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 413 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_417_417", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 417, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 417 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_log_431_431", + "label": "Logs runtime state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 431, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 431 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_432_432", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 432, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 432 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_435_435", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 435, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 435 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_437_437", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 437, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 437 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_444_444", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 444, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 444 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_452_452", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 452, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 452 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_457_457", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 457, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 457 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_loop_460_460", + "label": "Repeats work over a collection or condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 460, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 460 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_464_464", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 464, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 464 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_log_473_473", + "label": "Logs runtime state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 473, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 473 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_repository_read_479_479", + "label": "Reads repository or persistence state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 479, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 479 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_485_485", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 485, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 485 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_repository_read_489_489", + "label": "Reads repository or persistence state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 489, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 489 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_501_501", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 501, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 501 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_507_507", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 507, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 507 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_513_513", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 513, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 513 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_533_533", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 533, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 533 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_538_538", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 538, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 538 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_541_541", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 541, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 541 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_545_545", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 545, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 545 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_549", + "label": "AskQuestionAsync", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 549, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 549 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_568_568", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 568, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 568 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_571_571", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 571, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 571 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_572_572", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 572, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 572 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_574_574", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 574, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 574 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_577_577", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 577, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 577 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_580_580", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 580, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 580 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_582_582", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 582, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 582 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_585_585", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 585, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 585 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_588_588", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 588, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 588 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_590_590", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 590, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 590 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_592_592", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 592, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 592 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_594_594", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 594, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 594 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_597_597", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 597, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 597 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_602_602", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 602, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 602 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_log_616_616", + "label": "Logs runtime state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 616, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 616 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_617_617", + "label": "Calls external dependency", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 617, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 617 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_620_620", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 620, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 620 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_622_622", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 622, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 622 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_624_624", + "label": "Reads repository or persistence state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 624, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 624 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_636_636", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 636, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 636 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_645_645", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 645, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 645 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_651_651", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 651, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 651 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_loop_654_654", + "label": "Repeats work over a collection or condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 654, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 654 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_write_659_659", + "label": "Writes repository or persistence state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 659, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 659 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_662_662", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 662, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 662 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_loop_664_664", + "label": "Repeats work over a collection or condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 664, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 664 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_671_671", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 671, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 671 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_write_673_673", + "label": "Writes repository or persistence state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 673, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 673 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_log_682_682", + "label": "Logs runtime state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 682, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 682 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_loop_683_683", + "label": "Repeats work over a collection or condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 683, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 683 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_write_687_687", + "label": "Writes repository or persistence state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 687, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 687 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_694_694", + "label": "Reads repository or persistence state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 694, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 694 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_700_700", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 700, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 700 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_704_704", + "label": "Reads repository or persistence state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 704, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 704 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_715_715", + "label": "Reads repository or persistence state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 715, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 715 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_716_716", + "label": "Reads repository or persistence state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 716, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 716 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_717_717", + "label": "Reads repository or persistence state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 717, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 717 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_754_754", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 754, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 754 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_756_756", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 756, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 756 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_loop_760_760", + "label": "Repeats work over a collection or condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 760, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 760 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_762_762", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 762, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 762 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_771_771", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 771, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 771 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_log_775_775", + "label": "Logs runtime state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 775, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 775 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_776_776", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 776, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 776 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_781_781", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 781, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 781 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_30", + "label": "GetEpubContentAsync", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 30, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 30 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_repository_read_41_41", + "label": "Reads repository or persistence state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 41, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 41 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_guard_clause_47_47", + "label": "Ebook existence check", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 47, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 47 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_47_47", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 47, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 47 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_return_49_49", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 49, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 49 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_55_55", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 55, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 55 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_log_57_57", + "label": "Logs runtime state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 57, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 57 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_return_58_58", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 58, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 58 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_65_65", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 65, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 65 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_guard_clause_65_65", + "label": "ReadingOrder empty check", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 65, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 65 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_return_67_67", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 67, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 67 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_70_70", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 70, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 70 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_repository_read_77_77", + "label": "Reads repository or persistence state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 77, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 77 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_loop_89_89", + "label": "Paragraph -> block building loop", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 89, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 89 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_guard_clause_92_92", + "label": "Guards early exit or rejection path", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 92, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 92 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_99_99", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 99, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 99 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_106_106", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 106, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 106 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_return_111_111", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 111, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 111 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_log_115_115", + "label": "Logs runtime state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 115, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 115 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_return_116_116", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 116, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 116 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_124", + "label": "ResolvePath", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 124, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 124 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_loop_129_129", + "label": "Search upward through parent directories", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 129, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 129 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_loop_130_130", + "label": "Repeats work over a collection or condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 130, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 130 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_guard_clause_133_133", + "label": "Guards early exit or rejection path", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 133, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 133 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_guard_clause_137_137", + "label": "Guards early exit or rejection path", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 137, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 137 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_fallback_142_142", + "label": "Return null if not found", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 142, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 142 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_return_142_142", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 142, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 142 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_extractparagraphs_145", + "label": "ExtractParagraphs", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 145, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 145 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_extractparagraphs_loop_153_153", + "label": "Repeats work over a collection or condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 153, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 153 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_extractparagraphs_branch_158_158", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 158, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 158 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_extractparagraphs_fallback_158_158", + "label": "Split by breaks if no blocks found", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 158, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 158 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_extractparagraphs_return_163_163", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 163, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 163 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_sanitizeparagraph_166", + "label": "SanitizeParagraph", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 166, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 166 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_sanitizeparagraph_return_172_172", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 172, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 172 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_175", + "label": "CountWords", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 175, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 175 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_guard_clause_177_177", + "label": "Empty text check", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 177, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 177 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_return_178_178", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 178, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 178 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_createaitrigger_181", + "label": "CreateAiTrigger", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 181, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 181 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_186", + "label": "FindTitleInNavigation", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 186, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 186 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_repository_read_186_186", + "label": "Reads repository or persistence state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 186, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 186 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_guard_clause_188_188", + "label": "Guards early exit or rejection path", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 188, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 188 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_loop_191_191", + "label": "Iterate navigation items", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 191, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 191 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_branch_193_193", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 193, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 193 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_return_194_194", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 194, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 194 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_branch_196_196", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 196, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 196 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_repository_read_198_198", + "label": "Reads repository or persistence state", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 198, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 198 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_guard_clause_199_199", + "label": "Guards early exit or rejection path", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 199, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 199 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_return_203_203", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 203, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 203 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_epubmetadataextractor_cs_extractmetadataasync_15", + "label": "ExtractMetadataAsync", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "sourceLine": 15, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "line": 15 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubmetadataextractor_cs_extractmetadataasync_guard_clause_20_20", + "label": "Default title when null", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "sourceLine": 20, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "line": 20 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubmetadataextractor_cs_extractmetadataasync_guard_clause_21_21", + "label": "Default author when null", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "sourceLine": 21, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "line": 21 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubmetadataextractor_cs_extractmetadataasync_return_24_24", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "sourceLine": 24, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "line": 24 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubmetadataextractor_cs_extractmetadataasync_return_28_28", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "sourcePath": "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "sourceLine": 28, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "line": 28 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_19", + "label": "SaveEbookAsync", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 19, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 19 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_return_22_22", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 22, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 22 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_25", + "label": "SaveEbookAsync", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 25, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 25 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_guard_clause_28_28", + "label": "Ensure uploads directory exists", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 28, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 28 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_return_40_40", + "label": "Return web-relative uploads path", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 40, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 40 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_43", + "label": "SaveCoverAsync", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 43, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 43 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_guard_clause_45_45", + "label": "Guards early exit or rejection path", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 45, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 45 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_return_47_47", + "label": "Returns result", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 47, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 47 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_50", + "label": "SaveCoverAsync", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 50, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 50 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_guard_clause_53_53", + "label": "Ensure covers directory exists", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 53, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 53 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_return_63_63", + "label": "Return web-relative covers path", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 63, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 63 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_66", + "label": "EnsureDirectoryExists", + "role": "service", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 66, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 66 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_guard_clause_68_68", + "label": "Check directory existence", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 68, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 68 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_branch_68_68", + "label": "Evaluates branch condition", + "role": "service", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 68, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 68 + } + ] + }, + { + "id": "flow_type_nexusreader_infrastructure_services_bookstorageservice_cs_bookstorageservice_10", + "label": "BookStorageService", + "role": "unknown", + "layer": "infrastructure", + "kind": "type", + "filePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourcePath": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 10, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 10 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_21", + "label": "BroadcastProgressAsync", + "role": "integration-client", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourceLine": 21, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "line": 21 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_guard_clause_30_30", + "label": "Check excludedConnectionId", + "role": "integration-client", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourceLine": 30, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "line": 30 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_branch_30_30", + "label": "Evaluates branch condition", + "role": "integration-client", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourceLine": 30, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "line": 30 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_external_call_34_34", + "label": "Calls external dependency", + "role": "integration-client", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourceLine": 34, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "line": 34 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_fallback_40_40", + "label": "Falls back to alternate path", + "role": "integration-client", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourceLine": 40, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "line": 40 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_external_call_44_44", + "label": "Calls external dependency", + "role": "integration-client", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourceLine": 44, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "line": 44 + } + ] + }, + { + "id": "flow_method_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastingestionprogressasync_49", + "label": "BroadcastIngestionProgressAsync", + "role": "integration-client", + "layer": "infrastructure", + "kind": "method", + "filePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourceLine": 49, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "line": 49 + } + ] + }, + { + "id": "flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastingestionprogressasync_external_call_59_59", + "label": "Calls external dependency", + "role": "integration-client", + "layer": "infrastructure", + "kind": "action", + "filePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourceLine": 59, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "line": 59 + } + ] + }, + { + "id": "flow_type_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_signalrsyncbroadcaster_11", + "label": "SignalRSyncBroadcaster", + "role": "unknown", + "layer": "infrastructure", + "kind": "type", + "filePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourceLine": 11, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "line": 11 + } + ] + }, + { + "id": "flow_type_nexusreader_application_commands_sync_updatereadingprogresscommand_cs_updatereadingprogresscommand_6", + "label": "UpdateReadingProgressCommand", + "role": "unknown", + "layer": "application", + "kind": "type", + "filePath": "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs", + "sourcePath": "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs", + "sourceLine": 6, + "evidencePaths": [ + "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs", + "line": 6 + } + ] + } + ], + "edges": [ + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_method_nexusreader_maui_mauiprogram_cs_createmauiapp_12_invokes_12", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_method_nexusreader_maui_mauiprogram_cs_createmauiapp_12", + "kind": "handles-route", + "label": "CreateMauiApp", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 12, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 12 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_maui_mauiprogram_cs_createmauiapp_12_flow_action_nexusreader_maui_mauiprogram_cs_createmauiapp_return_57_57_returns_57", + "from": "flow_method_nexusreader_maui_mauiprogram_cs_createmauiapp_12", + "to": "flow_action_nexusreader_maui_mauiprogram_cs_createmauiapp_return_57_57", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 57, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 57 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauiprogram_10_defines-type_10", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_mauiprogram_10", + "kind": "defines-type", + "label": "model MauiProgram", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 10, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 10 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28_registers-service_28", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28", + "kind": "registers-service", + "label": "IPlatformService", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 28, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 28 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29_registers-service_29", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29", + "kind": "registers-service", + "label": "INativeStorageService", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 29, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 29 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32_registers-service_32", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32", + "kind": "registers-service", + "label": "NexusAuthenticationStateProvider", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 32, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 32 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33_registers-service_33", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33", + "kind": "registers-service", + "label": "Microsoft.AspNetCore.Components.Authorization.AuthenticationStateProvider", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 33, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 33 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38_registers-service_38", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38", + "kind": "registers-service", + "label": "HttpClient", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 38, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 38 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1_registers-service_1", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1", + "kind": "registers-service", + "label": "UI and app state services", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 1 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51_registers-service_51", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51", + "kind": "registers-service", + "label": "Application layer services (extension)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 51, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 51 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53_registers-service_53", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53", + "kind": "registers-service", + "label": "MediatR handlers", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 53, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 53 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_method_nexusreader_maui_mauiprogram_cs_create_and_build_mauiapp_16_configures-pipeline_16", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_method_nexusreader_maui_mauiprogram_cs_create_and_build_mauiapp_16", + "kind": "configures-pipeline", + "label": "unknown", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 16, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 16 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15_invokes_15", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15", + "kind": "handles-route", + "label": "Program (top-level startup)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 15, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 15 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_getservice_71_invokes_71", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_method_nexusreader_web_client_program_cs_getservice_71", + "kind": "handles-route", + "label": "GetService", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 71, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 71 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_web_client_program_cs_getservice_71_flow_action_nexusreader_web_client_program_cs_getservice_return_71_71_returns_71", + "from": "flow_method_nexusreader_web_client_program_cs_getservice_71", + "to": "flow_action_nexusreader_web_client_program_cs_getservice_return_71_71", + "kind": "returns", + "label": "returns null", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 71, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 71 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88_invokes_88", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88", + "kind": "handles-route", + "label": "FindAuthorByNameAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 88, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 88 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88_flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88_invokes_88", + "from": "flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88", + "to": "flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 88, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 88 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61_defines-type_61", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61", + "kind": "defines-type", + "label": "model ThrowingDbContextFactory", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 61, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 61 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66_defines-type_66", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66", + "kind": "defines-type", + "label": "model ThrowingEmbeddingGenerator", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 66, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 66 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74_defines-type_74", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74", + "kind": "defines-type", + "label": "model ThrowingBookStorageService", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 74, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 74 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84_defines-type_84", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84", + "kind": "defines-type", + "label": "model ThrowingEbookRepository", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 84, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 84 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94_defines-type_94", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94", + "kind": "defines-type", + "label": "model ThrowingSyncBroadcaster", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 94, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 94 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_webplatformservice_18_registers-service_18", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_webplatformservice_18", + "kind": "registers-service", + "label": "IPlatformService", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 18, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 18 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33_registers-service_33", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33", + "kind": "registers-service", + "label": "NexusAuthenticationStateProvider", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 33, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 33 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38_registers-service_38", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38", + "kind": "registers-service", + "label": "IKnowledgeService", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 38, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 38 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_configured_httpclient_40_registers-service_40", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_configured_httpclient_40", + "kind": "registers-service", + "label": "HttpClient (named 'NexusAPI')", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 40, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 40 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49_registers-service_49", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49", + "kind": "registers-service", + "label": "IDbContextFactory", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 49, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 49 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_n_a_55_registers-service_55", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_n_a_55", + "kind": "registers-service", + "label": "application services (via extension)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 55, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 55 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_wasmepubreader_56_registers-service_56", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_wasmepubreader_56", + "kind": "registers-service", + "label": "IEpubReader", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 56, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 56 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_run_wasm_host_59_configures-pipeline_59", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_method_nexusreader_web_client_program_cs_run_wasm_host_59", + "kind": "configures-pipeline", + "label": "unknown", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 59, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 59 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_program_top_level_29_invokes_29", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_method_nexusreader_web_program_cs_program_top_level_29", + "kind": "handles-route", + "label": "Program (top-level)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 29, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 29 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_web_program_cs_program_top_level_29_flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62_evaluates-condition_62", + "from": "flow_method_nexusreader_web_program_cs_program_top_level_29", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 62, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 62 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_falls-back_66", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "kind": "falls-back", + "label": "fallback", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 66, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 66 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125_invokes_125", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 125, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 125 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_126_126_invokes_126", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_126_126", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 126, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 126 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_126_126_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_127_127_invokes_127", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_126_126", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_127_127", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 127, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 127 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_127_127_flow_action_nexusreader_web_program_cs_program_top_level_branch_129_129_evaluates-condition_129", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_127_127", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_129_129", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 129, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 129 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_129_129_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_131_131_invokes_131", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_129_129", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_131_131", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 131, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 131 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_131_131_flow_action_nexusreader_web_program_cs_program_top_level_fallback_133_133_falls-back_133", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_131_131", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_133_133", + "kind": "falls-back", + "label": "fallback", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 133, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 133 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_fallback_133_133_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_135_135_invokes_135", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_133_133", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_135_135", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 135, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 135 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_135_135_flow_action_nexusreader_web_program_cs_program_top_level_return_137_137_returns_137", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_135_135", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_137_137", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 137, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 137 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_return_137_137_flow_action_nexusreader_web_program_cs_program_top_level_branch_169_169_evaluates-condition_169", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_return_137_137", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_169_169", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 169, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 169 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_169_169_flow_action_nexusreader_web_program_cs_program_top_level_validation_171_171_evaluates-condition_171", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_169_169", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_validation_171_171", + "kind": "evaluates-condition", + "label": "Validates input or state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 171, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 171 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_validation_171_171_flow_action_nexusreader_web_program_cs_program_top_level_loop_186_186_loops-to_186", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_validation_171_171", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_loop_186_186", + "kind": "loops-to", + "label": "int i = 0; i < maxRetries; i++", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 186, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 186 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_loop_186_186_flow_action_nexusreader_web_program_cs_program_top_level_branch_190_190_evaluates-condition_190", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_loop_186_186", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_190_190", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 190, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 190 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_190_190_flow_action_nexusreader_web_program_cs_program_top_level_branch_198_198_evaluates-condition_198", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_190_190", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_198_198", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 198, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 198 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_198_198_flow_action_nexusreader_web_program_cs_program_top_level_branch_206_206_evaluates-condition_206", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_198_198", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_206_206", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 206, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 206 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_206_206_flow_action_nexusreader_web_program_cs_program_top_level_log_206_206_invokes_206", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_206_206", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_log_206_206", + "kind": "invokes", + "label": "Logs runtime state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 206, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 206 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_log_206_206_flow_action_nexusreader_web_program_cs_program_top_level_log_208_208_invokes_208", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_log_206_206", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_log_208_208", + "kind": "invokes", + "label": "Logs runtime state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 208, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 208 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_log_208_208_flow_action_nexusreader_web_program_cs_program_top_level_branch_216_216_evaluates-condition_216", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_log_208_208", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_216_216", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 216, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 216 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_216_216_flow_action_nexusreader_web_program_cs_program_top_level_log_216_216_invokes_216", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_216_216", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_log_216_216", + "kind": "invokes", + "label": "Logs runtime state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 216, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 216 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_log_216_216_flow_action_nexusreader_web_program_cs_program_top_level_log_218_218_invokes_218", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_log_216_216", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_log_218_218", + "kind": "invokes", + "label": "Logs runtime state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 218, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 218 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_log_218_218_flow_action_nexusreader_web_program_cs_program_top_level_branch_226_226_evaluates-condition_226", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_log_218_218", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_226_226", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 226, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 226 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_226_226_flow_action_nexusreader_web_program_cs_program_top_level_fallback_230_230_falls-back_230", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_226_226", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_230_230", + "kind": "falls-back", + "label": "fallback", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 230, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 230 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_fallback_230_230_flow_action_nexusreader_web_program_cs_program_top_level_branch_237_237_evaluates-condition_237", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_230_230", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_237_237", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 237, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 237 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_237_237_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_252_252_invokes_252", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_237_237", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_252_252", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 252, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 252 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_252_252_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_255_255_evaluates-condition_255", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_252_252", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_255_255", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 255, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 255 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_255_255_flow_action_nexusreader_web_program_cs_program_top_level_return_258_258_returns_258", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_255_255", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_258_258", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 258, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 258 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_return_258_258_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_267_267_invokes_267", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_return_258_258", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_267_267", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 267, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 267 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_267_267_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_269_269_evaluates-condition_269", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_267_267", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_269_269", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 269, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 269 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_269_269_flow_action_nexusreader_web_program_cs_program_top_level_return_270_270_returns_270", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_269_269", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_270_270", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 270, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 270 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_return_270_270_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_275_275_invokes_275", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_return_270_270", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_275_275", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 275, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 275 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_275_275_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_277_277_evaluates-condition_277", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_275_275", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_277_277", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 277, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 277 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_277_277_flow_action_nexusreader_web_program_cs_program_top_level_return_278_278_returns_278", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_277_277", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_278_278", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 278, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 278 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_return_278_278_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_283_283_invokes_283", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_return_278_278", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_283_283", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 283, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 283 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_283_283_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_285_285_evaluates-condition_285", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_283_283", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_285_285", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 285, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 285 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_285_285_flow_action_nexusreader_web_program_cs_program_top_level_return_286_286_returns_286", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_285_285", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_286_286", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 286, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 286 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_return_286_286_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_291_291_invokes_291", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_return_286_286", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_291_291", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 291, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 291 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_291_291_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_293_293_evaluates-condition_293", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_291_291", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_293_293", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 293, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 293 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_293_293_flow_action_nexusreader_web_program_cs_program_top_level_return_294_294_returns_294", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_293_293", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_294_294", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 294, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 294 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_return_294_294_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_299_299_invokes_299", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_return_294_294", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_299_299", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 299, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 299 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_299_299_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_301_301_evaluates-condition_301", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_299_299", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_301_301", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 301, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 301 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_301_301_flow_action_nexusreader_web_program_cs_program_top_level_return_302_302_returns_302", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_301_301", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_302_302", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 302, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 302 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_return_302_302_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_307_307_invokes_307", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_return_302_302", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_307_307", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 307, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 307 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_307_307_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_309_309_evaluates-condition_309", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_307_307", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_309_309", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 309, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 309 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_309_309_flow_action_nexusreader_web_program_cs_program_top_level_return_310_310_returns_310", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_309_309", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_310_310", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 310, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 310 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_return_310_310_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_315_315_invokes_315", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_return_310_310", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_315_315", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 315, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 315 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_315_315_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_317_317_evaluates-condition_317", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_315_315", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_317_317", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 317, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 317 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_317_317_flow_action_nexusreader_web_program_cs_program_top_level_return_318_318_returns_318", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_317_317", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_318_318", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 318, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 318 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_return_318_318_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_324_324_evaluates-condition_324", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_return_318_318", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_324_324", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 324, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 324 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_324_324_flow_action_nexusreader_web_program_cs_program_top_level_return_327_327_returns_327", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_324_324", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_327_327", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 327, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 327 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_return_327_327_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_332_332_invokes_332", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_return_327_327", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_332_332", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 332, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 332 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_332_332_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_333_333_evaluates-condition_333", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_332_332", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_333_333", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 333, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 333 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_333_333_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_350_350_evaluates-condition_350", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_333_333", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_350_350", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 350, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 350 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_350_350_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_352_352_invokes_352", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_350_350", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_352_352", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 352, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 352 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_352_352_flow_action_nexusreader_web_program_cs_program_top_level_return_352_352_returns_352", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_352_352", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_352_352", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 352, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 352 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_return_352_352_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_357_357_invokes_357", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_return_352_352", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_357_357", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 357, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 357 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_357_357_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_358_358_evaluates-condition_358", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_357_357", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_358_358", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 358, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 358 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_358_358_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_361_361_evaluates-condition_361", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_358_358", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_361_361", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 361, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 361 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_361_361_flow_action_nexusreader_web_program_cs_program_top_level_return_364_364_returns_364", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_361_361", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_364_364", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 364, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 364 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_return_364_364_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_374_374_invokes_374", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_return_364_364", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_374_374", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 374, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 374 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_374_374_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_381_381_invokes_381", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_374_374", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_381_381", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 381, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 381 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_381_381_flow_action_nexusreader_web_program_cs_program_top_level_switch_385_385_evaluates-condition_385", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_381_381", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_switch_385_385", + "kind": "evaluates-condition", + "label": "stripeEvent.Type", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 385, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 385 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_switch_385_385_flow_action_nexusreader_web_program_cs_program_top_level_return_402_402_returns_402", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_switch_385_385", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_402_402", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 402, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 402 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_return_402_402_flow_action_nexusreader_web_program_cs_program_top_level_return_406_406_returns_406", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_return_402_402", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_406_406", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 406, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 406 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_return_406_406_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_416_416_evaluates-condition_416", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_return_406_406", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_416_416", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 416, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 416 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_416_416_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_418_418_invokes_418", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_416_416", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_418_418", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 418, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 418 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_418_418_flow_action_nexusreader_web_program_cs_program_top_level_branch_419_419_evaluates-condition_419", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_418_418", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_419_419", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 419, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 419 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_419_419_flow_action_nexusreader_web_program_cs_program_top_level_branch_424_424_evaluates-condition_424", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_419_419", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_424_424", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 424, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 424 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_424_424_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_439_439_evaluates-condition_439", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_424_424", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_439_439", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 439, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 439 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_439_439_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_441_441_invokes_441", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_439_439", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_441_441", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 441, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 441 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_441_441_flow_action_nexusreader_web_program_cs_program_top_level_branch_442_442_evaluates-condition_442", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_441_441", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_442_442", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 442, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 442 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_442_442_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_444_444_invokes_444", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_442_442", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_444_444", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 444, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 444 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_444_444_flow_action_nexusreader_web_program_cs_program_top_level_return_460_460_returns_460", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_444_444", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_460_460", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 460, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 460 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_return_460_460_flow_action_nexusreader_web_program_cs_program_top_level_branch_470_470_evaluates-condition_470", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_return_460_460", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_470_470", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 470, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 470 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_470_470_flow_action_nexusreader_web_program_cs_program_top_level_log_472_472_invokes_472", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_470_470", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_log_472_472", + "kind": "invokes", + "label": "Logs runtime state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 472, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 472 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_log_472_472_flow_action_nexusreader_web_program_cs_program_top_level_return_473_473_returns_473", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_log_472_472", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_473_473", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 473, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 473 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_return_473_473_flow_action_nexusreader_web_program_cs_program_top_level_branch_477_477_evaluates-condition_477", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_return_473_473", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_477_477", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 477, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 477 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_477_477_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_479_479_invokes_479", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_477_477", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_479_479", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 479, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 479 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_479_479_flow_action_nexusreader_web_program_cs_program_top_level_return_480_480_returns_480", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_479_479", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_480_480", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 480, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 480 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_return_480_480_flow_action_nexusreader_web_program_cs_program_top_level_branch_483_483_evaluates-condition_483", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_return_480_480", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_483_483", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 483, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 483 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_483_483_flow_action_nexusreader_web_program_cs_program_top_level_log_485_485_invokes_485", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_483_483", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_log_485_485", + "kind": "invokes", + "label": "Logs runtime state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 485, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 485 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_log_485_485_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_485_485_invokes_485", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_log_485_485", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_485_485", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 485, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 485 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_485_485_flow_action_nexusreader_web_program_cs_program_top_level_return_486_486_returns_486", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_485_485", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_486_486", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 486, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 486 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_return_486_486_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_490_490_invokes_490", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_return_486_486", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_490_490", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 490, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 490 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_490_490_flow_action_nexusreader_web_program_cs_program_top_level_branch_491_491_evaluates-condition_491", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_490_490", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_491_491", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 491, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 491 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_491_491_flow_action_nexusreader_web_program_cs_program_top_level_branch_496_496_evaluates-condition_496", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_491_491", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_496_496", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 496, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 496 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_496_496_flow_action_nexusreader_web_program_cs_program_top_level_return_501_501_returns_501", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_496_496", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_501_501", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 501, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 501 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_return_501_501_flow_action_nexusreader_web_program_cs_program_top_level_loop_505_505_loops-to_505", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_return_501_501", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_loop_505_505", + "kind": "loops-to", + "label": "var error in createResult.Errors", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 505, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 505 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_loop_505_505_flow_action_nexusreader_web_program_cs_program_top_level_log_507_507_invokes_507", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_loop_505_505", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_log_507_507", + "kind": "invokes", + "label": "Logs runtime state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 507, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 507 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_log_507_507_flow_action_nexusreader_web_program_cs_program_top_level_branch_510_510_evaluates-condition_510", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_log_507_507", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_510_510", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 510, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 510 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_510_510_flow_action_nexusreader_web_program_cs_program_top_level_return_512_512_returns_512", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_510_510", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_512_512", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 512, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 512 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_return_512_512_flow_action_nexusreader_web_program_cs_program_top_level_log_516_516_invokes_516", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_return_512_512", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_log_516_516", + "kind": "invokes", + "label": "Logs runtime state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 516, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 516 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_log_516_516_flow_action_nexusreader_web_program_cs_program_top_level_return_517_517_returns_517", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_log_516_516", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_517_517", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 517, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 517 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_return_517_517_flow_action_nexusreader_web_program_cs_program_top_level_branch_529_529_evaluates-condition_529", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_return_517_517", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_529_529", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 529, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 529 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_529_529_flow_action_nexusreader_web_program_cs_program_top_level_return_532_532_returns_532", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_529_529", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_532_532", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 532, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 532 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_return_532_532_flow_action_nexusreader_web_program_cs_program_top_level_return_536_536_returns_536", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_return_532_532", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_536_536", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 536, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 536 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_return_536_536_flow_action_nexusreader_web_program_cs_program_top_level_return_545_545_returns_545", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_return_536_536", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_545_545", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 545, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 545 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_return_545_545_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_550_550_invokes_550", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_return_545_545", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_550_550", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 550, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 550 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_550_550_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_551_551_evaluates-condition_551", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_550_550", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_551_551", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 551, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 551 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_551_551_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_554_554_evaluates-condition_554", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_551_551", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_554_554", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 554, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 554 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_554_554_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_554_554_invokes_554", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_guard_clause_554_554", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_554_554", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 554, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 554 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_554_554_flow_action_nexusreader_web_program_cs_program_top_level_return_556_556_returns_556", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_554_554", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_return_556_556", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 556, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 556 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_flow_method_nexusreader_application_dependencyinjection_cs_addapplication_8_uses-service_78", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "to": "flow_method_nexusreader_application_dependencyinjection_cs_addapplication_8", + "kind": "uses-service", + "label": "AddApplication", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 78, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 78 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_flow_method_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_31_uses-service_79", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "to": "flow_method_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_31", + "kind": "uses-service", + "label": "AddInfrastructure", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 79, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 79 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_237_237_flow_method_nexusreader_infrastructure_realtime_synchub_cs_synchub_14_uses-service_247", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_237_237", + "to": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_synchub_14", + "kind": "uses-service", + "label": "SyncHub", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 247, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 247 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_startupvalidation_scope_check_165_invokes_165", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_method_nexusreader_web_program_cs_startupvalidation_scope_check_165", + "kind": "handles-route", + "label": "StartupValidation (scope check)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 165, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 165 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_web_program_cs_startupvalidation_scope_check_165_flow_action_nexusreader_web_program_cs_startupvalidation_scope_check_branch_169_169_evaluates-condition_169", + "from": "flow_method_nexusreader_web_program_cs_startupvalidation_scope_check_165", + "to": "flow_action_nexusreader_web_program_cs_startupvalidation_scope_check_branch_169_169", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 169, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 169 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_startupvalidation_scope_check_branch_169_169_flow_action_nexusreader_web_program_cs_startupvalidation_scope_check_guard_clause_169_169_evaluates-condition_169", + "from": "flow_action_nexusreader_web_program_cs_startupvalidation_scope_check_branch_169_169", + "to": "flow_action_nexusreader_web_program_cs_startupvalidation_scope_check_guard_clause_169_169", + "kind": "evaluates-condition", + "label": "throw / continue", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 169, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 169 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_startupvalidation_scope_check_guard_clause_169_169_flow_action_nexusreader_web_program_cs_startupvalidation_scope_check_validation_171_171_evaluates-condition_171", + "from": "flow_action_nexusreader_web_program_cs_startupvalidation_scope_check_guard_clause_169_169", + "to": "flow_action_nexusreader_web_program_cs_startupvalidation_scope_check_validation_171_171", + "kind": "evaluates-condition", + "label": "Validates input or state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 171, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 171 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_ensuredatabaseinitialized_175_invokes_175", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_method_nexusreader_web_program_cs_ensuredatabaseinitialized_175", + "kind": "handles-route", + "label": "EnsureDatabaseInitialized", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 175, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 175 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_web_program_cs_ensuredatabaseinitialized_175_flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_loop_186_186_loops-to_186", + "from": "flow_method_nexusreader_web_program_cs_ensuredatabaseinitialized_175", + "to": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_loop_186_186", + "kind": "loops-to", + "label": "int i = 0; i < maxRetries; i++", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 186, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 186 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_loop_186_186_flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_branch_190_190_evaluates-condition_190", + "from": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_loop_186_186", + "to": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_branch_190_190", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 190, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 190 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_branch_190_190_flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_branch_198_198_evaluates-condition_198", + "from": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_branch_190_190", + "to": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_branch_198_198", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 198, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 198 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_branch_198_198_flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_branch_206_206_evaluates-condition_206", + "from": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_branch_198_198", + "to": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_branch_206_206", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 206, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 206 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_branch_206_206_flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_log_206_206_invokes_206", + "from": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_branch_206_206", + "to": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_log_206_206", + "kind": "invokes", + "label": "Logs runtime state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 206, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 206 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_log_206_206_flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_log_208_208_invokes_208", + "from": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_log_206_206", + "to": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_log_208_208", + "kind": "invokes", + "label": "Logs runtime state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 208, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 208 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_log_208_208_flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_branch_216_216_evaluates-condition_216", + "from": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_log_208_208", + "to": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_branch_216_216", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 216, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 216 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_branch_216_216_flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_log_216_216_invokes_216", + "from": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_branch_216_216", + "to": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_log_216_216", + "kind": "invokes", + "label": "Logs runtime state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 216, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 216 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_log_216_216_flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_log_218_218_invokes_218", + "from": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_log_216_216", + "to": "flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_log_218_218", + "kind": "invokes", + "label": "Logs runtime state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 218, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 218 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_get_api_epub_ebookid_index_249_invokes_249", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_method_nexusreader_web_program_cs_get_api_epub_ebookid_index_249", + "kind": "handles-route", + "label": "GET /api/epub/{ebookId}/{index}", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 249, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 249 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_web_program_cs_get_api_epub_ebookid_index_249_flow_action_nexusreader_web_program_cs_get_api_epub_ebookid_index_guard_clause_252_252_evaluates-condition_252", + "from": "flow_method_nexusreader_web_program_cs_get_api_epub_ebookid_index_249", + "to": "flow_action_nexusreader_web_program_cs_get_api_epub_ebookid_index_guard_clause_252_252", + "kind": "evaluates-condition", + "label": "continue", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 252, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 252 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_get_api_epub_ebookid_index_guard_clause_252_252_flow_action_nexusreader_web_program_cs_get_api_epub_ebookid_index_repository_read_252_252_invokes_252", + "from": "flow_action_nexusreader_web_program_cs_get_api_epub_ebookid_index_guard_clause_252_252", + "to": "flow_action_nexusreader_web_program_cs_get_api_epub_ebookid_index_repository_read_252_252", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 252, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 252 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_get_api_epub_ebookid_index_repository_read_252_252_flow_action_nexusreader_web_program_cs_get_api_epub_ebookid_index_guard_clause_255_255_evaluates-condition_255", + "from": "flow_action_nexusreader_web_program_cs_get_api_epub_ebookid_index_repository_read_252_252", + "to": "flow_action_nexusreader_web_program_cs_get_api_epub_ebookid_index_guard_clause_255_255", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 255, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 255 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_get_api_epub_ebookid_index_guard_clause_255_255_flow_action_nexusreader_web_program_cs_get_api_epub_ebookid_index_branch_255_255_evaluates-condition_255", + "from": "flow_action_nexusreader_web_program_cs_get_api_epub_ebookid_index_guard_clause_255_255", + "to": "flow_action_nexusreader_web_program_cs_get_api_epub_ebookid_index_branch_255_255", + "kind": "evaluates-condition", + "label": "Return Ok on success, BadRequest on failure", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 255, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 255 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_get_api_epub_ebookid_index_branch_255_255_flow_action_nexusreader_web_program_cs_get_api_epub_ebookid_index_return_258_258_returns_258", + "from": "flow_action_nexusreader_web_program_cs_get_api_epub_ebookid_index_branch_255_255", + "to": "flow_action_nexusreader_web_program_cs_get_api_epub_ebookid_index_return_258_258", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 258, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 258 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_265_invokes_265", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_method_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_265", + "kind": "handles-route", + "label": "KnowledgeApi POST /api/knowledge/ (GetKnowledge)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 265, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 265 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_265_flow_action_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_repository_read_267_267_invokes_267", + "from": "flow_method_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_265", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_repository_read_267_267", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 267, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 267 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_repository_read_267_267_flow_action_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_guard_clause_267_267_evaluates-condition_267", + "from": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_repository_read_267_267", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_guard_clause_267_267", + "kind": "evaluates-condition", + "label": "tenantId", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 267, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 267 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_guard_clause_267_267_flow_action_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_guard_clause_269_269_evaluates-condition_269", + "from": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_guard_clause_267_267", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_guard_clause_269_269", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 269, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 269 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_guard_clause_269_269_flow_action_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_branch_269_269_evaluates-condition_269", + "from": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_guard_clause_269_269", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_branch_269_269", + "kind": "evaluates-condition", + "label": "Return Ok or BadRequest based on result.IsSuccess", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 269, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 269 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_branch_269_269_flow_action_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_return_270_270_returns_270", + "from": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_branch_269_269", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_return_270_270", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 270, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 270 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_273_invokes_273", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_method_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_273", + "kind": "handles-route", + "label": "KnowledgeApi POST /graph (GetGraphDataAsync)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 273, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 273 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_273_flow_action_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_repository_read_275_275_invokes_275", + "from": "flow_method_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_273", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_repository_read_275_275", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 275, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 275 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_repository_read_275_275_flow_action_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_guard_clause_277_277_evaluates-condition_277", + "from": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_repository_read_275_275", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_guard_clause_277_277", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 277, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 277 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_guard_clause_277_277_flow_action_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_branch_277_277_evaluates-condition_277", + "from": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_guard_clause_277_277", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_branch_277_277", + "kind": "evaluates-condition", + "label": "Return Ok or BadRequest based on result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 277, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 277 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_branch_277_277_flow_action_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_return_278_278_returns_278", + "from": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_branch_277_277", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_return_278_278", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 278, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 278 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_281_invokes_281", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_method_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_281", + "kind": "handles-route", + "label": "KnowledgeApi POST /summary (GetSummaryAndQuizAsync)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 281, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 281 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_281_flow_action_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_repository_read_283_283_invokes_283", + "from": "flow_method_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_281", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_repository_read_283_283", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 283, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 283 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_repository_read_283_283_flow_action_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_guard_clause_285_285_evaluates-condition_285", + "from": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_repository_read_283_283", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_guard_clause_285_285", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 285, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 285 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_guard_clause_285_285_flow_action_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_branch_285_285_evaluates-condition_285", + "from": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_guard_clause_285_285", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_branch_285_285", + "kind": "evaluates-condition", + "label": "Return Ok or BadRequest based on result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 285, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 285 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_branch_285_285_flow_action_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_return_286_286_returns_286", + "from": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_branch_285_285", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_return_286_286", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 286, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 286 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_289_invokes_289", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_method_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_289", + "kind": "handles-route", + "label": "KnowledgeApi POST /map (GetKnowledgeMapAsync)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 289, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 289 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_289_flow_action_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_repository_read_291_291_invokes_291", + "from": "flow_method_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_289", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_repository_read_291_291", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 291, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 291 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_repository_read_291_291_flow_action_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_guard_clause_293_293_evaluates-condition_293", + "from": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_repository_read_291_291", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_guard_clause_293_293", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 293, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 293 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_guard_clause_293_293_flow_action_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_branch_293_293_evaluates-condition_293", + "from": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_guard_clause_293_293", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_branch_293_293", + "kind": "evaluates-condition", + "label": "Return Ok or BadRequest based on result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 293, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 293 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_branch_293_293_flow_action_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_return_294_294_returns_294", + "from": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_branch_293_293", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_return_294_294", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 294, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 294 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_297_invokes_297", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_method_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_297", + "kind": "handles-route", + "label": "KnowledgeApi POST /verify-groundedness", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 297, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 297 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_297_flow_action_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_repository_read_299_299_invokes_299", + "from": "flow_method_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_297", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_repository_read_299_299", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 299, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 299 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_repository_read_299_299_flow_action_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_guard_clause_301_301_evaluates-condition_301", + "from": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_repository_read_299_299", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_guard_clause_301_301", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 301, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 301 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_guard_clause_301_301_flow_action_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_branch_301_301_evaluates-condition_301", + "from": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_guard_clause_301_301", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_branch_301_301", + "kind": "evaluates-condition", + "label": "Return Ok or BadRequest based on verification result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 301, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 301 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_branch_301_301_flow_action_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_return_302_302_returns_302", + "from": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_branch_301_301", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_return_302_302", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 302, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 302 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_305_invokes_305", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_method_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_305", + "kind": "handles-route", + "label": "KnowledgeApi POST /search (SearchLibrarySemanticallyAsync)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 305, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 305 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_305_flow_action_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_repository_read_307_307_invokes_307", + "from": "flow_method_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_305", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_repository_read_307_307", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 307, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 307 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_repository_read_307_307_flow_action_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_guard_clause_309_309_evaluates-condition_309", + "from": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_repository_read_307_307", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_guard_clause_309_309", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 309, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 309 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_guard_clause_309_309_flow_action_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_branch_309_309_evaluates-condition_309", + "from": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_guard_clause_309_309", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_branch_309_309", + "kind": "evaluates-condition", + "label": "Return Ok or BadRequest based on result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 309, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 309 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_branch_309_309_flow_action_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_return_310_310_returns_310", + "from": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_branch_309_309", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_return_310_310", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 310, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 310 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_313_invokes_313", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_method_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_313", + "kind": "handles-route", + "label": "KnowledgeApi POST /ask (AskQuestionAsync)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 313, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 313 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_313_flow_action_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_repository_read_315_315_invokes_315", + "from": "flow_method_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_313", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_repository_read_315_315", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 315, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 315 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_repository_read_315_315_flow_action_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_guard_clause_317_317_evaluates-condition_317", + "from": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_repository_read_315_315", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_guard_clause_317_317", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 317, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 317 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_guard_clause_317_317_flow_action_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_branch_317_317_evaluates-condition_317", + "from": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_guard_clause_317_317", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_branch_317_317", + "kind": "evaluates-condition", + "label": "Return Ok or BadRequest based on result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 317, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 317 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_branch_317_317_flow_action_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_return_318_318_returns_318", + "from": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_branch_317_317", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_return_318_318", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 318, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 318 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_321_invokes_321", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_method_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_321", + "kind": "handles-route", + "label": "KnowledgeApi DELETE /api/knowledge/ (ClearCacheAsync)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 321, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 321 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_321_flow_action_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_branch_323_323_evaluates-condition_323", + "from": "flow_method_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_321", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_branch_323_323", + "kind": "evaluates-condition", + "label": "Return Ok on success; BadRequest with message on failure", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 323, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 323 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_branch_323_323_flow_action_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_guard_clause_324_324_evaluates-condition_324", + "from": "flow_action_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_branch_323_323", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_guard_clause_324_324", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 324, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 324 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_guard_clause_324_324_flow_action_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_return_327_327_returns_327", + "from": "flow_action_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_guard_clause_324_324", + "to": "flow_action_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_return_327_327", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 327, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 327 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_knowledgerequest_566_maps-dto_566", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_type_nexusreader_web_program_cs_knowledgerequest_566", + "kind": "maps-dto", + "label": "dto KnowledgeRequest", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 566, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 566 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_groundednessrequest_567_maps-dto_567", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_type_nexusreader_web_program_cs_groundednessrequest_567", + "kind": "maps-dto", + "label": "dto GroundednessRequest", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 567, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 567 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_semanticsearchrequest_568_maps-dto_568", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_type_nexusreader_web_program_cs_semanticsearchrequest_568", + "kind": "maps-dto", + "label": "dto SemanticSearchRequest", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 568, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 568 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_askquestionrequest_569_maps-dto_569", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_type_nexusreader_web_program_cs_askquestionrequest_569", + "kind": "maps-dto", + "label": "dto AskQuestionRequest", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 569, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 569 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_webplatformservice_47_registers-service_47", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_type_nexusreader_web_program_cs_webplatformservice_47", + "kind": "registers-service", + "label": "IPlatformService", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 47, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 47 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_knowledgecoordinator_55_registers-service_55", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_type_nexusreader_web_program_cs_knowledgecoordinator_55", + "kind": "registers-service", + "label": "KnowledgeCoordinator", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 55, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 55 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_httpclient_configured_with_base_address_58_registers-service_58", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_type_nexusreader_web_program_cs_httpclient_configured_with_base_address_58", + "kind": "registers-service", + "label": "HttpClient (named NexusAPI)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 58, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 58 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_nexusreader_application_assembly_extension_78_registers-service_78", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_type_nexusreader_web_program_cs_nexusreader_application_assembly_extension_78", + "kind": "registers-service", + "label": "Application services", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 78, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 78 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_nexusreader_infrastructure_assembly_extension_79_registers-service_79", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_type_nexusreader_web_program_cs_nexusreader_infrastructure_assembly_extension_79", + "kind": "registers-service", + "label": "Infrastructure services", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 79, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 79 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_identity_with_appdbcontext_107_registers-service_107", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_type_nexusreader_web_program_cs_identity_with_appdbcontext_107", + "kind": "registers-service", + "label": "Identity endpoints and EF stores", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 107, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 107 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_usehangfiredashboard_163_configures-pipeline_163", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_method_nexusreader_web_program_cs_usehangfiredashboard_163", + "kind": "configures-pipeline", + "label": "middleware", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 163, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 163 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_configure_request_pipeline_routing_auth_antiforgery_static_assets_hubs_225_configures-pipeline_225", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_method_nexusreader_web_program_cs_configure_request_pipeline_routing_auth_antiforgery_static_assets_hubs_225", + "kind": "configures-pipeline", + "label": "middleware", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 225, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 225 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_application_dtos_user_authordto_cs_file_1_flow_type_nexusreader_application_dtos_user_authordto_cs_authordto_3_maps-dto_3", + "from": "flow_file_nexusreader_application_dtos_user_authordto_cs_file_1", + "to": "flow_type_nexusreader_application_dtos_user_authordto_cs_authordto_3", + "kind": "maps-dto", + "label": "dto AuthorDto", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/DTOs/User/AuthorDto.cs", + "sourceLine": 3, + "evidencePaths": [ + "NexusReader.Application/DTOs/User/AuthorDto.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/DTOs/User/AuthorDto.cs", + "line": 3 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_application_security_authorization_prouserhandler_cs_file_1_flow_method_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_20_invokes_20", + "from": "flow_file_nexusreader_application_security_authorization_prouserhandler_cs_file_1", + "to": "flow_method_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_20", + "kind": "invokes", + "label": "HandleRequirementAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 20, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 20 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_20_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_guard_clause_24_24_evaluates-condition_24", + "from": "flow_method_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_20", + "to": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_guard_clause_24_24", + "kind": "evaluates-condition", + "label": "return (no auth decision)", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 24, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 24 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_guard_clause_24_24_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_repository_read_24_24_invokes_24", + "from": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_guard_clause_24_24", + "to": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_repository_read_24_24", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 24, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 24 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_repository_read_24_24_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_25_25_evaluates-condition_25", + "from": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_repository_read_24_24", + "to": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_25_25", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 25, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 25 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_25_25_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_return_27_27_returns_27", + "from": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_25_25", + "to": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_return_27_27", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 27, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 27 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_return_27_27_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_35_35_evaluates-condition_35", + "from": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_return_27_27", + "to": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_35_35", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 35, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 35 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_35_35_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_guard_clause_35_35_evaluates-condition_35", + "from": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_35_35", + "to": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_guard_clause_35_35", + "kind": "evaluates-condition", + "label": "return (no auth decision)", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 35, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 35 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_guard_clause_35_35_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_return_37_37_returns_37", + "from": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_guard_clause_35_35", + "to": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_return_37_37", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 37, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 37 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_return_37_37_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_40_40_evaluates-condition_40", + "from": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_return_37_37", + "to": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_40_40", + "kind": "evaluates-condition", + "label": "succeed requirement / continue", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 40, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 40 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_40_40_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_41_41_evaluates-condition_41", + "from": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_40_40", + "to": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_41_41", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 41, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 41 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_41_41_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_repository_read_43_43_invokes_43", + "from": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_41_41", + "to": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_repository_read_43_43", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 43, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 43 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_repository_read_43_43_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_return_44_44_returns_44", + "from": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_repository_read_43_43", + "to": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_return_44_44", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 44, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 44 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_return_44_44_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_47_47_evaluates-condition_47", + "from": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_return_44_44", + "to": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_47_47", + "kind": "evaluates-condition", + "label": "succeed requirement / deny/continue", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 47, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 47 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_47_47_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_48_48_evaluates-condition_48", + "from": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_47_47", + "to": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_48_48", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 48, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 48 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_48_48_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_repository_read_50_50_invokes_50", + "from": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_branch_48_48", + "to": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_repository_read_50_50", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 50, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 50 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_repository_read_50_50_flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_return_51_51_returns_51", + "from": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_repository_read_50_50", + "to": "flow_action_nexusreader_application_security_authorization_prouserhandler_cs_handlerequirementasync_return_51_51", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 51, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 51 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_application_security_authorization_prouserhandler_cs_file_1_flow_type_nexusreader_application_security_authorization_prouserhandler_cs_prouserhandler_11_defines-type_11", + "from": "flow_file_nexusreader_application_security_authorization_prouserhandler_cs_file_1", + "to": "flow_type_nexusreader_application_security_authorization_prouserhandler_cs_prouserhandler_11", + "kind": "defines-type", + "label": "model ProUserHandler", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "sourceLine": 11, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "line": 11 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_application_security_authorization_prouserrequirement_cs_file_1_flow_type_nexusreader_application_security_authorization_prouserrequirement_cs_prouserrequirement_8_defines-type_8", + "from": "flow_file_nexusreader_application_security_authorization_prouserrequirement_cs_file_1", + "to": "flow_type_nexusreader_application_security_authorization_prouserrequirement_cs_prouserrequirement_8", + "kind": "defines-type", + "label": "model ProUserRequirement", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "sourceLine": 8, + "evidencePaths": [ + "NexusReader.Application/Security/Authorization/ProUserRequirement.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "line": 8 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_domain_entities_author_cs_file_1_flow_type_nexusreader_domain_entities_author_cs_author_5_reads-entity_5", + "from": "flow_file_nexusreader_domain_entities_author_cs_file_1", + "to": "flow_type_nexusreader_domain_entities_author_cs_author_5", + "kind": "reads-entity", + "label": "entity Author", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Domain/Entities/Author.cs", + "sourceLine": 5, + "evidencePaths": [ + "NexusReader.Domain/Entities/Author.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Domain/Entities/Author.cs", + "line": 5 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_ui_shared_layout_authlayout_razor_file_1_flow_method_nexusreader_ui_shared_layout_authlayout_razor_authlayout_render_markup_1_invokes_1", + "from": "flow_file_nexusreader_ui_shared_layout_authlayout_razor_file_1", + "to": "flow_method_nexusreader_ui_shared_layout_authlayout_razor_authlayout_render_markup_1", + "kind": "invokes", + "label": "AuthLayout (render/markup)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.UI.Shared/Layout/AuthLayout.razor", + "sourceLine": 1, + "evidencePaths": [ + "NexusReader.UI.Shared/Layout/AuthLayout.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Layout/AuthLayout.razor", + "line": 1 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_handlers_authenticationheaderhandler_cs_file_1_flow_method_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_27_invokes_27", + "from": "flow_file_nexusreader_web_client_handlers_authenticationheaderhandler_cs_file_1", + "to": "flow_method_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_27", + "kind": "invokes", + "label": "SendAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 27, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 27 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_27_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_external_call_27_27_invokes_27", + "from": "flow_method_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_27", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_external_call_27_27", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 27, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 27 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_external_call_27_27_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_32_32_evaluates-condition_32", + "from": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_external_call_27_27", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_32_32", + "kind": "evaluates-condition", + "label": "isAuthEndpoint / notAuthEndpoint", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 32, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 32 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_32_32_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_39_39_evaluates-condition_39", + "from": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_32_32", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_39_39", + "kind": "evaluates-condition", + "label": "isTrustedHost / untrusted", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 39, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 39 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_39_39_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_guard_clause_45_45_evaluates-condition_45", + "from": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_39_39", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_guard_clause_45_45", + "kind": "evaluates-condition", + "label": "attached / skipped", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 45, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 45 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_guard_clause_45_45_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_45_45_evaluates-condition_45", + "from": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_guard_clause_45_45", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_45_45", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 45, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 45 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_45_45_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_48_48_evaluates-condition_48", + "from": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_45_45", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_48_48", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 48, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 48 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_48_48_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_external_call_55_55_invokes_55", + "from": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_48_48", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_external_call_55_55", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 55, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 55 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_external_call_55_55_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_58_58_evaluates-condition_58", + "from": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_external_call_55_55", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_58_58", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 58, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 58 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_58_58_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_guard_clause_69_69_evaluates-condition_69", + "from": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_58_58", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_guard_clause_69_69", + "kind": "evaluates-condition", + "label": "alreadyRefreshed / needsRefresh", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 69, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 69 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_guard_clause_69_69_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_69_69_evaluates-condition_69", + "from": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_guard_clause_69_69", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_69_69", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 69, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 69 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_69_69_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_fallback_73_73_falls-back_73", + "from": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_69_69", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_fallback_73_73", + "kind": "falls-back", + "label": "fallback", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 73, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 73 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_fallback_73_73_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_79_79_evaluates-condition_79", + "from": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_fallback_73_73", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_79_79", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 79, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 79 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_79_79_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_fallback_85_85_falls-back_85", + "from": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_79_79", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_fallback_85_85", + "kind": "falls-back", + "label": "fallback", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 85, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 85 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_fallback_85_85_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_fallback_85_85_falls-back_85", + "from": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_fallback_85_85", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_fallback_85_85", + "kind": "falls-back", + "label": "Logout on failed refresh", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 85, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 85 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_fallback_85_85_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_91_91_evaluates-condition_91", + "from": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_fallback_85_85", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_91_91", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 91, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 91 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_91_91_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_retry_91_91_retries_91", + "from": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_branch_91_91", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_retry_91_91", + "kind": "retries", + "label": "Retry original request with new token", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 91, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 91 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_retry_91_91_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_external_call_95_95_invokes_95", + "from": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_retry_91_91", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_external_call_95_95", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 95, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 95 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_external_call_95_95_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_return_95_95_returns_95", + "from": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_external_call_95_95", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_return_95_95", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 95, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 95 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_return_95_95_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_return_109_109_returns_109", + "from": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_return_95_95", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_return_109_109", + "kind": "returns", + "label": "Return response", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 109, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 109 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_return_109_109_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_return_109_109_returns_109", + "from": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_return_109_109", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_sendasync_return_109_109", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 109, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 109 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_handlers_authenticationheaderhandler_cs_file_1_flow_method_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_112_invokes_112", + "from": "flow_file_nexusreader_web_client_handlers_authenticationheaderhandler_cs_file_1", + "to": "flow_method_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_112", + "kind": "invokes", + "label": "CloneHttpRequestMessageAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 112, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 112 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_112_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_branch_119_119_evaluates-condition_119", + "from": "flow_method_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_112", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_branch_119_119", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 119, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 119 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_branch_119_119_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_loop_126_126_loops-to_126", + "from": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_branch_119_119", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_loop_126_126", + "kind": "loops-to", + "label": "var h in req.Content.Headers", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 126, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 126 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_loop_126_126_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_loop_132_132_loops-to_132", + "from": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_loop_126_126", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_loop_132_132", + "kind": "loops-to", + "label": "var h in req.Headers", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 132, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 132 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_loop_132_132_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_return_139_139_returns_139", + "from": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_loop_132_132", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_return_139_139", + "kind": "returns", + "label": "Return cloned request", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 139, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 139 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_return_139_139_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_return_139_139_returns_139", + "from": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_return_139_139", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_return_139_139", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 139, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 139 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_web_client_handlers_authenticationheaderhandler_cs_file_1_flow_type_nexusreader_web_client_handlers_authenticationheaderhandler_cs_authenticationheaderhandler_14_defines-type_14", + "from": "flow_file_nexusreader_web_client_handlers_authenticationheaderhandler_cs_file_1", + "to": "flow_type_nexusreader_web_client_handlers_authenticationheaderhandler_cs_authenticationheaderhandler_14", + "kind": "defines-type", + "label": "model AuthenticationHeaderHandler", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 14, + "evidencePaths": [ + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "line": 14 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_ui_shared_pages_account_login_razor_file_1_flow_method_nexusreader_ui_shared_pages_account_login_razor_oninitialized_110_invokes_110", + "from": "flow_file_nexusreader_ui_shared_pages_account_login_razor_file_1", + "to": "flow_method_nexusreader_ui_shared_pages_account_login_razor_oninitialized_110", + "kind": "invokes", + "label": "OnInitialized", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourceLine": 110, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Login.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "line": 110 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_ui_shared_pages_account_login_razor_oninitialized_110_flow_action_nexusreader_ui_shared_pages_account_login_razor_oninitialized_branch_112_112_evaluates-condition_112", + "from": "flow_method_nexusreader_ui_shared_pages_account_login_razor_oninitialized_110", + "to": "flow_action_nexusreader_ui_shared_pages_account_login_razor_oninitialized_branch_112_112", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourceLine": 112, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Login.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "line": 112 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_ui_shared_pages_account_login_razor_oninitialized_branch_112_112_flow_action_nexusreader_ui_shared_pages_account_login_razor_oninitialized_guard_clause_112_112_evaluates-condition_112", + "from": "flow_action_nexusreader_ui_shared_pages_account_login_razor_oninitialized_branch_112_112", + "to": "flow_action_nexusreader_ui_shared_pages_account_login_razor_oninitialized_guard_clause_112_112", + "kind": "evaluates-condition", + "label": "set _errorMessage / no-op", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourceLine": 112, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Login.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "line": 112 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_ui_shared_pages_account_login_razor_oninitialized_guard_clause_112_112_flow_action_nexusreader_ui_shared_pages_account_login_razor_oninitialized_branch_114_114_evaluates-condition_114", + "from": "flow_action_nexusreader_ui_shared_pages_account_login_razor_oninitialized_guard_clause_112_112", + "to": "flow_action_nexusreader_ui_shared_pages_account_login_razor_oninitialized_branch_114_114", + "kind": "evaluates-condition", + "label": "Map specific error codes to localized messages", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourceLine": 114, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Login.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "line": 114 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_ui_shared_pages_account_login_razor_file_1_flow_method_nexusreader_ui_shared_pages_account_login_razor_handlelogin_126_invokes_126", + "from": "flow_file_nexusreader_ui_shared_pages_account_login_razor_file_1", + "to": "flow_method_nexusreader_ui_shared_pages_account_login_razor_handlelogin_126", + "kind": "invokes", + "label": "HandleLogin", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourceLine": 126, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Login.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "line": 126 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_ui_shared_pages_account_login_razor_handlelogin_126_flow_action_nexusreader_ui_shared_pages_account_login_razor_handlelogin_branch_134_134_evaluates-condition_134", + "from": "flow_method_nexusreader_ui_shared_pages_account_login_razor_handlelogin_126", + "to": "flow_action_nexusreader_ui_shared_pages_account_login_razor_handlelogin_branch_134_134", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourceLine": 134, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Login.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "line": 134 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_ui_shared_pages_account_login_razor_handlelogin_branch_134_134_flow_action_nexusreader_ui_shared_pages_account_login_razor_handlelogin_fallback_139_139_falls-back_139", + "from": "flow_action_nexusreader_ui_shared_pages_account_login_razor_handlelogin_branch_134_134", + "to": "flow_action_nexusreader_ui_shared_pages_account_login_razor_handlelogin_fallback_139_139", + "kind": "falls-back", + "label": "fallback", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourceLine": 139, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Login.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "line": 139 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_ui_shared_pages_account_login_razor_handlelogin_fallback_139_139_flow_action_nexusreader_ui_shared_pages_account_login_razor_handlelogin_repository_read_141_141_invokes_141", + "from": "flow_action_nexusreader_ui_shared_pages_account_login_razor_handlelogin_fallback_139_139", + "to": "flow_action_nexusreader_ui_shared_pages_account_login_razor_handlelogin_repository_read_141_141", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourceLine": 141, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Login.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "line": 141 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_ui_shared_pages_account_login_razor_file_1_flow_method_nexusreader_ui_shared_pages_account_login_razor_handlegooglelogin_154_invokes_154", + "from": "flow_file_nexusreader_ui_shared_pages_account_login_razor_file_1", + "to": "flow_method_nexusreader_ui_shared_pages_account_login_razor_handlegooglelogin_154", + "kind": "invokes", + "label": "HandleGoogleLogin", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourceLine": 154, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Login.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "line": 154 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_ui_shared_pages_account_login_razor_file_1_flow_type_nexusreader_ui_shared_pages_account_login_razor_loginmodel_157_maps-dto_157", + "from": "flow_file_nexusreader_ui_shared_pages_account_login_razor_file_1", + "to": "flow_type_nexusreader_ui_shared_pages_account_login_razor_loginmodel_157", + "kind": "maps-dto", + "label": "dto LoginModel", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.UI.Shared/Pages/Account/Login.razor", + "sourceLine": 157, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Login.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Login.razor", + "line": 157 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_ui_shared_pages_account_profile_razor_file_1_flow_method_nexusreader_ui_shared_pages_account_profile_razor_oninitializedasync_111_invokes_111", + "from": "flow_file_nexusreader_ui_shared_pages_account_profile_razor_file_1", + "to": "flow_method_nexusreader_ui_shared_pages_account_profile_razor_oninitializedasync_111", + "kind": "invokes", + "label": "OnInitializedAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.UI.Shared/Pages/Account/Profile.razor", + "sourceLine": 111, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Profile.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "line": 111 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_ui_shared_pages_account_profile_razor_oninitializedasync_111_flow_action_nexusreader_ui_shared_pages_account_profile_razor_oninitializedasync_branch_114_114_evaluates-condition_114", + "from": "flow_method_nexusreader_ui_shared_pages_account_profile_razor_oninitializedasync_111", + "to": "flow_action_nexusreader_ui_shared_pages_account_profile_razor_oninitializedasync_branch_114_114", + "kind": "evaluates-condition", + "label": "set _profile / skip", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.UI.Shared/Pages/Account/Profile.razor", + "sourceLine": 114, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Profile.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "line": 114 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_ui_shared_pages_account_profile_razor_file_1_flow_method_nexusreader_ui_shared_pages_account_profile_razor_calculateprogress_121_invokes_121", + "from": "flow_file_nexusreader_ui_shared_pages_account_profile_razor_file_1", + "to": "flow_method_nexusreader_ui_shared_pages_account_profile_razor_calculateprogress_121", + "kind": "invokes", + "label": "CalculateProgress", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.UI.Shared/Pages/Account/Profile.razor", + "sourceLine": 121, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Profile.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "line": 121 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_ui_shared_pages_account_profile_razor_calculateprogress_121_flow_action_nexusreader_ui_shared_pages_account_profile_razor_calculateprogress_guard_clause_123_123_evaluates-condition_123", + "from": "flow_method_nexusreader_ui_shared_pages_account_profile_razor_calculateprogress_121", + "to": "flow_action_nexusreader_ui_shared_pages_account_profile_razor_calculateprogress_guard_clause_123_123", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.UI.Shared/Pages/Account/Profile.razor", + "sourceLine": 123, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Profile.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "line": 123 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_ui_shared_pages_account_profile_razor_calculateprogress_guard_clause_123_123_flow_action_nexusreader_ui_shared_pages_account_profile_razor_calculateprogress_return_125_125_returns_125", + "from": "flow_action_nexusreader_ui_shared_pages_account_profile_razor_calculateprogress_guard_clause_123_123", + "to": "flow_action_nexusreader_ui_shared_pages_account_profile_razor_calculateprogress_return_125_125", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.UI.Shared/Pages/Account/Profile.razor", + "sourceLine": 125, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Profile.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "line": 125 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_ui_shared_pages_account_profile_razor_file_1_flow_method_nexusreader_ui_shared_pages_account_profile_razor_handlelogout_133_invokes_133", + "from": "flow_file_nexusreader_ui_shared_pages_account_profile_razor_file_1", + "to": "flow_method_nexusreader_ui_shared_pages_account_profile_razor_handlelogout_133", + "kind": "invokes", + "label": "HandleLogout", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.UI.Shared/Pages/Account/Profile.razor", + "sourceLine": 133, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Profile.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "line": 133 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_ui_shared_pages_account_register_razor_file_1_flow_method_nexusreader_ui_shared_pages_account_register_razor_handleregister_84_invokes_84", + "from": "flow_file_nexusreader_ui_shared_pages_account_register_razor_file_1", + "to": "flow_method_nexusreader_ui_shared_pages_account_register_razor_handleregister_84", + "kind": "invokes", + "label": "HandleRegister", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.UI.Shared/Pages/Account/Register.razor", + "sourceLine": 84, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Register.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "line": 84 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_ui_shared_pages_account_register_razor_handleregister_84_flow_action_nexusreader_ui_shared_pages_account_register_razor_handleregister_branch_92_92_evaluates-condition_92", + "from": "flow_method_nexusreader_ui_shared_pages_account_register_razor_handleregister_84", + "to": "flow_action_nexusreader_ui_shared_pages_account_register_razor_handleregister_branch_92_92", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.UI.Shared/Pages/Account/Register.razor", + "sourceLine": 92, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Register.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "line": 92 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_ui_shared_pages_account_register_razor_handleregister_branch_92_92_flow_action_nexusreader_ui_shared_pages_account_register_razor_handleregister_branch_95_95_evaluates-condition_95", + "from": "flow_action_nexusreader_ui_shared_pages_account_register_razor_handleregister_branch_92_92", + "to": "flow_action_nexusreader_ui_shared_pages_account_register_razor_handleregister_branch_95_95", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.UI.Shared/Pages/Account/Register.razor", + "sourceLine": 95, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Register.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "line": 95 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_ui_shared_pages_account_register_razor_handleregister_branch_95_95_flow_action_nexusreader_ui_shared_pages_account_register_razor_handleregister_fallback_100_100_falls-back_100", + "from": "flow_action_nexusreader_ui_shared_pages_account_register_razor_handleregister_branch_95_95", + "to": "flow_action_nexusreader_ui_shared_pages_account_register_razor_handleregister_fallback_100_100", + "kind": "falls-back", + "label": "fallback", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.UI.Shared/Pages/Account/Register.razor", + "sourceLine": 100, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Register.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "line": 100 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_ui_shared_pages_account_register_razor_handleregister_fallback_100_100_flow_action_nexusreader_ui_shared_pages_account_register_razor_handleregister_fallback_105_105_falls-back_105", + "from": "flow_action_nexusreader_ui_shared_pages_account_register_razor_handleregister_fallback_100_100", + "to": "flow_action_nexusreader_ui_shared_pages_account_register_razor_handleregister_fallback_105_105", + "kind": "falls-back", + "label": "fallback", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.UI.Shared/Pages/Account/Register.razor", + "sourceLine": 105, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Register.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "line": 105 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_ui_shared_pages_account_register_razor_handleregister_fallback_105_105_flow_action_nexusreader_ui_shared_pages_account_register_razor_handleregister_repository_read_107_107_invokes_107", + "from": "flow_action_nexusreader_ui_shared_pages_account_register_razor_handleregister_fallback_105_105", + "to": "flow_action_nexusreader_ui_shared_pages_account_register_razor_handleregister_repository_read_107_107", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.UI.Shared/Pages/Account/Register.razor", + "sourceLine": 107, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Register.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "line": 107 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_ui_shared_pages_account_register_razor_file_1_flow_type_nexusreader_ui_shared_pages_account_register_razor_registermodel_120_maps-dto_120", + "from": "flow_file_nexusreader_ui_shared_pages_account_register_razor_file_1", + "to": "flow_type_nexusreader_ui_shared_pages_account_register_razor_registermodel_120", + "kind": "maps-dto", + "label": "dto RegisterModel", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.UI.Shared/Pages/Account/Register.razor", + "sourceLine": 120, + "evidencePaths": [ + "NexusReader.UI.Shared/Pages/Account/Register.razor" + ], + "evidenceReferences": [ + { + "path": "NexusReader.UI.Shared/Pages/Account/Register.razor", + "line": 120 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_application_abstractions_messaging_icommand_cs_file_1_flow_type_nexusreader_application_abstractions_messaging_icommand_cs_icommand_6_defines-type_6", + "from": "flow_file_nexusreader_application_abstractions_messaging_icommand_cs_file_1", + "to": "flow_type_nexusreader_application_abstractions_messaging_icommand_cs_icommand_6", + "kind": "defines-type", + "label": "interface ICommand", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "sourceLine": 6, + "evidencePaths": [ + "NexusReader.Application/Abstractions/Messaging/ICommand.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "line": 6 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_application_abstractions_messaging_icommand_cs_file_1_flow_type_nexusreader_application_abstractions_messaging_icommand_cs_icommand_tresponse_10_defines-type_10", + "from": "flow_file_nexusreader_application_abstractions_messaging_icommand_cs_file_1", + "to": "flow_type_nexusreader_application_abstractions_messaging_icommand_cs_icommand_tresponse_10", + "kind": "defines-type", + "label": "interface ICommand", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "sourceLine": 10, + "evidencePaths": [ + "NexusReader.Application/Abstractions/Messaging/ICommand.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "line": 10 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_application_abstractions_messaging_icommandhandler_cs_file_1_flow_type_nexusreader_application_abstractions_messaging_icommandhandler_cs_icommandhandler_tcommand_6_defines-type_6", + "from": "flow_file_nexusreader_application_abstractions_messaging_icommandhandler_cs_file_1", + "to": "flow_type_nexusreader_application_abstractions_messaging_icommandhandler_cs_icommandhandler_tcommand_6", + "kind": "defines-type", + "label": "interface ICommandHandler", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "sourceLine": 6, + "evidencePaths": [ + "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "line": 6 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_application_abstractions_messaging_icommandhandler_cs_file_1_flow_type_nexusreader_application_abstractions_messaging_icommandhandler_cs_icommandhandler_tcommand_tresponse_11_defines-type_11", + "from": "flow_file_nexusreader_application_abstractions_messaging_icommandhandler_cs_file_1", + "to": "flow_type_nexusreader_application_abstractions_messaging_icommandhandler_cs_icommandhandler_tcommand_tresponse_11", + "kind": "defines-type", + "label": "interface ICommandHandler", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "sourceLine": 11, + "evidencePaths": [ + "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "line": 11 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_application_abstractions_messaging_iquery_cs_file_1_flow_type_nexusreader_application_abstractions_messaging_iquery_cs_iquery_tresponse_6_defines-type_6", + "from": "flow_file_nexusreader_application_abstractions_messaging_iquery_cs_file_1", + "to": "flow_type_nexusreader_application_abstractions_messaging_iquery_cs_iquery_tresponse_6", + "kind": "defines-type", + "label": "interface IQuery", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "sourceLine": 6, + "evidencePaths": [ + "NexusReader.Application/Abstractions/Messaging/IQuery.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "line": 6 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_application_dependencyinjection_cs_file_1_flow_method_nexusreader_application_dependencyinjection_cs_addapplication_8_invokes_8", + "from": "flow_file_nexusreader_application_dependencyinjection_cs_file_1", + "to": "flow_method_nexusreader_application_dependencyinjection_cs_addapplication_8", + "kind": "invokes", + "label": "AddApplication", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/DependencyInjection.cs", + "sourceLine": 8, + "evidencePaths": [ + "NexusReader.Application/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/DependencyInjection.cs", + "line": 8 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_application_dependencyinjection_cs_addapplication_8_flow_action_nexusreader_application_dependencyinjection_cs_addapplication_return_13_13_returns_13", + "from": "flow_method_nexusreader_application_dependencyinjection_cs_addapplication_8", + "to": "flow_action_nexusreader_application_dependencyinjection_cs_addapplication_return_13_13", + "kind": "returns", + "label": "Return IServiceCollection", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/DependencyInjection.cs", + "sourceLine": 13, + "evidencePaths": [ + "NexusReader.Application/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/DependencyInjection.cs", + "line": 13 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_application_dependencyinjection_cs_addapplication_return_13_13_flow_action_nexusreader_application_dependencyinjection_cs_addapplication_return_13_13_returns_13", + "from": "flow_action_nexusreader_application_dependencyinjection_cs_addapplication_return_13_13", + "to": "flow_action_nexusreader_application_dependencyinjection_cs_addapplication_return_13_13", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/DependencyInjection.cs", + "sourceLine": 13, + "evidencePaths": [ + "NexusReader.Application/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/DependencyInjection.cs", + "line": 13 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_application_dependencyinjection_cs_file_1_flow_type_nexusreader_application_dependencyinjection_cs_configured_via_addmapsterconfiguration_extension_10_registers-service_10", + "from": "flow_file_nexusreader_application_dependencyinjection_cs_file_1", + "to": "flow_type_nexusreader_application_dependencyinjection_cs_configured_via_addmapsterconfiguration_extension_10", + "kind": "registers-service", + "label": "Mapster configuration / mapping profiles", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/DependencyInjection.cs", + "sourceLine": 10, + "evidencePaths": [ + "NexusReader.Application/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/DependencyInjection.cs", + "line": 10 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_application_dependencyinjection_cs_file_1_flow_type_nexusreader_application_dependencyinjection_cs_handlers_discovered_in_this_assembly_11_registers-service_11", + "from": "flow_file_nexusreader_application_dependencyinjection_cs_file_1", + "to": "flow_type_nexusreader_application_dependencyinjection_cs_handlers_discovered_in_this_assembly_11", + "kind": "registers-service", + "label": "MediatR handlers (from this assembly)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/DependencyInjection.cs", + "sourceLine": 11, + "evidencePaths": [ + "NexusReader.Application/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/DependencyInjection.cs", + "line": 11 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1_flow_method_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_31_invokes_31", + "from": "flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_31", + "kind": "invokes", + "label": "AddInfrastructure", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 31, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 31 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_31_flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_33_33_evaluates-condition_33", + "from": "flow_method_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_31", + "to": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_33_33", + "kind": "evaluates-condition", + "label": "Selects DB provider", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 33, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 33 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_33_33_flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_34_34_evaluates-condition_34", + "from": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_33_33", + "to": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_34_34", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 34, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 34 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_34_34_flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_fallback_44_44_falls-back_44", + "from": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_34_34", + "to": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_fallback_44_44", + "kind": "falls-back", + "label": "fallback", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 44, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 44 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_fallback_44_44_flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_64_64_evaluates-condition_64", + "from": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_fallback_44_44", + "to": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_64_64", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 64, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 64 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_64_64_flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_76_76_evaluates-condition_76", + "from": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_64_64", + "to": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_76_76", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 76, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 76 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_76_76_flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_return_134_134_returns_134", + "from": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_76_76", + "to": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_return_134_134", + "kind": "returns", + "label": "Returns IServiceCollection", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 134, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 134 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_return_134_134_flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_return_134_134_returns_134", + "from": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_return_134_134", + "to": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_return_134_134", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 134, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 134 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_76_76_flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1_uses-service_112", + "from": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_76_76", + "to": "flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1", + "kind": "uses-service", + "label": "KnowledgeService (implementation)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 112, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 112 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_76_76_flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1_uses-service_113", + "from": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_76_76", + "to": "flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1", + "kind": "uses-service", + "label": "EpubReaderService (implementation)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 113, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 113 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_76_76_flow_file_nexusreader_infrastructure_services_epubmetadataextractor_cs_file_1_uses-service_114", + "from": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_76_76", + "to": "flow_file_nexusreader_infrastructure_services_epubmetadataextractor_cs_file_1", + "kind": "uses-service", + "label": "EpubMetadataExtractor (implementation)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 114, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 114 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_76_76_flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1_uses-service_118", + "from": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_76_76", + "to": "flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1", + "kind": "uses-service", + "label": "BookStorageService (implementation)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 118, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 118 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_76_76_flow_file_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_file_1_calls-external_124", + "from": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_branch_76_76", + "to": "flow_file_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_file_1", + "kind": "calls-external", + "label": "SignalRSyncBroadcaster (implementation)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 124, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 124 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1_flow_method_nexusreader_infrastructure_dependencyinjection_cs_assembly_137_invokes_137", + "from": "flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_dependencyinjection_cs_assembly_137", + "kind": "invokes", + "label": "Assembly", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 137, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 137 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_dependencyinjection_cs_assembly_137_flow_action_nexusreader_infrastructure_dependencyinjection_cs_assembly_return_137_137_returns_137", + "from": "flow_method_nexusreader_infrastructure_dependencyinjection_cs_assembly_137", + "to": "flow_action_nexusreader_infrastructure_dependencyinjection_cs_assembly_return_137_137", + "kind": "returns", + "label": "Return assembly", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 137, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 137 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1_flow_type_nexusreader_infrastructure_dependencyinjection_cs_iinfrastructuremarker_140_defines-type_140", + "from": "flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1", + "to": "flow_type_nexusreader_infrastructure_dependencyinjection_cs_iinfrastructuremarker_140", + "kind": "defines-type", + "label": "interface IInfrastructureMarker", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 140, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 140 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1_flow_type_nexusreader_infrastructure_dependencyinjection_cs_infrastructuremarker_141_defines-type_141", + "from": "flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1", + "to": "flow_type_nexusreader_infrastructure_dependencyinjection_cs_infrastructuremarker_141", + "kind": "defines-type", + "label": "model InfrastructureMarker", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 141, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 141 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1_flow_type_nexusreader_infrastructure_dependencyinjection_cs_appdbcontext_36_registers-service_36", + "from": "flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1", + "to": "flow_type_nexusreader_infrastructure_dependencyinjection_cs_appdbcontext_36", + "kind": "registers-service", + "label": "AppDbContext (DbContextFactory)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 36, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 36 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1_flow_type_nexusreader_infrastructure_dependencyinjection_cs_appdbcontext_41_registers-service_41", + "from": "flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1", + "to": "flow_type_nexusreader_infrastructure_dependencyinjection_cs_appdbcontext_41", + "kind": "registers-service", + "label": "AppDbContext (DbContext)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 41, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 41 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1_flow_type_nexusreader_infrastructure_dependencyinjection_cs_appdbcontext_47_registers-service_47", + "from": "flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1", + "to": "flow_type_nexusreader_infrastructure_dependencyinjection_cs_appdbcontext_47", + "kind": "registers-service", + "label": "AppDbContext (DbContextFactory)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 47, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 47 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1_flow_type_nexusreader_infrastructure_dependencyinjection_cs_appdbcontext_51_registers-service_51", + "from": "flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1", + "to": "flow_type_nexusreader_infrastructure_dependencyinjection_cs_appdbcontext_51", + "kind": "registers-service", + "label": "AppDbContext (DbContext)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 51, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 51 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1_flow_type_nexusreader_infrastructure_dependencyinjection_cs_qdrantclient_57_registers-service_57", + "from": "flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1", + "to": "flow_type_nexusreader_infrastructure_dependencyinjection_cs_qdrantclient_57", + "kind": "registers-service", + "label": "QdrantClient", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 57, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 57 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1_flow_type_nexusreader_infrastructure_dependencyinjection_cs_neo4j_driver_graphdatabase_driver_61_registers-service_61", + "from": "flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1", + "to": "flow_type_nexusreader_infrastructure_dependencyinjection_cs_neo4j_driver_graphdatabase_driver_61", + "kind": "registers-service", + "label": "IDriver", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 61, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 61 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1_flow_type_nexusreader_infrastructure_dependencyinjection_cs_hangfire_postgres_storage_66_registers-service_66", + "from": "flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1", + "to": "flow_type_nexusreader_infrastructure_dependencyinjection_cs_hangfire_postgres_storage_66", + "kind": "registers-service", + "label": "Hangfire (storage/server)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 66, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 66 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1_flow_type_nexusreader_infrastructure_dependencyinjection_cs_geminichatclient_99_registers-service_99", + "from": "flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1", + "to": "flow_type_nexusreader_infrastructure_dependencyinjection_cs_geminichatclient_99", + "kind": "registers-service", + "label": "ChatClient / GeminiChatClient", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 99, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 99 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1_flow_type_nexusreader_infrastructure_dependencyinjection_cs_geminiembeddinggenerator_105_registers-service_105", + "from": "flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1", + "to": "flow_type_nexusreader_infrastructure_dependencyinjection_cs_geminiembeddinggenerator_105", + "kind": "registers-service", + "label": "EmbeddingGenerator / GeminiEmbeddingGenerator", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 105, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 105 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1_flow_type_nexusreader_infrastructure_dependencyinjection_cs_knowledgeservice_112_registers-service_112", + "from": "flow_file_nexusreader_infrastructure_dependencyinjection_cs_file_1", + "to": "flow_type_nexusreader_infrastructure_dependencyinjection_cs_knowledgeservice_112", + "kind": "registers-service", + "label": "IKnowledgeService", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 112, + "evidencePaths": [ + "NexusReader.Infrastructure/DependencyInjection.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/DependencyInjection.cs", + "line": 112 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1_flow_method_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_19_invokes_19", + "from": "flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_19", + "kind": "handles-route", + "label": "UpdateProgress", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 19, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 19 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_19_flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_repository_read_21_21_invokes_21", + "from": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_19", + "to": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_repository_read_21_21", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 21, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 21 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_repository_read_21_21_flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_guard_clause_21_21_evaluates-condition_21", + "from": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_repository_read_21_21", + "to": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_guard_clause_21_21", + "kind": "evaluates-condition", + "label": "forward command / no-op", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 21, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 21 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_guard_clause_21_21_flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_branch_22_22_evaluates-condition_22", + "from": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_guard_clause_21_21", + "to": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_branch_22_22", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 22, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 22 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_branch_22_22_flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_repository_read_24_24_invokes_24", + "from": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_branch_22_22", + "to": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_repository_read_24_24", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 24, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 24 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_repository_read_24_24_flow_file_nexusreader_application_commands_sync_updatereadingprogresscommand_cs_file_1_dispatches-command_24", + "from": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_repository_read_24_24", + "to": "flow_file_nexusreader_application_commands_sync_updatereadingprogresscommand_cs_file_1", + "kind": "dispatches-command", + "label": "UpdateReadingProgressCommand (ctor)", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 24, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 24 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1_flow_method_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_28_invokes_28", + "from": "flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_28", + "kind": "handles-route", + "label": "OnConnectedAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 28, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 28 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_28_flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_repository_read_30_30_invokes_30", + "from": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_28", + "to": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_repository_read_30_30", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 30, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 30 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_repository_read_30_30_flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_branch_31_31_evaluates-condition_31", + "from": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_repository_read_30_30", + "to": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_branch_31_31", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 31, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 31 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_branch_31_31_flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_guard_clause_31_31_evaluates-condition_31", + "from": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_branch_31_31", + "to": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_guard_clause_31_31", + "kind": "evaluates-condition", + "label": "AddToGroup / skip", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 31, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 31 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_guard_clause_31_31_flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_repository_read_33_33_invokes_33", + "from": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_guard_clause_31_31", + "to": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_repository_read_33_33", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 33, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 33 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1_flow_method_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_38_invokes_38", + "from": "flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_38", + "kind": "handles-route", + "label": "OnDisconnectedAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 38, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 38 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_38_flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_repository_read_40_40_invokes_40", + "from": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_38", + "to": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_repository_read_40_40", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 40, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 40 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_repository_read_40_40_flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_branch_41_41_evaluates-condition_41", + "from": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_repository_read_40_40", + "to": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_branch_41_41", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 41, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 41 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_branch_41_41_flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_guard_clause_41_41_evaluates-condition_41", + "from": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_branch_41_41", + "to": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_guard_clause_41_41", + "kind": "evaluates-condition", + "label": "RemoveFromGroup / skip", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 41, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 41 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_guard_clause_41_41_flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_repository_read_43_43_invokes_43", + "from": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_guard_clause_41_41", + "to": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_repository_read_43_43", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 43, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 43 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1_flow_type_nexusreader_infrastructure_realtime_synchub_cs_synchub_10_defines-type_10", + "from": "flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1", + "to": "flow_type_nexusreader_infrastructure_realtime_synchub_cs_synchub_10", + "kind": "defines-type", + "label": "model SyncHub", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 10, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SyncHub.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "line": 10 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1_flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_knowledgeservice_38_invokes_38", + "from": "flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_knowledgeservice_38", + "kind": "invokes", + "label": "KnowledgeService", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 38, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 38 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1_flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeasync_61_invokes_61", + "from": "flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeasync_61", + "kind": "invokes", + "label": "GetKnowledgeAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 61, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 61 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeasync_61_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeasync_return_63_63_returns_63", + "from": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeasync_61", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeasync_return_63_63", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 63, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 63 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1_flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getgraphdataasync_66_invokes_66", + "from": "flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getgraphdataasync_66", + "kind": "invokes", + "label": "GetGraphDataAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 66, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 66 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getgraphdataasync_66_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getgraphdataasync_return_68_68_returns_68", + "from": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getgraphdataasync_66", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getgraphdataasync_return_68_68", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 68, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 68 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1_flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getsummaryandquizasync_71_invokes_71", + "from": "flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getsummaryandquizasync_71", + "kind": "invokes", + "label": "GetSummaryAndQuizAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 71, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 71 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getsummaryandquizasync_71_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getsummaryandquizasync_return_73_73_returns_73", + "from": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getsummaryandquizasync_71", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getsummaryandquizasync_return_73_73", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 73, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 73 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1_flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgemapasync_76_invokes_76", + "from": "flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgemapasync_76", + "kind": "invokes", + "label": "GetKnowledgeMapAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 76, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 76 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgemapasync_76_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgemapasync_return_78_78_returns_78", + "from": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgemapasync_76", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgemapasync_return_78_78", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 78, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 78 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1_flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_81_invokes_81", + "from": "flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_81", + "kind": "invokes", + "label": "GetKnowledgeInternalAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 81, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 81 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_81_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_guard_clause_83_83_evaluates-condition_83", + "from": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_81", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_guard_clause_83_83", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 83, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 83 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_guard_clause_83_83_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_branch_93_93_evaluates-condition_93", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_guard_clause_83_83", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_branch_93_93", + "kind": "evaluates-condition", + "label": "Cache hit path", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 93, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 93 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_branch_93_93_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_guard_clause_99_99_evaluates-condition_99", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_branch_93_93", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_guard_clause_99_99", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 99, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 99 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_guard_clause_99_99_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_log_103_103_invokes_103", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_guard_clause_99_99", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_log_103_103", + "kind": "invokes", + "label": "Logs runtime state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 103, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 103 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_log_103_103_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_branch_122_122_evaluates-condition_122", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_log_103_103", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_branch_122_122", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 122, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 122 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_branch_122_122_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_return_127_127_returns_127", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_branch_122_122", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_return_127_127", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 127, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 127 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1_flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_140_invokes_140", + "from": "flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_140", + "kind": "invokes", + "label": "ExecuteAiRequestAndCacheAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 140, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 140 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_140_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_validation_166_166_evaluates-condition_166", + "from": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_140", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_validation_166_166", + "kind": "evaluates-condition", + "label": "Rejects empty AI response", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 166, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 166 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_validation_166_166_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_guard_clause_167_167_evaluates-condition_167", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_validation_166_166", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_guard_clause_167_167", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 167, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 167 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_guard_clause_167_167_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_guard_clause_176_176_evaluates-condition_176", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_guard_clause_167_167", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_guard_clause_176_176", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 176, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 176 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_guard_clause_176_176_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_branch_193_193_evaluates-condition_193", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_guard_clause_176_176", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_branch_193_193", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 193, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 193 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_branch_193_193_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_repository_write_193_193_invokes_193", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_branch_193_193", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_repository_write_193_193", + "kind": "invokes", + "label": "Writes repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 193, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 193 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_repository_write_193_193_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_fallback_194_194_falls-back_194", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_repository_write_193_193", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_fallback_194_194", + "kind": "falls-back", + "label": "fallback", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 194, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 194 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_fallback_194_194_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_return_205_205_returns_205", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_fallback_194_194", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_return_205_205", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 205, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 205 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_return_205_205_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_log_209_209_invokes_209", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_return_205_205", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_log_209_209", + "kind": "invokes", + "label": "Logs runtime state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 209, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 209 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_log_209_209_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_return_210_210_returns_210", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_log_209_209", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_return_210_210", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 210, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 210 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_return_210_210_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_return_215_215_returns_215", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_return_210_210", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_executeairequestandcacheasync_return_215_215", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 215, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 215 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1_flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_225_invokes_225", + "from": "flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_225", + "kind": "invokes", + "label": "ProcessKnowledgeUnitsAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 225, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 225 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_225_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_repository_read_235_235_invokes_235", + "from": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_225", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_repository_read_235_235", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 235, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 235 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_repository_read_235_235_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_loop_240_240_loops-to_240", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_repository_read_235_235", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_loop_240_240", + "kind": "loops-to", + "label": "var unitDto in packet.Units", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 240, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 240 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_loop_240_240_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_loop_240_240_loops-to_240", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_loop_240_240", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_loop_240_240", + "kind": "loops-to", + "label": "Upserts units from packet", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 240, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 240 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_loop_240_240_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_branch_245_245_evaluates-condition_245", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_loop_240_240", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_branch_245_245", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 245, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 245 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_branch_245_245_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_repository_write_248_248_invokes_248", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_branch_245_245", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_repository_write_248_248", + "kind": "invokes", + "label": "Writes repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 248, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 248 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_repository_write_248_248_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_loop_266_266_loops-to_266", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_repository_write_248_248", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_loop_266_266", + "kind": "loops-to", + "label": "Maps links to KnowledgeUnitLink entities", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 266, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 266 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_loop_266_266_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_loop_266_266_loops-to_266", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_loop_266_266", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_loop_266_266", + "kind": "loops-to", + "label": "var linkDto in packet.Links", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 266, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 266 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_loop_266_266_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_branch_271_271_evaluates-condition_271", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_loop_266_266", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_branch_271_271", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 271, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 271 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_branch_271_271_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_repository_write_281_281_invokes_281", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_branch_271_271", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_repository_write_281_281", + "kind": "invokes", + "label": "Writes repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 281, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 281 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_repository_write_281_281_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_fallback_283_283_falls-back_283", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_repository_write_281_281", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_fallback_283_283", + "kind": "falls-back", + "label": "fallback", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 283, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 283 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_fallback_283_283_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_log_285_285_invokes_285", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_fallback_283_283", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_processknowledgeunitsasync_log_285_285", + "kind": "invokes", + "label": "Logs runtime state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 285, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 285 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1_flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_verifygroundednessasync_290_invokes_290", + "from": "flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_verifygroundednessasync_290", + "kind": "invokes", + "label": "VerifyGroundednessAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 290, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 290 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_verifygroundednessasync_290_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_verifygroundednessasync_return_295_295_returns_295", + "from": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_verifygroundednessasync_290", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_verifygroundednessasync_return_295_295", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 295, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 295 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_verifygroundednessasync_return_295_295_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_verifygroundednessasync_return_320_320_returns_320", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_verifygroundednessasync_return_295_295", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_verifygroundednessasync_return_320_320", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 320, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 320 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_verifygroundednessasync_return_320_320_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_verifygroundednessasync_return_324_324_returns_324", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_verifygroundednessasync_return_320_320", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_verifygroundednessasync_return_324_324", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 324, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 324 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1_flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_328_invokes_328", + "from": "flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_328", + "kind": "invokes", + "label": "GetRelevantContextAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 328, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 328 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_328_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_336_336_invokes_336", + "from": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_328", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_336_336", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 336, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 336 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_336_336_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_337_337_invokes_337", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_336_336", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_337_337", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 337, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 337 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_337_337_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_339_339_invokes_339", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_337_337", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_339_339", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 339, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 339 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_339_339_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_342_342_invokes_342", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_339_339", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_342_342", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 342, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 342 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_342_342_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_345_345_invokes_345", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_342_342", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_345_345", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 345, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 345 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_345_345_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_347_347_invokes_347", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_345_345", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_347_347", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 347, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 347 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_347_347_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_350_350_invokes_350", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_347_347", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_350_350", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 350, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 350 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_350_350_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_354_354_invokes_354", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_350_350", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_354_354", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 354, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 354 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_354_354_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_368_368_invokes_368", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_354_354", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_368_368", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 368, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 368 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_368_368_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_return_377_377_returns_377", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_external_call_368_368", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_return_377_377", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 377, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 377 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_return_377_377_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_return_381_381_returns_381", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_return_377_377", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getrelevantcontextasync_return_381_381", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 381, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 381 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1_flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_385_invokes_385", + "from": "flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_385", + "kind": "invokes", + "label": "SearchLibrarySemanticallyAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 385, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 385 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_385_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_399_399_invokes_399", + "from": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_385", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_399_399", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 399, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 399 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_399_399_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_400_400_invokes_400", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_399_399", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_400_400", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 400, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 400 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_400_400_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_402_402_invokes_402", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_400_400", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_402_402", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 402, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 402 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_402_402_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_405_405_invokes_405", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_402_402", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_405_405", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 405, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 405 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_405_405_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_408_408_invokes_408", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_405_405", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_408_408", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 408, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 408 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_408_408_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_410_410_invokes_410", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_408_408", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_410_410", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 410, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 410 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_410_410_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_413_413_invokes_413", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_410_410", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_413_413", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 413, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 413 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_413_413_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_417_417_invokes_417", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_413_413", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_417_417", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 417, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 417 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_417_417_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_log_431_431_invokes_431", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_417_417", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_log_431_431", + "kind": "invokes", + "label": "Logs runtime state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 431, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 431 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_log_431_431_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_432_432_invokes_432", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_log_431_431", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_432_432", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 432, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 432 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_432_432_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_435_435_evaluates-condition_435", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_external_call_432_432", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_435_435", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 435, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 435 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_435_435_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_437_437_returns_437", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_435_435", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_437_437", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 437, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 437 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_437_437_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_444_444_evaluates-condition_444", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_437_437", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_444_444", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 444, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 444 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_444_444_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_452_452_returns_452", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_444_444", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_452_452", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 452, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 452 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_452_452_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_457_457_returns_457", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_452_452", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_457_457", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 457, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 457 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_457_457_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_loop_460_460_loops-to_460", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_457_457", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_loop_460_460", + "kind": "loops-to", + "label": "var record in neoResult", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 460, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 460 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_loop_460_460_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_464_464_evaluates-condition_464", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_loop_460_460", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_464_464", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 464, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 464 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_464_464_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_log_473_473_invokes_473", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_464_464", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_log_473_473", + "kind": "invokes", + "label": "Logs runtime state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 473, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 473 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_log_473_473_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_repository_read_479_479_invokes_479", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_log_473_473", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_repository_read_479_479", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 479, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 479 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_repository_read_479_479_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_485_485_evaluates-condition_485", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_repository_read_479_479", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_485_485", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 485, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 485 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_485_485_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_repository_read_489_489_invokes_489", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_485_485", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_repository_read_489_489", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 489, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 489 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_repository_read_489_489_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_501_501_evaluates-condition_501", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_repository_read_489_489", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_501_501", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 501, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 501 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_501_501_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_507_507_evaluates-condition_507", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_501_501", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_507_507", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 507, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 507 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_507_507_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_513_513_evaluates-condition_513", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_507_507", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_513_513", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 513, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 513 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_513_513_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_533_533_evaluates-condition_533", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_513_513", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_533_533", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 533, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 533 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_533_533_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_538_538_returns_538", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_branch_533_533", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_538_538", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 538, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 538 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_538_538_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_541_541_returns_541", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_538_538", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_541_541", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 541, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 541 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_541_541_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_545_545_returns_545", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_541_541", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_searchlibrarysemanticallyasync_return_545_545", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 545, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 545 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1_flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_549_invokes_549", + "from": "flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_549", + "kind": "invokes", + "label": "AskQuestionAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 549, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 549 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_549_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_568_568_invokes_568", + "from": "flow_method_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_549", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_568_568", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 568, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 568 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_568_568_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_571_571_invokes_571", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_568_568", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_571_571", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 571, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 571 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_571_571_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_572_572_invokes_572", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_571_571", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_572_572", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 572, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 572 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_572_572_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_574_574_invokes_574", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_572_572", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_574_574", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 574, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 574 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_574_574_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_577_577_invokes_577", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_574_574", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_577_577", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 577, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 577 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_577_577_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_580_580_invokes_580", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_577_577", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_580_580", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 580, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 580 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_580_580_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_582_582_invokes_582", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_580_580", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_582_582", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 582, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 582 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_582_582_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_585_585_invokes_585", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_582_582", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_585_585", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 585, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 585 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_585_585_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_588_588_invokes_588", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_585_585", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_588_588", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 588, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 588 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_588_588_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_590_590_evaluates-condition_590", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_588_588", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_590_590", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 590, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 590 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_590_590_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_592_592_invokes_592", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_590_590", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_592_592", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 592, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 592 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_592_592_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_594_594_invokes_594", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_592_592", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_594_594", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 594, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 594 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_594_594_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_597_597_invokes_597", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_594_594", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_597_597", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 597, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 597 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_597_597_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_602_602_invokes_602", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_597_597", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_602_602", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 602, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 602 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_602_602_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_log_616_616_invokes_616", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_602_602", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_log_616_616", + "kind": "invokes", + "label": "Logs runtime state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 616, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 616 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_log_616_616_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_617_617_invokes_617", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_log_616_616", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_617_617", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 617, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 617 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_617_617_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_620_620_evaluates-condition_620", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_external_call_617_617", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_620_620", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 620, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 620 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_620_620_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_622_622_returns_622", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_620_620", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_622_622", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 622, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 622 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_622_622_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_624_624_invokes_624", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_622_622", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_624_624", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 624, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 624 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_624_624_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_636_636_evaluates-condition_636", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_624_624", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_636_636", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 636, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 636 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_636_636_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_645_645_returns_645", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_636_636", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_645_645", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 645, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 645 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_645_645_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_651_651_returns_651", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_645_645", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_651_651", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 651, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 651 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_651_651_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_loop_654_654_loops-to_654", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_651_651", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_loop_654_654", + "kind": "loops-to", + "label": "var record in neoResult", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 654, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 654 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_loop_654_654_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_write_659_659_invokes_659", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_loop_654_654", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_write_659_659", + "kind": "invokes", + "label": "Writes repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 659, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 659 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_write_659_659_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_662_662_evaluates-condition_662", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_write_659_659", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_662_662", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 662, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 662 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_662_662_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_loop_664_664_loops-to_664", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_662_662", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_loop_664_664", + "kind": "loops-to", + "label": "var relObj in relations", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 664, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 664 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_loop_664_664_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_671_671_evaluates-condition_671", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_loop_664_664", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_671_671", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 671, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 671 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_671_671_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_write_673_673_invokes_673", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_671_671", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_write_673_673", + "kind": "invokes", + "label": "Writes repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 673, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 673 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_write_673_673_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_log_682_682_invokes_682", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_write_673_673", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_log_682_682", + "kind": "invokes", + "label": "Logs runtime state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 682, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 682 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_log_682_682_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_loop_683_683_loops-to_683", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_log_682_682", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_loop_683_683", + "kind": "loops-to", + "label": "var point in searchResult", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 683, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 683 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_loop_683_683_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_write_687_687_invokes_687", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_loop_683_683", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_write_687_687", + "kind": "invokes", + "label": "Writes repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 687, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 687 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_write_687_687_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_694_694_invokes_694", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_write_687_687", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_694_694", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 694, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 694 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_694_694_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_700_700_evaluates-condition_700", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_694_694", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_700_700", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 700, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 700 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_700_700_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_704_704_invokes_704", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_700_700", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_704_704", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 704, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 704 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_704_704_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_715_715_invokes_715", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_704_704", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_715_715", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 715, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 715 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_715_715_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_716_716_invokes_716", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_715_715", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_716_716", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 716, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 716 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_716_716_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_717_717_invokes_717", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_716_716", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_717_717", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 717, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 717 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_717_717_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_754_754_evaluates-condition_754", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_repository_read_717_717", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_754_754", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 754, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 754 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_754_754_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_756_756_returns_756", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_754_754", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_756_756", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 756, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 756 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_756_756_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_loop_760_760_loops-to_760", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_756_756", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_loop_760_760", + "kind": "loops-to", + "label": "var citation in groundedResult.Citations", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 760, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 760 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_loop_760_760_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_762_762_evaluates-condition_762", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_loop_760_760", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_762_762", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 762, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 762 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_762_762_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_771_771_returns_771", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_branch_762_762", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_771_771", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 771, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 771 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_771_771_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_log_775_775_invokes_775", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_771_771", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_log_775_775", + "kind": "invokes", + "label": "Logs runtime state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 775, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 775 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_log_775_775_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_776_776_returns_776", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_log_775_775", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_776_776", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 776, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 776 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_776_776_flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_781_781_returns_781", + "from": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_776_776", + "to": "flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_askquestionasync_return_781_781", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/KnowledgeService.cs", + "sourceLine": 781, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/KnowledgeService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "line": 781 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1_flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_30_invokes_30", + "from": "flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_30", + "kind": "invokes", + "label": "GetEpubContentAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 30, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 30 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_30_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_repository_read_41_41_invokes_41", + "from": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_30", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_repository_read_41_41", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 41, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 41 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_repository_read_41_41_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_guard_clause_47_47_evaluates-condition_47", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_repository_read_41_41", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_guard_clause_47_47", + "kind": "evaluates-condition", + "label": "fail / continue", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 47, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 47 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_guard_clause_47_47_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_47_47_evaluates-condition_47", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_guard_clause_47_47", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_47_47", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 47, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 47 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_47_47_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_return_49_49_returns_49", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_47_47", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_return_49_49", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 49, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 49 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_return_49_49_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_55_55_evaluates-condition_55", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_return_49_49", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_55_55", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 55, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 55 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_55_55_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_log_57_57_invokes_57", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_55_55", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_log_57_57", + "kind": "invokes", + "label": "Logs runtime state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 57, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 57 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_log_57_57_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_return_58_58_returns_58", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_log_57_57", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_return_58_58", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 58, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 58 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_return_58_58_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_65_65_evaluates-condition_65", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_return_58_58", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_65_65", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 65, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 65 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_65_65_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_guard_clause_65_65_evaluates-condition_65", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_65_65", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_guard_clause_65_65", + "kind": "evaluates-condition", + "label": "fail / continue", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 65, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 65 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_guard_clause_65_65_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_return_67_67_returns_67", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_guard_clause_65_65", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_return_67_67", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 67, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 67 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_return_67_67_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_70_70_evaluates-condition_70", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_return_67_67", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_70_70", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 70, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 70 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_70_70_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_repository_read_77_77_invokes_77", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_70_70", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_repository_read_77_77", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 77, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 77 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_repository_read_77_77_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_loop_89_89_loops-to_89", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_repository_read_77_77", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_loop_89_89", + "kind": "loops-to", + "label": "Paragraph -> block building loop", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 89, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 89 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_loop_89_89_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_loop_89_89_loops-to_89", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_loop_89_89", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_loop_89_89", + "kind": "loops-to", + "label": "var p in paragraphs", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 89, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 89 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_loop_89_89_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_guard_clause_92_92_evaluates-condition_92", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_loop_89_89", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_guard_clause_92_92", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 92, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 92 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_guard_clause_92_92_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_99_99_evaluates-condition_99", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_guard_clause_92_92", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_99_99", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 99, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 99 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_99_99_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_106_106_evaluates-condition_106", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_99_99", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_106_106", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 106, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 106 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_106_106_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_return_111_111_returns_111", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_branch_106_106", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_return_111_111", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 111, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 111 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_return_111_111_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_log_115_115_invokes_115", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_return_111_111", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_log_115_115", + "kind": "invokes", + "label": "Logs runtime state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 115, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 115 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_log_115_115_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_return_116_116_returns_116", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_log_115_115", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_getepubcontentasync_return_116_116", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 116, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 116 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1_flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_124_invokes_124", + "from": "flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_124", + "kind": "invokes", + "label": "ResolvePath", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 124, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 124 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_124_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_loop_129_129_loops-to_129", + "from": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_124", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_loop_129_129", + "kind": "loops-to", + "label": "Search upward through parent directories", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 129, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 129 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_loop_129_129_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_loop_130_130_loops-to_130", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_loop_129_129", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_loop_130_130", + "kind": "loops-to", + "label": "currentDir != null", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 130, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 130 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_loop_130_130_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_guard_clause_133_133_evaluates-condition_133", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_loop_130_130", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_guard_clause_133_133", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 133, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 133 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_guard_clause_133_133_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_guard_clause_137_137_evaluates-condition_137", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_guard_clause_133_133", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_guard_clause_137_137", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 137, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 137 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_guard_clause_137_137_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_fallback_142_142_falls-back_142", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_guard_clause_137_137", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_fallback_142_142", + "kind": "falls-back", + "label": "Return null if not found", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 142, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 142 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_fallback_142_142_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_return_142_142_returns_142", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_fallback_142_142", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_resolvepath_return_142_142", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 142, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 142 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1_flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_extractparagraphs_145_invokes_145", + "from": "flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_extractparagraphs_145", + "kind": "invokes", + "label": "ExtractParagraphs", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 145, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 145 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_extractparagraphs_145_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_extractparagraphs_loop_153_153_loops-to_153", + "from": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_extractparagraphs_145", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_extractparagraphs_loop_153_153", + "kind": "loops-to", + "label": "Match match in matches", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 153, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 153 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_extractparagraphs_loop_153_153_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_extractparagraphs_branch_158_158_evaluates-condition_158", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_extractparagraphs_loop_153_153", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_extractparagraphs_branch_158_158", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 158, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 158 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_extractparagraphs_branch_158_158_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_extractparagraphs_fallback_158_158_falls-back_158", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_extractparagraphs_branch_158_158", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_extractparagraphs_fallback_158_158", + "kind": "falls-back", + "label": "Split by breaks if no blocks found", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 158, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 158 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_extractparagraphs_fallback_158_158_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_extractparagraphs_return_163_163_returns_163", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_extractparagraphs_fallback_158_158", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_extractparagraphs_return_163_163", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 163, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 163 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1_flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_sanitizeparagraph_166_invokes_166", + "from": "flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_sanitizeparagraph_166", + "kind": "invokes", + "label": "SanitizeParagraph", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 166, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 166 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_sanitizeparagraph_166_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_sanitizeparagraph_return_172_172_returns_172", + "from": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_sanitizeparagraph_166", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_sanitizeparagraph_return_172_172", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 172, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 172 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1_flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_175_invokes_175", + "from": "flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_175", + "kind": "invokes", + "label": "CountWords", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 175, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 175 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_175_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_guard_clause_177_177_evaluates-condition_177", + "from": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_175", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_guard_clause_177_177", + "kind": "evaluates-condition", + "label": "return 0 / continue", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 177, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 177 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_guard_clause_177_177_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_return_178_178_returns_178", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_guard_clause_177_177", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_return_178_178", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 178, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 178 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1_flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_createaitrigger_181_invokes_181", + "from": "flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_createaitrigger_181", + "kind": "invokes", + "label": "CreateAiTrigger", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 181, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 181 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1_flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_186_invokes_186", + "from": "flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_186", + "kind": "invokes", + "label": "FindTitleInNavigation", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 186, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 186 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_186_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_repository_read_186_186_invokes_186", + "from": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_186", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_repository_read_186_186", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 186, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 186 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_repository_read_186_186_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_guard_clause_188_188_evaluates-condition_188", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_repository_read_186_186", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_guard_clause_188_188", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 188, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 188 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_guard_clause_188_188_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_loop_191_191_loops-to_191", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_guard_clause_188_188", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_loop_191_191", + "kind": "loops-to", + "label": "Iterate navigation items", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 191, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 191 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_loop_191_191_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_loop_191_191_loops-to_191", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_loop_191_191", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_loop_191_191", + "kind": "loops-to", + "label": "var item in navigation", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 191, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 191 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_loop_191_191_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_branch_193_193_evaluates-condition_193", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_loop_191_191", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_branch_193_193", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 193, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 193 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_branch_193_193_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_return_194_194_returns_194", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_branch_193_193", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_return_194_194", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 194, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 194 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_return_194_194_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_branch_196_196_evaluates-condition_196", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_return_194_194", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_branch_196_196", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 196, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 196 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_branch_196_196_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_repository_read_198_198_invokes_198", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_branch_196_196", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_repository_read_198_198", + "kind": "invokes", + "label": "Reads repository or persistence state", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 198, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 198 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_repository_read_198_198_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_guard_clause_199_199_evaluates-condition_199", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_repository_read_198_198", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_guard_clause_199_199", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 199, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 199 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_guard_clause_199_199_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_return_203_203_returns_203", + "from": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_guard_clause_199_199", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_findtitleinnavigation_return_203_203", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 203, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubReaderService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "line": 203 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_epubmetadataextractor_cs_file_1_flow_method_nexusreader_infrastructure_services_epubmetadataextractor_cs_extractmetadataasync_15_invokes_15", + "from": "flow_file_nexusreader_infrastructure_services_epubmetadataextractor_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_epubmetadataextractor_cs_extractmetadataasync_15", + "kind": "invokes", + "label": "ExtractMetadataAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "sourceLine": 15, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "line": 15 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_epubmetadataextractor_cs_extractmetadataasync_15_flow_action_nexusreader_infrastructure_services_epubmetadataextractor_cs_extractmetadataasync_guard_clause_20_20_evaluates-condition_20", + "from": "flow_method_nexusreader_infrastructure_services_epubmetadataextractor_cs_extractmetadataasync_15", + "to": "flow_action_nexusreader_infrastructure_services_epubmetadataextractor_cs_extractmetadataasync_guard_clause_20_20", + "kind": "evaluates-condition", + "label": "use 'Unknown Title' / use actual title", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "sourceLine": 20, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "line": 20 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubmetadataextractor_cs_extractmetadataasync_guard_clause_20_20_flow_action_nexusreader_infrastructure_services_epubmetadataextractor_cs_extractmetadataasync_guard_clause_21_21_evaluates-condition_21", + "from": "flow_action_nexusreader_infrastructure_services_epubmetadataextractor_cs_extractmetadataasync_guard_clause_20_20", + "to": "flow_action_nexusreader_infrastructure_services_epubmetadataextractor_cs_extractmetadataasync_guard_clause_21_21", + "kind": "evaluates-condition", + "label": "use 'Unknown Author' / use actual author", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "sourceLine": 21, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "line": 21 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubmetadataextractor_cs_extractmetadataasync_guard_clause_21_21_flow_action_nexusreader_infrastructure_services_epubmetadataextractor_cs_extractmetadataasync_return_24_24_returns_24", + "from": "flow_action_nexusreader_infrastructure_services_epubmetadataextractor_cs_extractmetadataasync_guard_clause_21_21", + "to": "flow_action_nexusreader_infrastructure_services_epubmetadataextractor_cs_extractmetadataasync_return_24_24", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "sourceLine": 24, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "line": 24 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_epubmetadataextractor_cs_extractmetadataasync_return_24_24_flow_action_nexusreader_infrastructure_services_epubmetadataextractor_cs_extractmetadataasync_return_28_28_returns_28", + "from": "flow_action_nexusreader_infrastructure_services_epubmetadataextractor_cs_extractmetadataasync_return_24_24", + "to": "flow_action_nexusreader_infrastructure_services_epubmetadataextractor_cs_extractmetadataasync_return_28_28", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "sourceLine": 28, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "line": 28 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1_flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_19_invokes_19", + "from": "flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_19", + "kind": "invokes", + "label": "SaveEbookAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 19, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 19 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_19_flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_return_22_22_returns_22", + "from": "flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_19", + "to": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_return_22_22", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 22, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 22 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1_flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_25_invokes_25", + "from": "flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_25", + "kind": "invokes", + "label": "SaveEbookAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 25, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 25 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_25_flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_guard_clause_28_28_evaluates-condition_28", + "from": "flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_25", + "to": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_guard_clause_28_28", + "kind": "evaluates-condition", + "label": "create-directory / continue", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 28, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 28 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_guard_clause_28_28_flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_return_40_40_returns_40", + "from": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_guard_clause_28_28", + "to": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_return_40_40", + "kind": "returns", + "label": "Return web-relative uploads path", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 40, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 40 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_return_40_40_flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_return_40_40_returns_40", + "from": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_return_40_40", + "to": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_return_40_40", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 40, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 40 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1_flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_43_invokes_43", + "from": "flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_43", + "kind": "invokes", + "label": "SaveCoverAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 43, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 43 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_43_flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_guard_clause_45_45_evaluates-condition_45", + "from": "flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_43", + "to": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_guard_clause_45_45", + "kind": "evaluates-condition", + "label": "exit / continue", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 45, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 45 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_guard_clause_45_45_flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_return_47_47_returns_47", + "from": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_guard_clause_45_45", + "to": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_return_47_47", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 47, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 47 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1_flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_50_invokes_50", + "from": "flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_50", + "kind": "invokes", + "label": "SaveCoverAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 50, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 50 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_50_flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_guard_clause_53_53_evaluates-condition_53", + "from": "flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_50", + "to": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_guard_clause_53_53", + "kind": "evaluates-condition", + "label": "create-directory / continue", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 53, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 53 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_guard_clause_53_53_flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_return_63_63_returns_63", + "from": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_guard_clause_53_53", + "to": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_return_63_63", + "kind": "returns", + "label": "Return web-relative covers path", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 63, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 63 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_return_63_63_flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_return_63_63_returns_63", + "from": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_return_63_63", + "to": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_return_63_63", + "kind": "returns", + "label": "Returns result", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 63, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 63 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1_flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_66_invokes_66", + "from": "flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_66", + "kind": "invokes", + "label": "EnsureDirectoryExists", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 66, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 66 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_66_flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_guard_clause_68_68_evaluates-condition_68", + "from": "flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_66", + "to": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_guard_clause_68_68", + "kind": "evaluates-condition", + "label": "create-directory / noop", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 68, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 68 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_guard_clause_68_68_flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_branch_68_68_evaluates-condition_68", + "from": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_guard_clause_68_68", + "to": "flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_branch_68_68", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 68, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 68 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1_flow_type_nexusreader_infrastructure_services_bookstorageservice_cs_bookstorageservice_10_defines-type_10", + "from": "flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1", + "to": "flow_type_nexusreader_infrastructure_services_bookstorageservice_cs_bookstorageservice_10", + "kind": "defines-type", + "label": "model BookStorageService", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/BookStorageService.cs", + "sourceLine": 10, + "evidencePaths": [ + "NexusReader.Infrastructure/Services/BookStorageService.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/Services/BookStorageService.cs", + "line": 10 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_file_1_flow_method_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_21_invokes_21", + "from": "flow_file_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_21", + "kind": "invokes", + "label": "BroadcastProgressAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourceLine": 21, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "line": 21 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_21_flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_guard_clause_30_30_evaluates-condition_30", + "from": "flow_method_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_21", + "to": "flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_guard_clause_30_30", + "kind": "evaluates-condition", + "label": "branch-true: attempt comment & send / branch-false: send", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourceLine": 30, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "line": 30 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_guard_clause_30_30_flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_branch_30_30_evaluates-condition_30", + "from": "flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_guard_clause_30_30", + "to": "flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_branch_30_30", + "kind": "evaluates-condition", + "label": "true / false", + "confidence": "medium", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourceLine": 30, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "line": 30 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_branch_30_30_flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_external_call_34_34_invokes_34", + "from": "flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_branch_30_30", + "to": "flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_external_call_34_34", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourceLine": 34, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "line": 34 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_external_call_34_34_flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_fallback_40_40_falls-back_40", + "from": "flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_external_call_34_34", + "to": "flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_fallback_40_40", + "kind": "falls-back", + "label": "fallback", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourceLine": 40, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "line": 40 + } + ] + }, + { + "id": "edge_flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_fallback_40_40_flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_external_call_44_44_invokes_44", + "from": "flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_fallback_40_40", + "to": "flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_external_call_44_44", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourceLine": 44, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "line": 44 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_file_1_flow_method_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastingestionprogressasync_49_invokes_49", + "from": "flow_file_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastingestionprogressasync_49", + "kind": "invokes", + "label": "BroadcastIngestionProgressAsync", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourceLine": 49, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "line": 49 + } + ] + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastingestionprogressasync_49_flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastingestionprogressasync_external_call_59_59_invokes_59", + "from": "flow_method_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastingestionprogressasync_49", + "to": "flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastingestionprogressasync_external_call_59_59", + "kind": "invokes", + "label": "Calls external dependency", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourceLine": 59, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "line": 59 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_file_1_flow_type_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_signalrsyncbroadcaster_11_defines-type_11", + "from": "flow_file_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_file_1", + "to": "flow_type_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_signalrsyncbroadcaster_11", + "kind": "defines-type", + "label": "model SignalRSyncBroadcaster", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "sourceLine": 11, + "evidencePaths": [ + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "line": 11 + } + ] + }, + { + "id": "edge_flow_file_nexusreader_application_commands_sync_updatereadingprogresscommand_cs_file_1_flow_type_nexusreader_application_commands_sync_updatereadingprogresscommand_cs_updatereadingprogresscommand_6_defines-type_6", + "from": "flow_file_nexusreader_application_commands_sync_updatereadingprogresscommand_cs_file_1", + "to": "flow_type_nexusreader_application_commands_sync_updatereadingprogresscommand_cs_updatereadingprogresscommand_6", + "kind": "defines-type", + "label": "command UpdateReadingProgressCommand", + "confidence": "high", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs", + "sourceLine": 6, + "evidencePaths": [ + "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs", + "line": 6 + } + ] + } + ], + "flows": [ + { + "id": "flow_1_nexusreader_web_client_program_cs", + "name": "Program.cs", + "category": "frontend-to-backend", + "entryNodeId": "flow_file_nexusreader_web_client_program_cs_file_1", + "nodeIds": [ + "flow_file_nexusreader_web_client_program_cs_file_1", + "flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15", + "flow_type_nexusreader_web_client_program_cs_webplatformservice_18", + "flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33", + "flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38", + "flow_type_nexusreader_web_client_program_cs_configured_httpclient_40", + "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49", + "flow_type_nexusreader_web_client_program_cs_n_a_55", + "flow_type_nexusreader_web_client_program_cs_wasmepubreader_56", + "flow_method_nexusreader_web_client_program_cs_run_wasm_host_59", + "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61", + "flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66", + "flow_method_nexusreader_web_client_program_cs_getservice_71", + "flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74", + "flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84", + "flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88", + "flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94", + "flow_action_nexusreader_web_client_program_cs_getservice_return_71_71", + "flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88", + "flow_file_nexusreader_web_program_cs_file_1", + "flow_method_nexusreader_web_program_cs_program_top_level_29", + "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125" + ], + "edgeIds": [ + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15_invokes_15", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_getservice_71_invokes_71", + "edge_flow_method_nexusreader_web_client_program_cs_getservice_71_flow_action_nexusreader_web_client_program_cs_getservice_return_71_71_returns_71", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88_invokes_88", + "edge_flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88_flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88_invokes_88", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61_defines-type_61", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66_defines-type_66", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74_defines-type_74", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84_defines-type_84", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94_defines-type_94", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_webplatformservice_18_registers-service_18", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33_registers-service_33", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38_registers-service_38", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_configured_httpclient_40_registers-service_40", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49_registers-service_49", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_n_a_55_registers-service_55", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_wasmepubreader_56_registers-service_56", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_run_wasm_host_59_configures-pipeline_59", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_program_top_level_29_invokes_29", + "edge_flow_method_nexusreader_web_program_cs_program_top_level_29_flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62_evaluates-condition_62", + "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_falls-back_66", + "edge_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125_invokes_125", + "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_126_126_invokes_126", + "edge_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_flow_method_nexusreader_application_dependencyinjection_cs_addapplication_8_uses-service_78", + "edge_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_flow_method_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_31_uses-service_79", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_startupvalidation_scope_check_165_invokes_165", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_ensuredatabaseinitialized_175_invokes_175", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_get_api_epub_ebookid_index_249_invokes_249", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_265_invokes_265", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_273_invokes_273", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_281_invokes_281", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_289_invokes_289", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_297_invokes_297", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_305_invokes_305", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_313_invokes_313", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_321_invokes_321", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_knowledgerequest_566_maps-dto_566", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_groundednessrequest_567_maps-dto_567", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_semanticsearchrequest_568_maps-dto_568", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_askquestionrequest_569_maps-dto_569" + ], + "confidence": "high", + "businessValue": 75, + "evidencePaths": [ + "NexusReader.Web.Client/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web.Client/Program.cs", + "line": 1 + } + ], + "businessSignals": [ + "trigger", + "validation-decision" + ], + "scoreBreakdown": { + "entrypointQuality": 25, + "crossLayerDepth": 7, + "businessSignals": 8, + "evidenceStrength": 20, + "contractCoverage": 15, + "total": 75 + }, + "validationIssues": [], + "recommendedDiagramKinds": [ + "primary-runtime", + "control-flow", + "dependency-map", + "class-diagram", + "method-flow" + ], + "producedArtifacts": [ + { + "id": "top_business_flows_md_phase_inputs", + "label": "Phase Inputs", + "path": "machine/phase-inputs/business__top-business-flows.phase-inputs.json", + "producerPath": "src/documentation/v4/phase4Generation.ts", + "status": "generated" + }, + { + "id": "top_business_flows_md_context_bag", + "label": "Context Bag", + "path": "machine/context-bags/top_business_flows.context-bag.json", + "producerPath": "src/documentation/v4/buildContextBags.ts", + "status": "generated" + }, + { + "id": "top_business_flows_md_planning_debug", + "label": "Planning Debug", + "path": "debug/planning.debug.json", + "producerPath": "src/documentation/v4/phase1Orientation.ts", + "status": "generated" + }, + { + "id": "top_business_flows_md_flow_catalog", + "label": "Flow Catalog", + "path": "machine/flow-catalog.json", + "producerPath": "src/documentation/v4/phase3_7FlowRanking.ts", + "status": "generated" + }, + { + "id": "top_business_flows_md_flow_selection", + "label": "Flow Selection", + "path": "machine/flow-selection.json", + "producerPath": "src/documentation/v4/phase3_7FlowRanking.ts", + "status": "generated" + }, + { + "id": "top_business_flows_md_business_map", + "label": "Business Map", + "path": "machine/business-map.json", + "producerPath": "src/documentation/v4/phase3_5BusinessUnderstanding.ts", + "status": "generated" + }, + { + "id": "top_business_flows_md_index_output", + "label": "Published Index", + "path": "index.md", + "producerPath": "src/documentation/v4/phase5Index.ts", + "status": "generated" + } + ] + }, + { + "id": "flow_2_nexusreader_maui_mauiprogram_cs", + "name": "MauiProgram", + "category": "frontend-to-backend", + "entryNodeId": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "nodeIds": [ + "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1", + "flow_type_nexusreader_maui_mauiprogram_cs_mauiprogram_10", + "flow_method_nexusreader_maui_mauiprogram_cs_createmauiapp_12", + "flow_method_nexusreader_maui_mauiprogram_cs_create_and_build_mauiapp_16", + "flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28", + "flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29", + "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32", + "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33", + "flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38", + "flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51", + "flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53", + "flow_action_nexusreader_maui_mauiprogram_cs_createmauiapp_return_57_57", + "flow_file_nexusreader_web_program_cs_file_1", + "flow_method_nexusreader_web_program_cs_program_top_level_29", + "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125", + "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_126_126", + "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_127_127", + "flow_action_nexusreader_web_program_cs_program_top_level_branch_129_129", + "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_131_131", + "flow_action_nexusreader_web_program_cs_program_top_level_fallback_133_133", + "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_135_135" + ], + "edgeIds": [ + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_method_nexusreader_maui_mauiprogram_cs_createmauiapp_12_invokes_12", + "edge_flow_method_nexusreader_maui_mauiprogram_cs_createmauiapp_12_flow_action_nexusreader_maui_mauiprogram_cs_createmauiapp_return_57_57_returns_57", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauiprogram_10_defines-type_10", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28_registers-service_28", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29_registers-service_29", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32_registers-service_32", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33_registers-service_33", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38_registers-service_38", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1_registers-service_1", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51_registers-service_51", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53_registers-service_53", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_method_nexusreader_maui_mauiprogram_cs_create_and_build_mauiapp_16_configures-pipeline_16", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_program_top_level_29_invokes_29", + "edge_flow_method_nexusreader_web_program_cs_program_top_level_29_flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62_evaluates-condition_62", + "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_falls-back_66", + "edge_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125_invokes_125", + "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_126_126_invokes_126", + "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_126_126_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_127_127_invokes_127", + "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_127_127_flow_action_nexusreader_web_program_cs_program_top_level_branch_129_129_evaluates-condition_129", + "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_129_129_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_131_131_invokes_131", + "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_131_131_flow_action_nexusreader_web_program_cs_program_top_level_fallback_133_133_falls-back_133", + "edge_flow_action_nexusreader_web_program_cs_program_top_level_fallback_133_133_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_135_135_invokes_135", + "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_135_135_flow_action_nexusreader_web_program_cs_program_top_level_return_137_137_returns_137", + "edge_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_flow_method_nexusreader_application_dependencyinjection_cs_addapplication_8_uses-service_78", + "edge_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_flow_method_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_31_uses-service_79", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_startupvalidation_scope_check_165_invokes_165", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_ensuredatabaseinitialized_175_invokes_175", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_get_api_epub_ebookid_index_249_invokes_249", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_265_invokes_265", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_273_invokes_273", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_281_invokes_281", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_289_invokes_289", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_297_invokes_297", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_305_invokes_305", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_313_invokes_313", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_321_invokes_321", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_knowledgerequest_566_maps-dto_566", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_groundednessrequest_567_maps-dto_567", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_semanticsearchrequest_568_maps-dto_568", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_askquestionrequest_569_maps-dto_569" + ], + "confidence": "high", + "businessValue": 75, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 1 + } + ], + "businessSignals": [ + "trigger", + "validation-decision" + ], + "scoreBreakdown": { + "entrypointQuality": 25, + "crossLayerDepth": 7, + "businessSignals": 8, + "evidenceStrength": 20, + "contractCoverage": 15, + "total": 75 + }, + "validationIssues": [], + "recommendedDiagramKinds": [ + "primary-runtime", + "control-flow", + "dependency-map", + "class-diagram", + "method-flow" + ], + "producedArtifacts": [ + { + "id": "top_business_flows_md_phase_inputs", + "label": "Phase Inputs", + "path": "machine/phase-inputs/business__top-business-flows.phase-inputs.json", + "producerPath": "src/documentation/v4/phase4Generation.ts", + "status": "generated" + }, + { + "id": "top_business_flows_md_context_bag", + "label": "Context Bag", + "path": "machine/context-bags/top_business_flows.context-bag.json", + "producerPath": "src/documentation/v4/buildContextBags.ts", + "status": "generated" + }, + { + "id": "top_business_flows_md_planning_debug", + "label": "Planning Debug", + "path": "debug/planning.debug.json", + "producerPath": "src/documentation/v4/phase1Orientation.ts", + "status": "generated" + }, + { + "id": "top_business_flows_md_flow_catalog", + "label": "Flow Catalog", + "path": "machine/flow-catalog.json", + "producerPath": "src/documentation/v4/phase3_7FlowRanking.ts", + "status": "generated" + }, + { + "id": "top_business_flows_md_flow_selection", + "label": "Flow Selection", + "path": "machine/flow-selection.json", + "producerPath": "src/documentation/v4/phase3_7FlowRanking.ts", + "status": "generated" + }, + { + "id": "top_business_flows_md_business_map", + "label": "Business Map", + "path": "machine/business-map.json", + "producerPath": "src/documentation/v4/phase3_5BusinessUnderstanding.ts", + "status": "generated" + }, + { + "id": "top_business_flows_md_index_output", + "label": "Published Index", + "path": "index.md", + "producerPath": "src/documentation/v4/phase5Index.ts", + "status": "generated" + } + ] + }, + { + "id": "flow_0_nexusreader_web_program_cs", + "name": "Program.cs", + "category": "frontend-to-backend", + "entryNodeId": "flow_file_nexusreader_web_program_cs_file_1", + "nodeIds": [ + "flow_file_nexusreader_web_program_cs_file_1", + "flow_method_nexusreader_web_program_cs_program_top_level_29", + "flow_type_nexusreader_web_program_cs_webplatformservice_47", + "flow_type_nexusreader_web_program_cs_knowledgecoordinator_55", + "flow_type_nexusreader_web_program_cs_httpclient_configured_with_base_address_58", + "flow_type_nexusreader_web_program_cs_nexusreader_application_assembly_extension_78", + "flow_type_nexusreader_web_program_cs_nexusreader_infrastructure_assembly_extension_79", + "flow_type_nexusreader_web_program_cs_identity_with_appdbcontext_107", + "flow_method_nexusreader_web_program_cs_usehangfiredashboard_163", + "flow_method_nexusreader_web_program_cs_startupvalidation_scope_check_165", + "flow_method_nexusreader_web_program_cs_ensuredatabaseinitialized_175", + "flow_method_nexusreader_web_program_cs_configure_request_pipeline_routing_auth_antiforgery_static_assets_hubs_225", + "flow_method_nexusreader_web_program_cs_get_api_epub_ebookid_index_249", + "flow_method_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_265", + "flow_method_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_273", + "flow_method_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_281", + "flow_method_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_289", + "flow_method_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_297", + "flow_method_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_305", + "flow_method_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_313", + "flow_method_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_321", + "flow_type_nexusreader_web_program_cs_knowledgerequest_566", + "flow_type_nexusreader_web_program_cs_groundednessrequest_567", + "flow_type_nexusreader_web_program_cs_semanticsearchrequest_568" + ], + "edgeIds": [ + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_program_top_level_29_invokes_29", + "edge_flow_method_nexusreader_web_program_cs_program_top_level_29_flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62_evaluates-condition_62", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_startupvalidation_scope_check_165_invokes_165", + "edge_flow_method_nexusreader_web_program_cs_startupvalidation_scope_check_165_flow_action_nexusreader_web_program_cs_startupvalidation_scope_check_branch_169_169_evaluates-condition_169", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_ensuredatabaseinitialized_175_invokes_175", + "edge_flow_method_nexusreader_web_program_cs_ensuredatabaseinitialized_175_flow_action_nexusreader_web_program_cs_ensuredatabaseinitialized_loop_186_186_loops-to_186", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_get_api_epub_ebookid_index_249_invokes_249", + "edge_flow_method_nexusreader_web_program_cs_get_api_epub_ebookid_index_249_flow_action_nexusreader_web_program_cs_get_api_epub_ebookid_index_guard_clause_252_252_evaluates-condition_252", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_265_invokes_265", + "edge_flow_method_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_265_flow_action_nexusreader_web_program_cs_knowledgeapi_post_api_knowledge_getknowledge_repository_read_267_267_invokes_267", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_273_invokes_273", + "edge_flow_method_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_273_flow_action_nexusreader_web_program_cs_knowledgeapi_post_graph_getgraphdataasync_repository_read_275_275_invokes_275", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_281_invokes_281", + "edge_flow_method_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_281_flow_action_nexusreader_web_program_cs_knowledgeapi_post_summary_getsummaryandquizasync_repository_read_283_283_invokes_283", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_289_invokes_289", + "edge_flow_method_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_289_flow_action_nexusreader_web_program_cs_knowledgeapi_post_map_getknowledgemapasync_repository_read_291_291_invokes_291", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_297_invokes_297", + "edge_flow_method_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_297_flow_action_nexusreader_web_program_cs_knowledgeapi_post_verify_groundedness_repository_read_299_299_invokes_299", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_305_invokes_305", + "edge_flow_method_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_305_flow_action_nexusreader_web_program_cs_knowledgeapi_post_search_searchlibrarysemanticallyasync_repository_read_307_307_invokes_307", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_313_invokes_313", + "edge_flow_method_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_313_flow_action_nexusreader_web_program_cs_knowledgeapi_post_ask_askquestionasync_repository_read_315_315_invokes_315", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_321_invokes_321", + "edge_flow_method_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_321_flow_action_nexusreader_web_program_cs_knowledgeapi_delete_api_knowledge_clearcacheasync_branch_323_323_evaluates-condition_323", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_knowledgerequest_566_maps-dto_566", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_groundednessrequest_567_maps-dto_567", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_semanticsearchrequest_568_maps-dto_568", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_askquestionrequest_569_maps-dto_569", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_webplatformservice_47_registers-service_47", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_knowledgecoordinator_55_registers-service_55", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_httpclient_configured_with_base_address_58_registers-service_58", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_nexusreader_application_assembly_extension_78_registers-service_78", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_nexusreader_infrastructure_assembly_extension_79_registers-service_79", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_identity_with_appdbcontext_107_registers-service_107", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_usehangfiredashboard_163_configures-pipeline_163", + "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_configure_request_pipeline_routing_auth_antiforgery_static_assets_hubs_225_configures-pipeline_225" + ], + "confidence": "high", + "businessValue": 68, + "evidencePaths": [ + "NexusReader.Web/Program.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Web/Program.cs", + "line": 1 + } + ], + "businessSignals": [ + "trigger", + "validation-decision" + ], + "scoreBreakdown": { + "entrypointQuality": 25, + "crossLayerDepth": 0, + "businessSignals": 8, + "evidenceStrength": 20, + "contractCoverage": 15, + "total": 68 + }, + "validationIssues": [], + "recommendedDiagramKinds": [ + "primary-runtime", + "dependency-map", + "class-diagram", + "method-flow" + ], + "producedArtifacts": [ + { + "id": "top_business_flows_md_phase_inputs", + "label": "Phase Inputs", + "path": "machine/phase-inputs/business__top-business-flows.phase-inputs.json", + "producerPath": "src/documentation/v4/phase4Generation.ts", + "status": "generated" + }, + { + "id": "top_business_flows_md_context_bag", + "label": "Context Bag", + "path": "machine/context-bags/top_business_flows.context-bag.json", + "producerPath": "src/documentation/v4/buildContextBags.ts", + "status": "generated" + }, + { + "id": "top_business_flows_md_planning_debug", + "label": "Planning Debug", + "path": "debug/planning.debug.json", + "producerPath": "src/documentation/v4/phase1Orientation.ts", + "status": "generated" + }, + { + "id": "top_business_flows_md_flow_catalog", + "label": "Flow Catalog", + "path": "machine/flow-catalog.json", + "producerPath": "src/documentation/v4/phase3_7FlowRanking.ts", + "status": "generated" + }, + { + "id": "top_business_flows_md_flow_selection", + "label": "Flow Selection", + "path": "machine/flow-selection.json", + "producerPath": "src/documentation/v4/phase3_7FlowRanking.ts", + "status": "generated" + }, + { + "id": "top_business_flows_md_business_map", + "label": "Business Map", + "path": "machine/business-map.json", + "producerPath": "src/documentation/v4/phase3_5BusinessUnderstanding.ts", + "status": "generated" + }, + { + "id": "top_business_flows_md_index_output", + "label": "Published Index", + "path": "index.md", + "producerPath": "src/documentation/v4/phase5Index.ts", + "status": "generated" + } + ] + }, + { + "id": "xref_top_business_flows_md_user_authentication_login_register_flow", + "name": "User Authentication (Login/Register) Flow", + "category": "frontend-to-backend", + "entryNodeId": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "nodeIds": [ + "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "flow_method_nexusreader_maui_mauiprogram_cs_createmauiapp_12", + "flow_action_nexusreader_maui_mauiprogram_cs_createmauiapp_return_57_57", + "flow_type_nexusreader_maui_mauiprogram_cs_mauiprogram_10", + "flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28", + "flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29", + "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32", + "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33", + "flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38", + "flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1", + "flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51", + "flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53" + ], + "edgeIds": [ + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_method_nexusreader_maui_mauiprogram_cs_createmauiapp_12_invokes_12", + "edge_flow_method_nexusreader_maui_mauiprogram_cs_createmauiapp_12_flow_action_nexusreader_maui_mauiprogram_cs_createmauiapp_return_57_57_returns_57", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauiprogram_10_defines-type_10", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28_registers-service_28", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29_registers-service_29", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32_registers-service_32", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33_registers-service_33", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38_registers-service_38", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1_registers-service_1", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51_registers-service_51", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53_registers-service_53", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_method_nexusreader_maui_mauiprogram_cs_create_and_build_mauiapp_16_configures-pipeline_16", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15_invokes_15", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_getservice_71_invokes_71", + "edge_flow_method_nexusreader_web_client_program_cs_getservice_71_flow_action_nexusreader_web_client_program_cs_getservice_return_71_71_returns_71", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88_invokes_88" + ], + "confidence": "high", + "businessValue": 68, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 1 + } + ], + "businessSignals": [ + "trigger", + "validation-decision" + ], + "scoreBreakdown": { + "entrypointQuality": 25, + "crossLayerDepth": 0, + "businessSignals": 8, + "evidenceStrength": 20, + "contractCoverage": 15, + "total": 68 + }, + "validationIssues": [], + "recommendedDiagramKinds": [ + "primary-runtime", + "control-flow", + "dependency-map", + "class-diagram", + "method-flow" + ], + "producedArtifacts": [ + { + "id": "top_business_flows_md_phase_inputs", + "label": "Phase Inputs", + "path": "machine/phase-inputs/business__top-business-flows.phase-inputs.json", + "producerPath": "src/documentation/v4/phase4Generation.ts", + "status": "generated" + }, + { + "id": "top_business_flows_md_context_bag", + "label": "Context Bag", + "path": "machine/context-bags/top_business_flows.context-bag.json", + "producerPath": "src/documentation/v4/buildContextBags.ts", + "status": "generated" + }, + { + "id": "top_business_flows_md_planning_debug", + "label": "Planning Debug", + "path": "debug/planning.debug.json", + "producerPath": "src/documentation/v4/phase1Orientation.ts", + "status": "generated" + }, + { + "id": "top_business_flows_md_flow_catalog", + "label": "Flow Catalog", + "path": "machine/flow-catalog.json", + "producerPath": "src/documentation/v4/phase3_7FlowRanking.ts", + "status": "generated" + }, + { + "id": "top_business_flows_md_flow_selection", + "label": "Flow Selection", + "path": "machine/flow-selection.json", + "producerPath": "src/documentation/v4/phase3_7FlowRanking.ts", + "status": "generated" + }, + { + "id": "top_business_flows_md_business_map", + "label": "Business Map", + "path": "machine/business-map.json", + "producerPath": "src/documentation/v4/phase3_5BusinessUnderstanding.ts", + "status": "generated" + }, + { + "id": "top_business_flows_md_index_output", + "label": "Published Index", + "path": "index.md", + "producerPath": "src/documentation/v4/phase5Index.ts", + "status": "generated" + } + ] + }, + { + "id": "xref_top_business_flows_md_knowledge_question_semantic_search_flow", + "name": "Knowledge Question / Semantic Search Flow", + "category": "frontend-to-backend", + "entryNodeId": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "nodeIds": [ + "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "flow_method_nexusreader_maui_mauiprogram_cs_createmauiapp_12", + "flow_action_nexusreader_maui_mauiprogram_cs_createmauiapp_return_57_57", + "flow_type_nexusreader_maui_mauiprogram_cs_mauiprogram_10", + "flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28", + "flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29", + "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32", + "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33", + "flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38", + "flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1", + "flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51", + "flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53" + ], + "edgeIds": [ + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_method_nexusreader_maui_mauiprogram_cs_createmauiapp_12_invokes_12", + "edge_flow_method_nexusreader_maui_mauiprogram_cs_createmauiapp_12_flow_action_nexusreader_maui_mauiprogram_cs_createmauiapp_return_57_57_returns_57", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauiprogram_10_defines-type_10", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28_registers-service_28", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29_registers-service_29", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32_registers-service_32", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33_registers-service_33", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38_registers-service_38", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1_registers-service_1", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51_registers-service_51", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53_registers-service_53", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_method_nexusreader_maui_mauiprogram_cs_create_and_build_mauiapp_16_configures-pipeline_16", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15_invokes_15", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_getservice_71_invokes_71", + "edge_flow_method_nexusreader_web_client_program_cs_getservice_71_flow_action_nexusreader_web_client_program_cs_getservice_return_71_71_returns_71", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88_invokes_88" + ], + "confidence": "high", + "businessValue": 68, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 1 + } + ], + "businessSignals": [ + "trigger", + "validation-decision" + ], + "scoreBreakdown": { + "entrypointQuality": 25, + "crossLayerDepth": 0, + "businessSignals": 8, + "evidenceStrength": 20, + "contractCoverage": 15, + "total": 68 + }, + "validationIssues": [], + "recommendedDiagramKinds": [ + "primary-runtime", + "control-flow", + "dependency-map", + "class-diagram", + "method-flow" + ], + "producedArtifacts": [ + { + "id": "top_business_flows_md_phase_inputs", + "label": "Phase Inputs", + "path": "machine/phase-inputs/business__top-business-flows.phase-inputs.json", + "producerPath": "src/documentation/v4/phase4Generation.ts", + "status": "generated" + }, + { + "id": "top_business_flows_md_context_bag", + "label": "Context Bag", + "path": "machine/context-bags/top_business_flows.context-bag.json", + "producerPath": "src/documentation/v4/buildContextBags.ts", + "status": "generated" + }, + { + "id": "top_business_flows_md_planning_debug", + "label": "Planning Debug", + "path": "debug/planning.debug.json", + "producerPath": "src/documentation/v4/phase1Orientation.ts", + "status": "generated" + }, + { + "id": "top_business_flows_md_flow_catalog", + "label": "Flow Catalog", + "path": "machine/flow-catalog.json", + "producerPath": "src/documentation/v4/phase3_7FlowRanking.ts", + "status": "generated" + }, + { + "id": "top_business_flows_md_flow_selection", + "label": "Flow Selection", + "path": "machine/flow-selection.json", + "producerPath": "src/documentation/v4/phase3_7FlowRanking.ts", + "status": "generated" + }, + { + "id": "top_business_flows_md_business_map", + "label": "Business Map", + "path": "machine/business-map.json", + "producerPath": "src/documentation/v4/phase3_5BusinessUnderstanding.ts", + "status": "generated" + }, + { + "id": "top_business_flows_md_index_output", + "label": "Published Index", + "path": "index.md", + "producerPath": "src/documentation/v4/phase5Index.ts", + "status": "generated" + } + ] + }, + { + "id": "xref_top_business_flows_md_ebook_retrieval_ingestion_flow", + "name": "Ebook Retrieval / Ingestion Flow", + "category": "frontend-to-backend", + "entryNodeId": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "nodeIds": [ + "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "flow_method_nexusreader_maui_mauiprogram_cs_createmauiapp_12", + "flow_action_nexusreader_maui_mauiprogram_cs_createmauiapp_return_57_57", + "flow_type_nexusreader_maui_mauiprogram_cs_mauiprogram_10", + "flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28", + "flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29", + "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32", + "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33", + "flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38", + "flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1", + "flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51", + "flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53" + ], + "edgeIds": [ + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_method_nexusreader_maui_mauiprogram_cs_createmauiapp_12_invokes_12", + "edge_flow_method_nexusreader_maui_mauiprogram_cs_createmauiapp_12_flow_action_nexusreader_maui_mauiprogram_cs_createmauiapp_return_57_57_returns_57", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauiprogram_10_defines-type_10", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28_registers-service_28", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29_registers-service_29", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32_registers-service_32", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33_registers-service_33", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38_registers-service_38", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1_registers-service_1", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51_registers-service_51", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53_registers-service_53", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_method_nexusreader_maui_mauiprogram_cs_create_and_build_mauiapp_16_configures-pipeline_16", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15_invokes_15", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_getservice_71_invokes_71", + "edge_flow_method_nexusreader_web_client_program_cs_getservice_71_flow_action_nexusreader_web_client_program_cs_getservice_return_71_71_returns_71", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88_invokes_88" + ], + "confidence": "high", + "businessValue": 68, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 1 + } + ], + "businessSignals": [ + "trigger", + "validation-decision" + ], + "scoreBreakdown": { + "entrypointQuality": 25, + "crossLayerDepth": 0, + "businessSignals": 8, + "evidenceStrength": 20, + "contractCoverage": 15, + "total": 68 + }, + "validationIssues": [], + "recommendedDiagramKinds": [ + "primary-runtime", + "control-flow", + "dependency-map", + "class-diagram", + "method-flow" + ], + "producedArtifacts": [ + { + "id": "top_business_flows_md_phase_inputs", + "label": "Phase Inputs", + "path": "machine/phase-inputs/business__top-business-flows.phase-inputs.json", + "producerPath": "src/documentation/v4/phase4Generation.ts", + "status": "generated" + }, + { + "id": "top_business_flows_md_context_bag", + "label": "Context Bag", + "path": "machine/context-bags/top_business_flows.context-bag.json", + "producerPath": "src/documentation/v4/buildContextBags.ts", + "status": "generated" + }, + { + "id": "top_business_flows_md_planning_debug", + "label": "Planning Debug", + "path": "debug/planning.debug.json", + "producerPath": "src/documentation/v4/phase1Orientation.ts", + "status": "generated" + }, + { + "id": "top_business_flows_md_flow_catalog", + "label": "Flow Catalog", + "path": "machine/flow-catalog.json", + "producerPath": "src/documentation/v4/phase3_7FlowRanking.ts", + "status": "generated" + }, + { + "id": "top_business_flows_md_flow_selection", + "label": "Flow Selection", + "path": "machine/flow-selection.json", + "producerPath": "src/documentation/v4/phase3_7FlowRanking.ts", + "status": "generated" + }, + { + "id": "top_business_flows_md_business_map", + "label": "Business Map", + "path": "machine/business-map.json", + "producerPath": "src/documentation/v4/phase3_5BusinessUnderstanding.ts", + "status": "generated" + }, + { + "id": "top_business_flows_md_index_output", + "label": "Published Index", + "path": "index.md", + "producerPath": "src/documentation/v4/phase5Index.ts", + "status": "generated" + } + ] + }, + { + "id": "xref_top_business_flows_md_token_attach_refresh_flow_client_http", + "name": "Token Attach & Refresh Flow (Client HTTP)", + "category": "frontend-to-backend", + "entryNodeId": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "nodeIds": [ + "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "flow_method_nexusreader_maui_mauiprogram_cs_createmauiapp_12", + "flow_action_nexusreader_maui_mauiprogram_cs_createmauiapp_return_57_57", + "flow_type_nexusreader_maui_mauiprogram_cs_mauiprogram_10", + "flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28", + "flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29", + "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32", + "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33", + "flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38", + "flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1", + "flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51", + "flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53" + ], + "edgeIds": [ + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_method_nexusreader_maui_mauiprogram_cs_createmauiapp_12_invokes_12", + "edge_flow_method_nexusreader_maui_mauiprogram_cs_createmauiapp_12_flow_action_nexusreader_maui_mauiprogram_cs_createmauiapp_return_57_57_returns_57", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauiprogram_10_defines-type_10", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28_registers-service_28", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29_registers-service_29", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32_registers-service_32", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33_registers-service_33", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38_registers-service_38", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1_registers-service_1", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51_registers-service_51", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53_registers-service_53", + "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_method_nexusreader_maui_mauiprogram_cs_create_and_build_mauiapp_16_configures-pipeline_16", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15_invokes_15", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_getservice_71_invokes_71", + "edge_flow_method_nexusreader_web_client_program_cs_getservice_71_flow_action_nexusreader_web_client_program_cs_getservice_return_71_71_returns_71", + "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88_invokes_88" + ], + "confidence": "high", + "businessValue": 68, + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs" + ], + "evidenceReferences": [ + { + "path": "NexusReader.Maui/MauiProgram.cs", + "line": 1 + } + ], + "businessSignals": [ + "trigger", + "validation-decision" + ], + "scoreBreakdown": { + "entrypointQuality": 25, + "crossLayerDepth": 0, + "businessSignals": 8, + "evidenceStrength": 20, + "contractCoverage": 15, + "total": 68 + }, + "validationIssues": [], + "recommendedDiagramKinds": [ + "primary-runtime", + "control-flow", + "dependency-map", + "class-diagram", + "method-flow" + ], + "producedArtifacts": [ + { + "id": "top_business_flows_md_phase_inputs", + "label": "Phase Inputs", + "path": "machine/phase-inputs/business__top-business-flows.phase-inputs.json", + "producerPath": "src/documentation/v4/phase4Generation.ts", + "status": "generated" + }, + { + "id": "top_business_flows_md_context_bag", + "label": "Context Bag", + "path": "machine/context-bags/top_business_flows.context-bag.json", + "producerPath": "src/documentation/v4/buildContextBags.ts", + "status": "generated" + }, + { + "id": "top_business_flows_md_planning_debug", + "label": "Planning Debug", + "path": "debug/planning.debug.json", + "producerPath": "src/documentation/v4/phase1Orientation.ts", + "status": "generated" + }, + { + "id": "top_business_flows_md_flow_catalog", + "label": "Flow Catalog", + "path": "machine/flow-catalog.json", + "producerPath": "src/documentation/v4/phase3_7FlowRanking.ts", + "status": "generated" + }, + { + "id": "top_business_flows_md_flow_selection", + "label": "Flow Selection", + "path": "machine/flow-selection.json", + "producerPath": "src/documentation/v4/phase3_7FlowRanking.ts", + "status": "generated" + }, + { + "id": "top_business_flows_md_business_map", + "label": "Business Map", + "path": "machine/business-map.json", + "producerPath": "src/documentation/v4/phase3_5BusinessUnderstanding.ts", + "status": "generated" + }, + { + "id": "top_business_flows_md_index_output", + "label": "Published Index", + "path": "index.md", + "producerPath": "src/documentation/v4/phase5Index.ts", + "status": "generated" + } + ] + } + ] + }, + "testLinkMetadata": [] + }, + "generatedDiagrams": [ + { + "id": "dependency_map_graph", + "kind": "dependency-map", + "title": "Dependency and Model Map", + "direction": "TD", + "nodes": [ + { + "id": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "kind": "service", + "label": "MauiProgram", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 1 + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_mauiprogram_10", + "kind": "dependency", + "label": "MauiProgram", + "shape": "doc", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 10 + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28", + "kind": "dependency", + "label": "MauiPlatformService", + "shape": "doc", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 28 + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29", + "kind": "dependency", + "label": "MauiStorageService", + "shape": "doc", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 29 + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32", + "kind": "dependency", + "label": "NexusAuthenticationStateProvider", + "shape": "doc", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 32 + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33", + "kind": "dependency", + "label": "NexusAuthenticationStateProvider (via factory)", + "shape": "doc", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 33 + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38", + "kind": "dependency", + "label": "HttpClient (configured)", + "shape": "doc", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 38 + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1", + "kind": "dependency", + "label": "ThemeService, FocusModeService, QuizStateService, ReaderNavigationService, KnowledgeGraphService, ReaderInteractionService, KnowledgeCoordinator, SyncService, IdentityService", + "shape": "doc", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 1 + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51", + "kind": "dependency", + "label": "NexusReader.Application registrations", + "shape": "doc", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 51 + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53", + "kind": "dependency", + "label": "Handlers from NexusReader.Application assembly", + "shape": "doc", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 53 + }, + { + "id": "flow_file_nexusreader_web_client_program_cs_file_1", + "kind": "service", + "label": "Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 1 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61", + "kind": "dependency", + "label": "ThrowingDbContextFactory", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 61 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66", + "kind": "dependency", + "label": "ThrowingEmbeddingGenerator", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 66 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74", + "kind": "dependency", + "label": "ThrowingBookStorageService", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 74 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84", + "kind": "dependency", + "label": "ThrowingEbookRepository", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 84 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94", + "kind": "dependency", + "label": "ThrowingSyncBroadcaster", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 94 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_webplatformservice_18", + "kind": "dependency", + "label": "WebPlatformService", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 18 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33", + "kind": "dependency", + "label": "NexusAuthenticationStateProvider", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 33 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38", + "kind": "dependency", + "label": "WasmKnowledgeService", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 38 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_configured_httpclient_40", + "kind": "dependency", + "label": "configured HttpClient", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 40 + } + ], + "edges": [ + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauiprogram_10_defines_type_10", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_mauiprogram_10", + "semanticLabel": "model MauiProgram", + "visibleLabel": "model MauiProgram", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 10, + "includeInMetadata": true, + "payload": { + "outputSummary": "Static host for MAUI app startup logic and DI composition.", + "expandedLabel": "defines-type" + } + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28_registers_service_28", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28", + "semanticLabel": "IPlatformService", + "visibleLabel": "IPlatformService", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 28, + "includeInMetadata": true, + "payload": { + "outputSummary": "Registers platform abstraction implemented for MAUI", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29_registers_service_29", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29", + "semanticLabel": "INativeStorageService", + "visibleLabel": "INativeStorageService", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 29, + "includeInMetadata": true, + "payload": { + "outputSummary": "Registers platform native storage implementation", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32_registers_service_32", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32", + "semanticLabel": "NexusAuthenticationStateProvider", + "visibleLabel": "NexusAuthenticationStateProvider", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 32, + "includeInMetadata": true, + "payload": { + "outputSummary": "Concrete auth state provider registered", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33_registers_service_33", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33", + "semanticLabel": "Microsoft.AspNetCore.Components.Authorization.AuthenticationStateProvider", + "visibleLabel": "Microsoft.AspNetCore.Components.Authorization.AuthenticationStateProvider", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 33, + "includeInMetadata": true, + "payload": { + "outputSummary": "Maps framework AuthenticationStateProvider to NexusAuthenticationStateProvider via service locator factory", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38_registers_service_38", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38", + "semanticLabel": "HttpClient", + "visibleLabel": "HttpClient", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 38, + "includeInMetadata": true, + "payload": { + "outputSummary": "Registers HttpClient with BaseAddress = http://10.0.2.2:5000 (Android emulator to local server)", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1_registers_service_1", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1", + "semanticLabel": "UI and app state services", + "visibleLabel": "UI and app state services", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 1, + "includeInMetadata": true, + "payload": { + "outputSummary": "Registers multiple scoped services handling UI state, knowledge coordination, sync and identity", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51_registers_service_51", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51", + "semanticLabel": "Application layer services (extension)", + "visibleLabel": "Application layer services extension", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 51, + "includeInMetadata": true, + "payload": { + "outputSummary": "Calls AddApplication() extension to register Application-layer services", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53_registers_service_53", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53", + "semanticLabel": "MediatR handlers", + "visibleLabel": "MediatR handlers", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 53, + "includeInMetadata": true, + "payload": { + "outputSummary": "Registers MediatR and scans NexusReader.Application assembly for handlers", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61_defines_type_61", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61", + "semanticLabel": "model ThrowingDbContextFactory", + "visibleLabel": "model ThrowingDbContextFactory", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 61, + "includeInMetadata": true, + "payload": { + "outputSummary": "IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.", + "expandedLabel": "defines-type" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66_defines_type_66", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66", + "semanticLabel": "model ThrowingEmbeddingGenerator", + "visibleLabel": "model ThrowingEmbeddingGenerator", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 66, + "includeInMetadata": true, + "payload": { + "outputSummary": "IEmbeddingGenerator implementation that disables local embedding generation in WASM (throws on GenerateAsync).", + "expandedLabel": "defines-type" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74_defines_type_74", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74", + "semanticLabel": "model ThrowingBookStorageService", + "visibleLabel": "model ThrowingBookStorageService", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 74, + "includeInMetadata": true, + "payload": { + "outputSummary": "IBookStorageService implementation that throws for all file storage operations in WASM.", + "expandedLabel": "defines-type" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84_defines_type_84", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84", + "semanticLabel": "model ThrowingEbookRepository", + "visibleLabel": "model ThrowingEbookRepository", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 84, + "includeInMetadata": true, + "payload": { + "outputSummary": "IEbookRepository implementation that throws for all repository operations in WASM.", + "expandedLabel": "defines-type" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94_defines_type_94", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94", + "semanticLabel": "model ThrowingSyncBroadcaster", + "visibleLabel": "model ThrowingSyncBroadcaster", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 94, + "includeInMetadata": true, + "payload": { + "outputSummary": "ISyncBroadcaster implementation that throws because real-time broadcasting must run on the server.", + "expandedLabel": "defines-type" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_webplatformservice_18_registers_service_18", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_webplatformservice_18", + "semanticLabel": "IPlatformService", + "visibleLabel": "IPlatformService", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 18, + "includeInMetadata": true, + "payload": { + "outputSummary": "Registers platform abstraction for browser.", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33_registers_service_33", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33", + "semanticLabel": "NexusAuthenticationStateProvider", + "visibleLabel": "NexusAuthenticationStateProvider", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 33, + "includeInMetadata": true, + "payload": { + "outputSummary": "Authentication state provider and wiring to AuthenticationStateProvider.", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38_registers_service_38", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38", + "semanticLabel": "IKnowledgeService", + "visibleLabel": "IKnowledgeService", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 38, + "includeInMetadata": true, + "payload": { + "outputSummary": "Registers a WASM-specific knowledge service implementation.", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_configured_httpclient_40_registers_service_40", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_configured_httpclient_40", + "semanticLabel": "HttpClient (named 'NexusAPI')", + "visibleLabel": "uses", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 40, + "includeInMetadata": true, + "payload": { + "outputSummary": "Adds named HTTP client with base address and authentication header handler.", + "expandedLabel": "registers-service" + } + } + ], + "metadata": { + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs", + "NexusReader.Web.Client/Program.cs", + "NexusReader.Web/Program.cs", + "NexusReader.Application/DependencyInjection.cs", + "NexusReader.Infrastructure/DependencyInjection.cs", + "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "NexusReader.Application/DTOs/User/AuthorDto.cs", + "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "NexusReader.Domain/Entities/Author.cs", + "NexusReader.UI.Shared/Layout/AuthLayout.razor", + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "NexusReader.UI.Shared/Pages/Account/Login.razor", + "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "NexusReader.UI.Shared/Pages/Account/Register.razor", + "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "NexusReader.Infrastructure/Services/BookStorageService.cs", + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs" + ] + }, + "subgraphs": [] + }, + { + "id": "startup_runtime_graph", + "kind": "primary-runtime", + "title": "Startup and Service Registration Flow", + "direction": "TD", + "nodes": [ + { + "id": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "kind": "service", + "label": "MauiProgram", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 1 + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28", + "kind": "dependency", + "label": "MauiPlatformService", + "shape": "doc", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 28 + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29", + "kind": "dependency", + "label": "MauiStorageService", + "shape": "doc", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 29 + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32", + "kind": "dependency", + "label": "NexusAuthenticationStateProvider", + "shape": "doc", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 32 + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33", + "kind": "dependency", + "label": "NexusAuthenticationStateProvider (via factory)", + "shape": "doc", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 33 + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38", + "kind": "dependency", + "label": "HttpClient (configured)", + "shape": "doc", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 38 + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1", + "kind": "dependency", + "label": "ThemeService, FocusModeService, QuizStateService, ReaderNavigationService, KnowledgeGraphService, ReaderInteractionService, KnowledgeCoordinator, SyncService, IdentityService", + "shape": "doc", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 1 + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51", + "kind": "dependency", + "label": "NexusReader.Application registrations", + "shape": "doc", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 51 + }, + { + "id": "flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53", + "kind": "dependency", + "label": "Handlers from NexusReader.Application assembly", + "shape": "doc", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 53 + }, + { + "id": "flow_method_nexusreader_maui_mauiprogram_cs_create_and_build_mauiapp_16", + "kind": "method", + "label": "Create and build MauiApp", + "sourcePath": "NexusReader.Maui/MauiProgram.cs", + "sourceLine": 16 + }, + { + "id": "flow_file_nexusreader_web_client_program_cs_file_1", + "kind": "service", + "label": "Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 1 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_webplatformservice_18", + "kind": "dependency", + "label": "WebPlatformService", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 18 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33", + "kind": "dependency", + "label": "NexusAuthenticationStateProvider", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 33 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38", + "kind": "dependency", + "label": "WasmKnowledgeService", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 38 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_configured_httpclient_40", + "kind": "dependency", + "label": "configured HttpClient", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 40 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49", + "kind": "dependency", + "label": "ThrowingDbContextFactory", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 49 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_n_a_55", + "kind": "dependency", + "label": "N/A", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 55 + } + ], + "edges": [ + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28_registers_service_28", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_mauiplatformservice_28", + "semanticLabel": "IPlatformService", + "visibleLabel": "IPlatformService", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 28, + "includeInMetadata": true, + "payload": { + "outputSummary": "Registers platform abstraction implemented for MAUI", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29_registers_service_29", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_mauistorageservice_29", + "semanticLabel": "INativeStorageService", + "visibleLabel": "INativeStorageService", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 29, + "includeInMetadata": true, + "payload": { + "outputSummary": "Registers platform native storage implementation", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32_registers_service_32", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_32", + "semanticLabel": "NexusAuthenticationStateProvider", + "visibleLabel": "NexusAuthenticationStateProvider", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 32, + "includeInMetadata": true, + "payload": { + "outputSummary": "Concrete auth state provider registered", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33_registers_service_33", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_nexusauthenticationstateprovider_via_factory_33", + "semanticLabel": "Microsoft.AspNetCore.Components.Authorization.AuthenticationStateProvider", + "visibleLabel": "Microsoft.AspNetCore.Components.Authorization.AuthenticationStateProvider", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 33, + "includeInMetadata": true, + "payload": { + "outputSummary": "Maps framework AuthenticationStateProvider to NexusAuthenticationStateProvider via service locator factory", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38_registers_service_38", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_httpclient_configured_38", + "semanticLabel": "HttpClient", + "visibleLabel": "HttpClient", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 38, + "includeInMetadata": true, + "payload": { + "outputSummary": "Registers HttpClient with BaseAddress = http://10.0.2.2:5000 (Android emulator to local server)", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1_registers_service_1", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_themeservice_focusmodeservice_quizstateservice_readernavigationservice_knowledgegraphservice_readerinteractionservice_knowledgecoordinator_syncservice_identityservice_1", + "semanticLabel": "UI and app state services", + "visibleLabel": "UI and app state services", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 1, + "includeInMetadata": true, + "payload": { + "outputSummary": "Registers multiple scoped services handling UI state, knowledge coordination, sync and identity", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51_registers_service_51", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_nexusreader_application_registrations_51", + "semanticLabel": "Application layer services (extension)", + "visibleLabel": "Application layer services extension", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 51, + "includeInMetadata": true, + "payload": { + "outputSummary": "Calls AddApplication() extension to register Application-layer services", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53_registers_service_53", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_type_nexusreader_maui_mauiprogram_cs_handlers_from_nexusreader_application_assembly_53", + "semanticLabel": "MediatR handlers", + "visibleLabel": "MediatR handlers", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 53, + "includeInMetadata": true, + "payload": { + "outputSummary": "Registers MediatR and scans NexusReader.Application assembly for handlers", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_maui_mauiprogram_cs_file_1_flow_method_nexusreader_maui_mauiprogram_cs_create_and_build_mauiapp_16_configures_pipeline_16", + "from": "flow_file_nexusreader_maui_mauiprogram_cs_file_1", + "to": "flow_method_nexusreader_maui_mauiprogram_cs_create_and_build_mauiapp_16", + "semanticLabel": "unknown", + "visibleLabel": "unknown", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Maui/MauiProgram.cs", + "sourceLine": 16, + "includeInMetadata": true, + "payload": { + "outputSummary": "unknown", + "expandedLabel": "configures-pipeline" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_webplatformservice_18_registers_service_18", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_webplatformservice_18", + "semanticLabel": "IPlatformService", + "visibleLabel": "IPlatformService", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 18, + "includeInMetadata": true, + "payload": { + "outputSummary": "Registers platform abstraction for browser.", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33_registers_service_33", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33", + "semanticLabel": "NexusAuthenticationStateProvider", + "visibleLabel": "NexusAuthenticationStateProvider", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 33, + "includeInMetadata": true, + "payload": { + "outputSummary": "Authentication state provider and wiring to AuthenticationStateProvider.", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38_registers_service_38", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38", + "semanticLabel": "IKnowledgeService", + "visibleLabel": "IKnowledgeService", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 38, + "includeInMetadata": true, + "payload": { + "outputSummary": "Registers a WASM-specific knowledge service implementation.", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_configured_httpclient_40_registers_service_40", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_configured_httpclient_40", + "semanticLabel": "HttpClient (named 'NexusAPI')", + "visibleLabel": "uses", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 40, + "includeInMetadata": true, + "payload": { + "outputSummary": "Adds named HTTP client with base address and authentication header handler.", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49_registers_service_49", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49", + "semanticLabel": "IDbContextFactory", + "visibleLabel": "IDbContextFactory AppDbContext>", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 49, + "includeInMetadata": true, + "payload": { + "outputSummary": "Registers throw-only stub to avoid using DbContext in WASM.", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_n_a_55_registers_service_55", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_n_a_55", + "semanticLabel": "application services (via extension)", + "visibleLabel": "application services via extension", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 55, + "includeInMetadata": true, + "payload": { + "outputSummary": "Calls AddApplication() to register application-layer services.", + "expandedLabel": "registers-service" + } + } + ], + "subgraphs": [ + { + "id": "flow_1_nexusreader_web_client_program_cs", + "label": "Program.cs" + }, + { + "id": "flow_2_nexusreader_maui_mauiprogram_cs", + "label": "MauiProgram" + }, + { + "id": "Node_xref_top_business_flows_md_user_authentication_login_register_flow", + "label": "User Authentication (Login/Register) Flow" + }, + { + "id": "Node_xref_top_business_flows_md_knowledge_question_semantic_search_flow", + "label": "Knowledge Question / Semantic Search Flow" + }, + { + "id": "Node_xref_top_business_flows_md_ebook_retrieval_ingestion_flow", + "label": "Ebook Retrieval / Ingestion Flow" + } + ], + "metadata": { + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs", + "NexusReader.Web.Client/Program.cs", + "NexusReader.Web/Program.cs", + "NexusReader.Application/DependencyInjection.cs", + "NexusReader.Infrastructure/DependencyInjection.cs", + "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "NexusReader.Application/DTOs/User/AuthorDto.cs", + "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "NexusReader.Domain/Entities/Author.cs", + "NexusReader.UI.Shared/Layout/AuthLayout.razor", + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "NexusReader.UI.Shared/Pages/Account/Login.razor", + "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "NexusReader.UI.Shared/Pages/Account/Register.razor", + "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "NexusReader.Infrastructure/Services/BookStorageService.cs", + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs" + ] + } + }, + { + "id": "primary_runtime_flow_1_nexusreader_web_client_program_cs", + "kind": "primary-runtime", + "title": "Program.cs Flow", + "direction": "TD", + "nodes": [ + { + "id": "flow_file_nexusreader_web_client_program_cs_file_1", + "kind": "service", + "label": "Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 1 + }, + { + "id": "flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15", + "kind": "method", + "label": "Program (top-level startup)", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 15 + }, + { + "id": "flow_method_nexusreader_web_client_program_cs_getservice_71", + "kind": "method", + "label": "GetService", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 71 + }, + { + "id": "flow_action_nexusreader_web_client_program_cs_getservice_return_71_71", + "kind": "return", + "label": "returns null", + "shape": "stadium", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 71 + }, + { + "id": "flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88", + "kind": "method", + "label": "FindAuthorByNameAsync", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 88 + }, + { + "id": "flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88", + "kind": "step", + "label": "Reads repository or persistence state", + "shape": "rect", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 88 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61", + "kind": "dependency", + "label": "ThrowingDbContextFactory", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 61 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66", + "kind": "dependency", + "label": "ThrowingEmbeddingGenerator", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 66 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74", + "kind": "dependency", + "label": "ThrowingBookStorageService", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 74 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84", + "kind": "dependency", + "label": "ThrowingEbookRepository", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 84 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94", + "kind": "dependency", + "label": "ThrowingSyncBroadcaster", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 94 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_webplatformservice_18", + "kind": "dependency", + "label": "WebPlatformService", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 18 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33", + "kind": "dependency", + "label": "NexusAuthenticationStateProvider", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 33 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38", + "kind": "dependency", + "label": "WasmKnowledgeService", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 38 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_configured_httpclient_40", + "kind": "dependency", + "label": "configured HttpClient", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 40 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49", + "kind": "dependency", + "label": "ThrowingDbContextFactory", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 49 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_n_a_55", + "kind": "dependency", + "label": "N/A", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 55 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_wasmepubreader_56", + "kind": "dependency", + "label": "WasmEpubReader", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 56 + }, + { + "id": "flow_method_nexusreader_web_client_program_cs_run_wasm_host_59", + "kind": "method", + "label": "Run WASM Host", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 59 + }, + { + "id": "flow_file_nexusreader_web_program_cs_file_1", + "kind": "service", + "label": "Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 1 + }, + { + "id": "flow_method_nexusreader_web_program_cs_program_top_level_29", + "kind": "method", + "label": "Program (top-level)", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 29 + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "kind": "step", + "label": "Evaluates branch condition", + "shape": "diamond", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 62 + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "kind": "step", + "label": "Falls back to alternate path", + "shape": "diamond", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 66 + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125", + "kind": "step", + "label": "Reads repository or persistence state", + "shape": "rect", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 125 + } + ], + "edges": [ + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15_invokes_15", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15", + "semanticLabel": "Program (top-level startup)", + "visibleLabel": "Program top-level startup", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 15, + "includeInMetadata": true, + "payload": { + "outputSummary": "Create the WebAssemblyHostBuilder, register application and platform services, add HTTP client and dummy server-only stubs, then build and run the WASM host.", + "expandedLabel": "handles-route" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_getservice_71_invokes_71", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_method_nexusreader_web_client_program_cs_getservice_71", + "semanticLabel": "GetService", + "visibleLabel": "GetService", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 71, + "includeInMetadata": true, + "payload": { + "outputSummary": "Fallback service resolver stub that always returns null.", + "expandedLabel": "handles-route" + } + }, + { + "id": "edge_flow_method_nexusreader_web_client_program_cs_getservice_71_flow_action_nexusreader_web_client_program_cs_getservice_return_71_71_returns_71", + "from": "flow_method_nexusreader_web_client_program_cs_getservice_71", + "to": "flow_action_nexusreader_web_client_program_cs_getservice_return_71_71", + "semanticLabel": "returns null", + "visibleLabel": "returns null", + "relation": "returns", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 71, + "includeInMetadata": true, + "payload": { + "outputSummary": "public object? GetService(...) => null", + "expandedLabel": "returns" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88_invokes_88", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88", + "semanticLabel": "FindAuthorByNameAsync", + "visibleLabel": "FindAuthorByNameAsync", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 88, + "includeInMetadata": true, + "payload": { + "outputSummary": "Repository lookup stub that throws because repository access is unsupported in WASM.", + "expandedLabel": "handles-route" + } + }, + { + "id": "edge_flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88_flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88_invokes_88", + "from": "flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88", + "to": "flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88", + "semanticLabel": "Reads repository or persistence state", + "visibleLabel": "Reads repository or persistence state", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 88, + "includeInMetadata": true, + "payload": { + "outputSummary": "public Task FindAuthorByNameAsync(string name, CancellationToken cancellationToken = default) => throw new NotSupportedException(ErrorMessage);", + "expandedLabel": "invokes" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61_defines_type_61", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61", + "semanticLabel": "model ThrowingDbContextFactory", + "visibleLabel": "model ThrowingDbContextFactory", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 61, + "includeInMetadata": true, + "payload": { + "outputSummary": "IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.", + "expandedLabel": "defines-type" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66_defines_type_66", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66", + "semanticLabel": "model ThrowingEmbeddingGenerator", + "visibleLabel": "model ThrowingEmbeddingGenerator", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 66, + "includeInMetadata": true, + "payload": { + "outputSummary": "IEmbeddingGenerator implementation that disables local embedding generation in WASM (throws on GenerateAsync).", + "expandedLabel": "defines-type" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74_defines_type_74", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74", + "semanticLabel": "model ThrowingBookStorageService", + "visibleLabel": "model ThrowingBookStorageService", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 74, + "includeInMetadata": true, + "payload": { + "outputSummary": "IBookStorageService implementation that throws for all file storage operations in WASM.", + "expandedLabel": "defines-type" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84_defines_type_84", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84", + "semanticLabel": "model ThrowingEbookRepository", + "visibleLabel": "model ThrowingEbookRepository", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 84, + "includeInMetadata": true, + "payload": { + "outputSummary": "IEbookRepository implementation that throws for all repository operations in WASM.", + "expandedLabel": "defines-type" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94_defines_type_94", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94", + "semanticLabel": "model ThrowingSyncBroadcaster", + "visibleLabel": "model ThrowingSyncBroadcaster", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 94, + "includeInMetadata": true, + "payload": { + "outputSummary": "ISyncBroadcaster implementation that throws because real-time broadcasting must run on the server.", + "expandedLabel": "defines-type" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_webplatformservice_18_registers_service_18", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_webplatformservice_18", + "semanticLabel": "IPlatformService", + "visibleLabel": "IPlatformService", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 18, + "includeInMetadata": true, + "payload": { + "outputSummary": "Registers platform abstraction for browser.", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33_registers_service_33", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33", + "semanticLabel": "NexusAuthenticationStateProvider", + "visibleLabel": "NexusAuthenticationStateProvider", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 33, + "includeInMetadata": true, + "payload": { + "outputSummary": "Authentication state provider and wiring to AuthenticationStateProvider.", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38_registers_service_38", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38", + "semanticLabel": "IKnowledgeService", + "visibleLabel": "IKnowledgeService", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 38, + "includeInMetadata": true, + "payload": { + "outputSummary": "Registers a WASM-specific knowledge service implementation.", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_configured_httpclient_40_registers_service_40", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_configured_httpclient_40", + "semanticLabel": "HttpClient (named 'NexusAPI')", + "visibleLabel": "uses", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 40, + "includeInMetadata": true, + "payload": { + "outputSummary": "Adds named HTTP client with base address and authentication header handler.", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49_registers_service_49", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49", + "semanticLabel": "IDbContextFactory", + "visibleLabel": "IDbContextFactory AppDbContext>", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 49, + "includeInMetadata": true, + "payload": { + "outputSummary": "Registers throw-only stub to avoid using DbContext in WASM.", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_n_a_55_registers_service_55", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_n_a_55", + "semanticLabel": "application services (via extension)", + "visibleLabel": "application services via extension", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 55, + "includeInMetadata": true, + "payload": { + "outputSummary": "Calls AddApplication() to register application-layer services.", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_wasmepubreader_56_registers_service_56", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_wasmepubreader_56", + "semanticLabel": "IEpubReader", + "visibleLabel": "IEpubReader", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 56, + "includeInMetadata": true, + "payload": { + "outputSummary": "Registers WASM epub reader implementation.", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_run_wasm_host_59_configures_pipeline_59", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_method_nexusreader_web_client_program_cs_run_wasm_host_59", + "semanticLabel": "unknown", + "visibleLabel": "unknown", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 59, + "includeInMetadata": true, + "payload": { + "outputSummary": "unknown", + "expandedLabel": "configures-pipeline" + } + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_method_nexusreader_web_program_cs_program_top_level_29_invokes_29", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_method_nexusreader_web_program_cs_program_top_level_29", + "semanticLabel": "Program (top-level)", + "visibleLabel": "Program top-level", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 29, + "includeInMetadata": true, + "payload": { + "outputSummary": "Top-level program: build host, register services and middleware, map routes/endpoints, run the app.", + "expandedLabel": "handles-route" + } + }, + { + "id": "edge_flow_method_nexusreader_web_program_cs_program_top_level_29_flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62_evaluates_condition_62", + "from": "flow_method_nexusreader_web_program_cs_program_top_level_29", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "semanticLabel": "true / false", + "visibleLabel": "true / false", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 62, + "includeInMetadata": true, + "payload": { + "outputSummary": "if (!string.IsNullOrEmpty(apiBaseUrl))", + "expandedLabel": "evaluates-condition" + } + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_falls_back_66", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "semanticLabel": "fallback", + "visibleLabel": "fallback", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 66, + "includeInMetadata": true, + "payload": { + "outputSummary": "else", + "expandedLabel": "falls-back" + } + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125_invokes_125", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125", + "semanticLabel": "Reads repository or persistence state", + "visibleLabel": "Reads repository or persistence state", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 125, + "includeInMetadata": true, + "payload": { + "outputSummary": "var isApiRequest = context.Request.Path.StartsWithSegments(\"/api\") ||", + "expandedLabel": "invokes" + } + } + ], + "subgraphs": [ + { + "id": "flow_1_nexusreader_web_client_program_cs", + "label": "Program.cs" + }, + { + "id": "flow_2_nexusreader_maui_mauiprogram_cs", + "label": "MauiProgram" + }, + { + "id": "flow_0_nexusreader_web_program_cs", + "label": "Program.cs" + } + ], + "metadata": { + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs", + "NexusReader.Web.Client/Program.cs", + "NexusReader.Web/Program.cs", + "NexusReader.Application/DependencyInjection.cs", + "NexusReader.Infrastructure/DependencyInjection.cs", + "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "NexusReader.Application/DTOs/User/AuthorDto.cs", + "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "NexusReader.Domain/Entities/Author.cs", + "NexusReader.UI.Shared/Layout/AuthLayout.razor", + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "NexusReader.UI.Shared/Pages/Account/Login.razor", + "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "NexusReader.UI.Shared/Pages/Account/Register.razor", + "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "NexusReader.Infrastructure/Services/BookStorageService.cs", + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs" + ] + } + }, + { + "id": "control_flow_flow_1_nexusreader_web_client_program_cs", + "kind": "control-flow", + "title": "Program.cs Execution Control Flow", + "direction": "TD", + "nodes": [ + { + "id": "flow_file_nexusreader_web_client_program_cs_file_1", + "kind": "service", + "label": "Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 1 + }, + { + "id": "flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15", + "kind": "method", + "label": "Program (top-level startup)", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 15 + }, + { + "id": "flow_method_nexusreader_web_client_program_cs_getservice_71", + "kind": "method", + "label": "GetService", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 71 + }, + { + "id": "flow_action_nexusreader_web_client_program_cs_getservice_return_71_71", + "kind": "return", + "label": "returns null", + "shape": "stadium", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 71 + }, + { + "id": "flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88", + "kind": "method", + "label": "FindAuthorByNameAsync", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 88 + }, + { + "id": "flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88", + "kind": "step", + "label": "Reads repository or persistence state", + "shape": "rect", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 88 + }, + { + "id": "flow_method_nexusreader_web_client_program_cs_run_wasm_host_59", + "kind": "method", + "label": "Run WASM Host", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 59 + }, + { + "id": "flow_file_nexusreader_web_program_cs_file_1", + "kind": "service", + "label": "Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 1 + }, + { + "id": "flow_method_nexusreader_web_program_cs_program_top_level_29", + "kind": "method", + "label": "Program (top-level)", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 29 + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "kind": "step", + "label": "Evaluates branch condition", + "shape": "diamond", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 62 + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "kind": "step", + "label": "Falls back to alternate path", + "shape": "diamond", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 66 + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125", + "kind": "step", + "label": "Reads repository or persistence state", + "shape": "rect", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 125 + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_126_126", + "kind": "step", + "label": "Reads repository or persistence state", + "shape": "rect", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 126 + }, + { + "id": "flow_method_nexusreader_application_dependencyinjection_cs_addapplication_8", + "kind": "method", + "label": "AddApplication", + "sourcePath": "NexusReader.Application/DependencyInjection.cs", + "sourceLine": 8 + }, + { + "id": "flow_method_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_31", + "kind": "method", + "label": "AddInfrastructure", + "sourcePath": "NexusReader.Infrastructure/DependencyInjection.cs", + "sourceLine": 31 + } + ], + "edges": [ + { + "id": "edge_flow_method_nexusreader_web_client_program_cs_getservice_71_flow_action_nexusreader_web_client_program_cs_getservice_return_71_71_returns_71", + "from": "flow_method_nexusreader_web_client_program_cs_getservice_71", + "to": "flow_action_nexusreader_web_client_program_cs_getservice_return_71_71", + "semanticLabel": "returns null", + "visibleLabel": "returns null", + "relation": "returns", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 71, + "includeInMetadata": true, + "payload": { + "outputSummary": "public object? GetService(...) => null", + "expandedLabel": "returns" + } + }, + { + "id": "edge_flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88_flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88_invokes_88", + "from": "flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88", + "to": "flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88", + "semanticLabel": "Reads repository or persistence state", + "visibleLabel": "Reads repository or persistence state", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 88, + "includeInMetadata": true, + "payload": { + "outputSummary": "public Task FindAuthorByNameAsync(string name, CancellationToken cancellationToken = default) => throw new NotSupportedException(ErrorMessage);", + "expandedLabel": "invokes" + } + }, + { + "id": "edge_flow_method_nexusreader_web_program_cs_program_top_level_29_flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62_evaluates_condition_62", + "from": "flow_method_nexusreader_web_program_cs_program_top_level_29", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "semanticLabel": "true / false", + "visibleLabel": "true / false", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 62, + "includeInMetadata": true, + "payload": { + "outputSummary": "if (!string.IsNullOrEmpty(apiBaseUrl))", + "expandedLabel": "evaluates-condition" + } + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_falls_back_66", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "semanticLabel": "fallback", + "visibleLabel": "fallback", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 66, + "includeInMetadata": true, + "payload": { + "outputSummary": "else", + "expandedLabel": "falls-back" + } + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125_invokes_125", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125", + "semanticLabel": "Reads repository or persistence state", + "visibleLabel": "Reads repository or persistence state", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 125, + "includeInMetadata": true, + "payload": { + "outputSummary": "var isApiRequest = context.Request.Path.StartsWithSegments(\"/api\") ||", + "expandedLabel": "invokes" + } + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125_flow_action_nexusreader_web_program_cs_program_top_level_repository_read_126_126_invokes_126", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_125_125", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_repository_read_126_126", + "semanticLabel": "Reads repository or persistence state", + "visibleLabel": "Reads repository or persistence state", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 126, + "includeInMetadata": true, + "payload": { + "outputSummary": "context.Request.Path.StartsWithSegments(\"/identity\") ||", + "expandedLabel": "invokes" + } + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_flow_method_nexusreader_application_dependencyinjection_cs_addapplication_8_uses_service_78", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "to": "flow_method_nexusreader_application_dependencyinjection_cs_addapplication_8", + "semanticLabel": "AddApplication", + "visibleLabel": "AddApplication", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 78, + "includeInMetadata": true, + "payload": { + "outputSummary": "IServiceCollection", + "expandedLabel": "uses-service" + } + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_flow_method_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_31_uses_service_79", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "to": "flow_method_nexusreader_infrastructure_dependencyinjection_cs_addinfrastructure_31", + "semanticLabel": "AddInfrastructure", + "visibleLabel": "AddInfrastructure", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 79, + "includeInMetadata": true, + "payload": { + "outputSummary": "IServiceCollection, IConfiguration", + "expandedLabel": "uses-service" + } + } + ], + "subgraphs": [ + { + "id": "NexusReader_Web_Client_Program", + "label": "Program" + }, + { + "id": "NexusReader_Web_Program", + "label": "Program" + }, + { + "id": "NexusReader_Application_DependencyInjection", + "label": "DependencyInjection" + }, + { + "id": "NexusReader_Infrastructure_DependencyInjection", + "label": "DependencyInjection" + } + ], + "metadata": { + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs", + "NexusReader.Web.Client/Program.cs", + "NexusReader.Web/Program.cs", + "NexusReader.Application/DependencyInjection.cs", + "NexusReader.Infrastructure/DependencyInjection.cs", + "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "NexusReader.Application/DTOs/User/AuthorDto.cs", + "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "NexusReader.Domain/Entities/Author.cs", + "NexusReader.UI.Shared/Layout/AuthLayout.razor", + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "NexusReader.UI.Shared/Pages/Account/Login.razor", + "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "NexusReader.UI.Shared/Pages/Account/Register.razor", + "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "NexusReader.Infrastructure/Services/BookStorageService.cs", + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs" + ] + } + }, + { + "id": "contracts_flow_1_nexusreader_web_client_program_cs", + "kind": "class-diagram", + "title": "Program.cs Contracts and Entities", + "direction": "LR", + "nodes": [ + { + "id": "flow_file_nexusreader_web_client_program_cs_file_1", + "kind": "service", + "label": "Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 1 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61", + "kind": "dependency", + "label": "ThrowingDbContextFactory", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 61 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66", + "kind": "dependency", + "label": "ThrowingEmbeddingGenerator", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 66 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74", + "kind": "dependency", + "label": "ThrowingBookStorageService", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 74 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84", + "kind": "dependency", + "label": "ThrowingEbookRepository", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 84 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94", + "kind": "dependency", + "label": "ThrowingSyncBroadcaster", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 94 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_webplatformservice_18", + "kind": "dependency", + "label": "WebPlatformService", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 18 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33", + "kind": "dependency", + "label": "NexusAuthenticationStateProvider", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 33 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38", + "kind": "dependency", + "label": "WasmKnowledgeService", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 38 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_configured_httpclient_40", + "kind": "dependency", + "label": "configured HttpClient", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 40 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49", + "kind": "dependency", + "label": "ThrowingDbContextFactory", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 49 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_n_a_55", + "kind": "dependency", + "label": "N/A", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 55 + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_wasmepubreader_56", + "kind": "dependency", + "label": "WasmEpubReader", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 56 + }, + { + "id": "flow_file_nexusreader_web_program_cs_file_1", + "kind": "service", + "label": "Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 1 + }, + { + "id": "flow_type_nexusreader_web_program_cs_knowledgerequest_566", + "kind": "dependency", + "label": "KnowledgeRequest", + "shape": "doc", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 566 + }, + { + "id": "flow_type_nexusreader_web_program_cs_groundednessrequest_567", + "kind": "dependency", + "label": "GroundednessRequest", + "shape": "doc", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 567 + }, + { + "id": "flow_type_nexusreader_web_program_cs_semanticsearchrequest_568", + "kind": "dependency", + "label": "SemanticSearchRequest", + "shape": "doc", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 568 + }, + { + "id": "flow_type_nexusreader_web_program_cs_askquestionrequest_569", + "kind": "dependency", + "label": "AskQuestionRequest", + "shape": "doc", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 569 + } + ], + "edges": [ + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61_defines_type_61", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61", + "semanticLabel": "model ThrowingDbContextFactory", + "visibleLabel": "model ThrowingDbContextFactory", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 61, + "includeInMetadata": true, + "payload": { + "outputSummary": "IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.", + "expandedLabel": "defines-type" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66_defines_type_66", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66", + "semanticLabel": "model ThrowingEmbeddingGenerator", + "visibleLabel": "model ThrowingEmbeddingGenerator", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 66, + "includeInMetadata": true, + "payload": { + "outputSummary": "IEmbeddingGenerator implementation that disables local embedding generation in WASM (throws on GenerateAsync).", + "expandedLabel": "defines-type" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74_defines_type_74", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74", + "semanticLabel": "model ThrowingBookStorageService", + "visibleLabel": "model ThrowingBookStorageService", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 74, + "includeInMetadata": true, + "payload": { + "outputSummary": "IBookStorageService implementation that throws for all file storage operations in WASM.", + "expandedLabel": "defines-type" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84_defines_type_84", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84", + "semanticLabel": "model ThrowingEbookRepository", + "visibleLabel": "model ThrowingEbookRepository", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 84, + "includeInMetadata": true, + "payload": { + "outputSummary": "IEbookRepository implementation that throws for all repository operations in WASM.", + "expandedLabel": "defines-type" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94_defines_type_94", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94", + "semanticLabel": "model ThrowingSyncBroadcaster", + "visibleLabel": "model ThrowingSyncBroadcaster", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 94, + "includeInMetadata": true, + "payload": { + "outputSummary": "ISyncBroadcaster implementation that throws because real-time broadcasting must run on the server.", + "expandedLabel": "defines-type" + } + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_knowledgerequest_566_maps_dto_566", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_type_nexusreader_web_program_cs_knowledgerequest_566", + "semanticLabel": "dto KnowledgeRequest", + "visibleLabel": "dto KnowledgeRequest", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 566, + "includeInMetadata": true, + "payload": { + "outputSummary": "Request DTO carrying free-text input and optional ebook context for knowledge APIs.", + "expandedLabel": "maps-dto" + } + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_groundednessrequest_567_maps_dto_567", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_type_nexusreader_web_program_cs_groundednessrequest_567", + "semanticLabel": "dto GroundednessRequest", + "visibleLabel": "dto GroundednessRequest", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 567, + "includeInMetadata": true, + "payload": { + "outputSummary": "Request DTO for verifying answer groundedness in a context.", + "expandedLabel": "maps-dto" + } + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_semanticsearchrequest_568_maps_dto_568", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_type_nexusreader_web_program_cs_semanticsearchrequest_568", + "semanticLabel": "dto SemanticSearchRequest", + "visibleLabel": "dto SemanticSearchRequest", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 568, + "includeInMetadata": true, + "payload": { + "outputSummary": "DTO for semantic search requests with a limit.", + "expandedLabel": "maps-dto" + } + }, + { + "id": "edge_flow_file_nexusreader_web_program_cs_file_1_flow_type_nexusreader_web_program_cs_askquestionrequest_569_maps_dto_569", + "from": "flow_file_nexusreader_web_program_cs_file_1", + "to": "flow_type_nexusreader_web_program_cs_askquestionrequest_569", + "semanticLabel": "dto AskQuestionRequest", + "visibleLabel": "dto AskQuestionRequest", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 569, + "includeInMetadata": true, + "payload": { + "outputSummary": "DTO for question-asking APIs including optional ebook context and limit.", + "expandedLabel": "maps-dto" + } + } + ], + "metadata": { + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs", + "NexusReader.Web.Client/Program.cs", + "NexusReader.Web/Program.cs", + "NexusReader.Application/DependencyInjection.cs", + "NexusReader.Infrastructure/DependencyInjection.cs", + "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "NexusReader.Application/DTOs/User/AuthorDto.cs", + "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "NexusReader.Domain/Entities/Author.cs", + "NexusReader.UI.Shared/Layout/AuthLayout.razor", + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "NexusReader.UI.Shared/Pages/Account/Login.razor", + "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "NexusReader.UI.Shared/Pages/Account/Register.razor", + "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "NexusReader.Infrastructure/Services/BookStorageService.cs", + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs" + ], + "previewCompatibility": { + "preferredSurface": "two-d", + "fallback": "open-2d-preview", + "reason": "class-diagram is preserved for 2D Mermaid rendering while 3D preview stays flowchart-only." + } + }, + "subgraphs": [] + }, + { + "id": "layer_flow_1_nexusreader_web_client_program_cs", + "kind": "dependency-map", + "title": "Program.cs Layer View", + "direction": "LR", + "nodes": [ + { + "id": "flow_file_nexusreader_web_client_program_cs_file_1", + "kind": "service", + "label": "Program.cs", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 1, + "subgraphId": "layer_frontend" + }, + { + "id": "flow_action_nexusreader_web_client_program_cs_getservice_return_71_71", + "kind": "return", + "label": "returns null", + "shape": "stadium", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 71, + "subgraphId": "layer_frontend" + }, + { + "id": "flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88", + "kind": "step", + "label": "Reads repository or persistence state", + "shape": "rect", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 88, + "subgraphId": "layer_frontend" + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61", + "kind": "dependency", + "label": "ThrowingDbContextFactory", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 61, + "subgraphId": "layer_frontend" + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66", + "kind": "dependency", + "label": "ThrowingEmbeddingGenerator", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 66, + "subgraphId": "layer_frontend" + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74", + "kind": "dependency", + "label": "ThrowingBookStorageService", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 74, + "subgraphId": "layer_frontend" + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84", + "kind": "dependency", + "label": "ThrowingEbookRepository", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 84, + "subgraphId": "layer_frontend" + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94", + "kind": "dependency", + "label": "ThrowingSyncBroadcaster", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 94, + "subgraphId": "layer_frontend" + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_webplatformservice_18", + "kind": "dependency", + "label": "WebPlatformService", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 18, + "subgraphId": "layer_frontend" + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33", + "kind": "dependency", + "label": "NexusAuthenticationStateProvider", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 33, + "subgraphId": "layer_frontend" + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38", + "kind": "dependency", + "label": "WasmKnowledgeService", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 38, + "subgraphId": "layer_frontend" + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_configured_httpclient_40", + "kind": "dependency", + "label": "configured HttpClient", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 40, + "subgraphId": "layer_frontend" + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49", + "kind": "dependency", + "label": "ThrowingDbContextFactory", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 49, + "subgraphId": "layer_frontend" + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_n_a_55", + "kind": "dependency", + "label": "N/A", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 55, + "subgraphId": "layer_frontend" + }, + { + "id": "flow_type_nexusreader_web_client_program_cs_wasmepubreader_56", + "kind": "dependency", + "label": "WasmEpubReader", + "shape": "doc", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 56, + "subgraphId": "layer_frontend" + }, + { + "id": "flow_file_nexusreader_web_program_cs_file_1", + "kind": "service", + "label": "Program.cs", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 1, + "subgraphId": "layer_application" + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "kind": "step", + "label": "Evaluates branch condition", + "shape": "diamond", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 62, + "subgraphId": "layer_application" + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "kind": "step", + "label": "Falls back to alternate path", + "shape": "diamond", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 66, + "subgraphId": "layer_application" + } + ], + "edges": [ + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61_defines_type_61", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61", + "semanticLabel": "model ThrowingDbContextFactory", + "visibleLabel": "model ThrowingDbContextFactory", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 61, + "includeInMetadata": true, + "payload": { + "outputSummary": "IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.", + "expandedLabel": "defines-type" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66_defines_type_66", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66", + "semanticLabel": "model ThrowingEmbeddingGenerator", + "visibleLabel": "model ThrowingEmbeddingGenerator", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 66, + "includeInMetadata": true, + "payload": { + "outputSummary": "IEmbeddingGenerator implementation that disables local embedding generation in WASM (throws on GenerateAsync).", + "expandedLabel": "defines-type" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74_defines_type_74", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74", + "semanticLabel": "model ThrowingBookStorageService", + "visibleLabel": "model ThrowingBookStorageService", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 74, + "includeInMetadata": true, + "payload": { + "outputSummary": "IBookStorageService implementation that throws for all file storage operations in WASM.", + "expandedLabel": "defines-type" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84_defines_type_84", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84", + "semanticLabel": "model ThrowingEbookRepository", + "visibleLabel": "model ThrowingEbookRepository", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 84, + "includeInMetadata": true, + "payload": { + "outputSummary": "IEbookRepository implementation that throws for all repository operations in WASM.", + "expandedLabel": "defines-type" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94_defines_type_94", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94", + "semanticLabel": "model ThrowingSyncBroadcaster", + "visibleLabel": "model ThrowingSyncBroadcaster", + "relation": "transforms", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 94, + "includeInMetadata": true, + "payload": { + "outputSummary": "ISyncBroadcaster implementation that throws because real-time broadcasting must run on the server.", + "expandedLabel": "defines-type" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_webplatformservice_18_registers_service_18", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_webplatformservice_18", + "semanticLabel": "IPlatformService", + "visibleLabel": "IPlatformService", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 18, + "includeInMetadata": true, + "payload": { + "outputSummary": "Registers platform abstraction for browser.", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33_registers_service_33", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33", + "semanticLabel": "NexusAuthenticationStateProvider", + "visibleLabel": "NexusAuthenticationStateProvider", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 33, + "includeInMetadata": true, + "payload": { + "outputSummary": "Authentication state provider and wiring to AuthenticationStateProvider.", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38_registers_service_38", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38", + "semanticLabel": "IKnowledgeService", + "visibleLabel": "IKnowledgeService", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 38, + "includeInMetadata": true, + "payload": { + "outputSummary": "Registers a WASM-specific knowledge service implementation.", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_configured_httpclient_40_registers_service_40", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_configured_httpclient_40", + "semanticLabel": "HttpClient (named 'NexusAPI')", + "visibleLabel": "uses", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 40, + "includeInMetadata": true, + "payload": { + "outputSummary": "Adds named HTTP client with base address and authentication header handler.", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49_registers_service_49", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49", + "semanticLabel": "IDbContextFactory", + "visibleLabel": "IDbContextFactory AppDbContext>", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 49, + "includeInMetadata": true, + "payload": { + "outputSummary": "Registers throw-only stub to avoid using DbContext in WASM.", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_n_a_55_registers_service_55", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_n_a_55", + "semanticLabel": "application services (via extension)", + "visibleLabel": "application services via extension", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 55, + "includeInMetadata": true, + "payload": { + "outputSummary": "Calls AddApplication() to register application-layer services.", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_wasmepubreader_56_registers_service_56", + "from": "flow_file_nexusreader_web_client_program_cs_file_1", + "to": "flow_type_nexusreader_web_client_program_cs_wasmepubreader_56", + "semanticLabel": "IEpubReader", + "visibleLabel": "IEpubReader", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 56, + "includeInMetadata": true, + "payload": { + "outputSummary": "Registers WASM epub reader implementation.", + "expandedLabel": "registers-service" + } + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_falls_back_66", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "semanticLabel": "fallback", + "visibleLabel": "fallback", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 66, + "includeInMetadata": true, + "payload": { + "outputSummary": "else", + "expandedLabel": "falls-back" + } + } + ], + "subgraphs": [ + { + "id": "layer_frontend", + "label": "frontend" + }, + { + "id": "layer_application", + "label": "application" + } + ], + "metadata": { + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs", + "NexusReader.Web.Client/Program.cs", + "NexusReader.Web/Program.cs", + "NexusReader.Application/DependencyInjection.cs", + "NexusReader.Infrastructure/DependencyInjection.cs", + "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "NexusReader.Application/DTOs/User/AuthorDto.cs", + "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "NexusReader.Domain/Entities/Author.cs", + "NexusReader.UI.Shared/Layout/AuthLayout.razor", + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "NexusReader.UI.Shared/Pages/Account/Login.razor", + "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "NexusReader.UI.Shared/Pages/Account/Register.razor", + "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "NexusReader.Infrastructure/Services/BookStorageService.cs", + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs" + ] + } + }, + { + "id": "failure_flow_1_nexusreader_web_client_program_cs", + "kind": "control-flow", + "title": "Program.cs Guardrails and Failure Paths", + "direction": "TD", + "nodes": [ + { + "id": "flow_method_nexusreader_web_client_program_cs_getservice_71", + "kind": "method", + "label": "GetService", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 71 + }, + { + "id": "flow_action_nexusreader_web_client_program_cs_getservice_return_71_71", + "kind": "return", + "label": "returns null", + "shape": "stadium", + "sourcePath": "NexusReader.Web.Client/Program.cs", + "sourceLine": 71 + }, + { + "id": "flow_method_nexusreader_web_program_cs_program_top_level_29", + "kind": "method", + "label": "Program (top-level)", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 29 + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "kind": "step", + "label": "Evaluates branch condition", + "shape": "diamond", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 62 + }, + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "kind": "step", + "label": "Falls back to alternate path", + "shape": "diamond", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 66 + } + ], + "edges": [ + { + "id": "edge_flow_method_nexusreader_web_client_program_cs_getservice_71_flow_action_nexusreader_web_client_program_cs_getservice_return_71_71_returns_71", + "from": "flow_method_nexusreader_web_client_program_cs_getservice_71", + "to": "flow_action_nexusreader_web_client_program_cs_getservice_return_71_71", + "semanticLabel": "returns null", + "visibleLabel": "returns null", + "relation": "returns", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Program.cs", + "sourceLine": 71, + "includeInMetadata": true, + "payload": { + "outputSummary": "public object? GetService(...) => null", + "expandedLabel": "returns" + } + }, + { + "id": "edge_flow_method_nexusreader_web_program_cs_program_top_level_29_flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62_evaluates_condition_62", + "from": "flow_method_nexusreader_web_program_cs_program_top_level_29", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "semanticLabel": "true / false", + "visibleLabel": "true / false", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 62, + "includeInMetadata": true, + "payload": { + "outputSummary": "if (!string.IsNullOrEmpty(apiBaseUrl))", + "expandedLabel": "evaluates-condition" + } + }, + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62_flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66_falls_back_66", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_62_62", + "to": "flow_action_nexusreader_web_program_cs_program_top_level_fallback_66_66", + "semanticLabel": "fallback", + "visibleLabel": "fallback", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 66, + "includeInMetadata": true, + "payload": { + "outputSummary": "else", + "expandedLabel": "falls-back" + } + } + ], + "subgraphs": [ + { + "id": "NexusReader_Web_Client_Program", + "label": "Program" + }, + { + "id": "NexusReader_Web_Program", + "label": "Program" + } + ], + "metadata": { + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs", + "NexusReader.Web.Client/Program.cs", + "NexusReader.Web/Program.cs", + "NexusReader.Application/DependencyInjection.cs", + "NexusReader.Infrastructure/DependencyInjection.cs", + "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "NexusReader.Application/DTOs/User/AuthorDto.cs", + "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "NexusReader.Domain/Entities/Author.cs", + "NexusReader.UI.Shared/Layout/AuthLayout.razor", + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "NexusReader.UI.Shared/Pages/Account/Login.razor", + "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "NexusReader.UI.Shared/Pages/Account/Register.razor", + "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "NexusReader.Infrastructure/Services/BookStorageService.cs", + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs" + ], + "warnings": [] + } + }, + { + "id": "method_flows_graph", + "kind": "method-flow", + "title": "Method Flow Details", + "direction": "TD", + "nodes": [ + { + "id": "flow_action_nexusreader_web_program_cs_program_top_level_branch_237_237", + "kind": "step", + "label": "Evaluates branch condition", + "shape": "diamond", + "sourcePath": "NexusReader.Web/Program.cs", + "sourceLine": 237 + }, + { + "id": "flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1", + "kind": "dependency", + "label": "SyncHub", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 1 + }, + { + "id": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_synchub_14", + "kind": "method", + "label": "SyncHub", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 14 + }, + { + "id": "flow_file_nexusreader_web_client_handlers_authenticationheaderhandler_cs_file_1", + "kind": "dependency", + "label": "AuthenticationHeaderHandler", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 1 + }, + { + "id": "flow_method_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_112", + "kind": "method", + "label": "CloneHttpRequestMessageAsync", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 112 + }, + { + "id": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_branch_119_119", + "kind": "step", + "label": "Evaluates branch condition", + "shape": "diamond", + "sourcePath": "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 119 + }, + { + "id": "flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1", + "kind": "service", + "label": "EpubReaderService", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 1 + }, + { + "id": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_19", + "kind": "method", + "label": "UpdateProgress", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 19 + }, + { + "id": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_repository_read_21_21", + "kind": "step", + "label": "Reads repository or persistence state", + "shape": "rect", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 21 + }, + { + "id": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_28", + "kind": "method", + "label": "OnConnectedAsync", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 28 + }, + { + "id": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_repository_read_30_30", + "kind": "step", + "label": "Reads repository or persistence state", + "shape": "rect", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 30 + }, + { + "id": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_38", + "kind": "method", + "label": "OnDisconnectedAsync", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 38 + }, + { + "id": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_repository_read_40_40", + "kind": "step", + "label": "Reads repository or persistence state", + "shape": "rect", + "sourcePath": "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 40 + }, + { + "id": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_175", + "kind": "method", + "label": "CountWords", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 175 + }, + { + "id": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_guard_clause_177_177", + "kind": "step", + "label": "Empty text check", + "shape": "diamond", + "sourcePath": "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 177 + } + ], + "edges": [ + { + "id": "edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_237_237_flow_method_nexusreader_infrastructure_realtime_synchub_cs_synchub_14_uses_service_247", + "from": "flow_action_nexusreader_web_program_cs_program_top_level_branch_237_237", + "to": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_synchub_14", + "semanticLabel": "SyncHub", + "visibleLabel": "SyncHub", + "relation": "uses", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web/Program.cs", + "sourceLine": 247, + "includeInMetadata": true, + "payload": { + "outputSummary": "Hub mapping for realtime sync", + "expandedLabel": "uses-service" + } + }, + { + "id": "edge_flow_file_nexusreader_web_client_handlers_authenticationheaderhandler_cs_file_1_flow_method_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_112_invokes_112", + "from": "flow_file_nexusreader_web_client_handlers_authenticationheaderhandler_cs_file_1", + "to": "flow_method_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_112", + "semanticLabel": "CloneHttpRequestMessageAsync", + "visibleLabel": "CloneHttpRequestMessageAsync", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 112, + "includeInMetadata": true, + "payload": { + "outputSummary": "Creates a deep-ish clone of an HttpRequestMessage including method, URI, version, headers and buffered content to allow safe retry.", + "expandedLabel": "invokes" + } + }, + { + "id": "edge_flow_method_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_112_flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_branch_119_119_evaluates_condition_119", + "from": "flow_method_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_112", + "to": "flow_action_nexusreader_web_client_handlers_authenticationheaderhandler_cs_clonehttprequestmessageasync_branch_119_119", + "semanticLabel": "true / false", + "visibleLabel": "true / false", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "sourceLine": 119, + "includeInMetadata": true, + "payload": { + "outputSummary": "if (req.Content != null)", + "expandedLabel": "evaluates-condition" + } + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1_flow_method_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_19_invokes_19", + "from": "flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_19", + "semanticLabel": "UpdateProgress", + "visibleLabel": "UpdateProgress", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 19, + "includeInMetadata": true, + "payload": { + "outputSummary": "Receives client progress updates, obtains the calling user id and forwards an UpdateReadingProgressCommand via MediatR when user is present.", + "expandedLabel": "handles-route" + } + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_19_flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_repository_read_21_21_invokes_21", + "from": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_19", + "to": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_repository_read_21_21", + "semanticLabel": "Reads repository or persistence state", + "visibleLabel": "Reads repository or persistence state", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 21, + "includeInMetadata": true, + "payload": { + "outputSummary": "var userId = Context.User?.FindFirst(ClaimTypes.NameIdentifier)?.Value;", + "expandedLabel": "invokes" + } + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1_flow_method_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_28_invokes_28", + "from": "flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_28", + "semanticLabel": "OnConnectedAsync", + "visibleLabel": "OnConnectedAsync", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 28, + "includeInMetadata": true, + "payload": { + "outputSummary": "When a client connects, adds their connection to a per-user SignalR group (User_{userId}) and calls base connection logic.", + "expandedLabel": "handles-route" + } + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_28_flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_repository_read_30_30_invokes_30", + "from": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_28", + "to": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_repository_read_30_30", + "semanticLabel": "Reads repository or persistence state", + "visibleLabel": "Reads repository or persistence state", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 30, + "includeInMetadata": true, + "payload": { + "outputSummary": "var userId = Context.UserIdentifier;", + "expandedLabel": "invokes" + } + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1_flow_method_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_38_invokes_38", + "from": "flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_38", + "semanticLabel": "OnDisconnectedAsync", + "visibleLabel": "OnDisconnectedAsync", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 38, + "includeInMetadata": true, + "payload": { + "outputSummary": "When a client disconnects, removes their connection from the per-user SignalR group and invokes base disconnect logic.", + "expandedLabel": "handles-route" + } + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_38_flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_repository_read_40_40_invokes_40", + "from": "flow_method_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_38", + "to": "flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_repository_read_40_40", + "semanticLabel": "Reads repository or persistence state", + "visibleLabel": "Reads repository or persistence state", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/RealTime/SyncHub.cs", + "sourceLine": 40, + "includeInMetadata": true, + "payload": { + "outputSummary": "var userId = Context.UserIdentifier;", + "expandedLabel": "invokes" + } + }, + { + "id": "edge_flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1_flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_175_invokes_175", + "from": "flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1", + "to": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_175", + "semanticLabel": "CountWords", + "visibleLabel": "CountWords", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 175, + "includeInMetadata": true, + "payload": { + "outputSummary": "Count words in a string using whitespace separators; returns 0 for null/whitespace.", + "expandedLabel": "invokes" + } + }, + { + "id": "edge_flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_175_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_guard_clause_177_177_evaluates_condition_177", + "from": "flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_175", + "to": "flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_guard_clause_177_177", + "semanticLabel": "return 0 / continue", + "visibleLabel": "return 0 / continue", + "relation": "calls", + "sourcePath": "c:/Users/micht/source/repos/Nexus.Reader/src/NexusReader.Infrastructure/Services/EpubReaderService.cs", + "sourceLine": 177, + "includeInMetadata": true, + "payload": { + "outputSummary": "Empty text check", + "expandedLabel": "evaluates-condition" + } + } + ], + "subgraphs": [ + { + "id": "NexusReader_Infrastructure_RealTime_SyncHub", + "label": "SyncHub" + }, + { + "id": "NexusReader_Web_Client_Handlers_AuthenticationHeaderHandler", + "label": "AuthenticationHeaderHandler" + }, + { + "id": "NexusReader_Infrastructure_Services_EpubReaderService", + "label": "EpubReaderService" + } + ], + "metadata": { + "evidencePaths": [ + "NexusReader.Maui/MauiProgram.cs", + "NexusReader.Web.Client/Program.cs", + "NexusReader.Web/Program.cs", + "NexusReader.Application/DependencyInjection.cs", + "NexusReader.Infrastructure/DependencyInjection.cs", + "NexusReader.Infrastructure/RealTime/SyncHub.cs", + "NexusReader.Application/DTOs/User/AuthorDto.cs", + "NexusReader.Application/Security/Authorization/ProUserHandler.cs", + "NexusReader.Application/Security/Authorization/ProUserRequirement.cs", + "NexusReader.Domain/Entities/Author.cs", + "NexusReader.UI.Shared/Layout/AuthLayout.razor", + "NexusReader.Web.Client/Handlers/AuthenticationHeaderHandler.cs", + "NexusReader.UI.Shared/Pages/Account/Login.razor", + "NexusReader.UI.Shared/Pages/Account/Profile.razor", + "NexusReader.UI.Shared/Pages/Account/Register.razor", + "NexusReader.Application/Abstractions/Messaging/ICommand.cs", + "NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs", + "NexusReader.Application/Abstractions/Messaging/IQuery.cs", + "NexusReader.Infrastructure/Services/KnowledgeService.cs", + "NexusReader.Infrastructure/Services/EpubReaderService.cs", + "NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs", + "NexusReader.Infrastructure/Services/BookStorageService.cs", + "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs", + "NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs" + ] + } + } + ] +} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__Abstractions__Messaging__ICommand.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__Abstractions__Messaging__ICommand.cs.json new file mode 100644 index 0000000..928f45b --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__Abstractions__Messaging__ICommand.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/Abstractions/Messaging/ICommand.cs","purpose":"Defines application-level command abstractions used with MediatR and FluentResults to represent operations that return FluentResults (optionally with a typed payload).","classification":{"role":"handler","layer":"application","confidence":0.9,"evidence":["Command pattern","Namespace NexusReader.Application.Abstractions.Messaging indicates an application-layer contract","Interfaces extend MediatR IRequest and use FluentResults Result types"]},"className":"","methods":[],"types":[{"name":"ICommand","kind":"interface","line":6,"purpose":"Marker/contract for a command that produces a FluentResults.Result when handled via MediatR.","fields":[]},{"name":"ICommand","kind":"interface","line":10,"purpose":"Generic command contract that produces a FluentResults.Result when handled via MediatR.","fields":[{"name":"TResponse","type":"type-parameter","required":true,"line":10,"description":"Generic result payload type returned inside Result"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["FluentResults (external)","MediatR (external)"],"patterns":["Command Pattern","Mediator"],"domainConcepts":[],"keyDetails":"Two simple interfaces that unify MediatR IRequest with FluentResults.Result to standardize command return shapes across the application.","orchestrationMethods":[],"typedContracts":[{"name":"ICommand","kind":"interface","line":6,"fieldCount":0,"evidencePaths":["NexusReader.Application/Abstractions/Messaging/ICommand.cs"]},{"name":"ICommand","kind":"interface","line":10,"fieldCount":1,"evidencePaths":["NexusReader.Application/Abstractions/Messaging/ICommand.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"ICommand","line":6,"summary":"interface with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Abstractions/Messaging/ICommand.cs"]},{"kind":"typed-contract","label":"ICommand","line":10,"summary":"interface with 1 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Abstractions/Messaging/ICommand.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__Abstractions__Messaging__ICommandHandler.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__Abstractions__Messaging__ICommandHandler.cs.json new file mode 100644 index 0000000..e41f785 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__Abstractions__Messaging__ICommandHandler.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs","purpose":"Declares application-level command handler abstractions that adapt MediatR IRequestHandler to return FluentResults.Result, standardizing command handling signatures across the Application layer.","classification":{"role":"handler","layer":"application","confidence":0.9,"evidence":["Command pattern","Namespace: NexusReader.Application.Abstractions.Messaging","Interfaces extend MediatR IRequestHandler and use FluentResults.Result"]},"className":"ICommandHandler","methods":[],"types":[{"name":"ICommandHandler","kind":"interface","line":6,"purpose":"Represents a command handler that processes a command and returns a FluentResults.Result (no data).","fields":[]},{"name":"ICommandHandler","kind":"interface","line":11,"purpose":"Represents a command handler that processes a command and returns a FluentResults.Result with a typed response.","fields":[]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["FluentResults","MediatR","ICommand (project-local type, path unknown)"],"patterns":["Mediator","Command Handler","Dependency Inversion"],"domainConcepts":["Command","Result"],"keyDetails":"Two small interface abstractions adapting MediatR handlers to use FluentResults.Result; no implementations or runtime logic in this file.","orchestrationMethods":[],"typedContracts":[{"name":"ICommandHandler","kind":"interface","line":6,"fieldCount":0,"evidencePaths":["NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs"]},{"name":"ICommandHandler","kind":"interface","line":11,"fieldCount":0,"evidencePaths":["NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"ICommandHandler","line":6,"summary":"interface with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs"]},{"kind":"typed-contract","label":"ICommandHandler","line":11,"summary":"interface with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__Abstractions__Messaging__IQuery.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__Abstractions__Messaging__IQuery.cs.json new file mode 100644 index 0000000..82b0959 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__Abstractions__Messaging__IQuery.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/Abstractions/Messaging/IQuery.cs","purpose":"Defines a marker interface for application-layer read/query operations that use MediatR and return a FluentResults.Result-wrapped response.","classification":{"role":"handler","layer":"application","confidence":0.9,"evidence":["Command pattern","namespace NexusReader.Application.Abstractions.Messaging","public interface IQuery : IRequest> (extends MediatR IRequest and uses FluentResults)"]},"className":"","methods":[],"types":[{"name":"IQuery","kind":"interface","line":6,"purpose":"Marker interface representing a CQRS query that returns a Result-wrapped TResponse via MediatR.","fields":[]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["FluentResults (package)","MediatR (package)"],"patterns":["CQRS","Mediator"],"domainConcepts":["Query","Result"],"keyDetails":"A minimal marker interface used to type queries handled by MediatR handlers; no runtime methods or properties in this file.","orchestrationMethods":[],"typedContracts":[{"name":"IQuery","kind":"interface","line":6,"fieldCount":0,"evidencePaths":["NexusReader.Application/Abstractions/Messaging/IQuery.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"IQuery","line":6,"summary":"interface with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Abstractions/Messaging/IQuery.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__Abstractions__Messaging__IQueryHandler.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__Abstractions__Messaging__IQueryHandler.cs.json new file mode 100644 index 0000000..0731a44 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__Abstractions__Messaging__IQueryHandler.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/Abstractions/Messaging/IQueryHandler.cs","purpose":"Defines an application-level abstraction for MediatR query handlers that return a FluentResults Result.","classification":{"role":"handler","layer":"application","confidence":0.85,"evidence":["Namespace: NexusReader.Application.Abstractions.Messaging","Interface name IQueryHandler and generic TQuery/TResponse","Inherits MediatR IRequestHandler>"]},"className":"IQueryHandler","methods":[{"name":"Handle (inherited from IRequestHandler)","line":6,"endLine":9,"signature":"(request: TQuery, cancellationToken: CancellationToken) -> Task>","purpose":"Abstract handler method for processing a query and returning a Result-wrapped response.","calls":[],"actions":[{"id":"orchestration-point_6","kind":"mapping","label":"Query handling contract for MediatR pipeline","line":6,"detail":"This interface surface is used by the MediatR pipeline to locate and invoke query handlers that return FluentResults.Result.","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"IQueryHandler","kind":"interface","line":6,"purpose":"Generic abstraction for query handlers that process TQuery and return Result via MediatR.","fields":[]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["FluentResults (package)","MediatR (package)","NexusReader.Application.Abstractions.Messaging.IQuery (type dependency, same namespace)"],"patterns":["CQRS Handler","Mediator"],"domainConcepts":["Query","Result"],"keyDetails":"This file only declares a small generic interface that ties MediatR's IRequestHandler to FluentResults.Result, serving as an application-layer contract for query handlers.","orchestrationMethods":[],"typedContracts":[{"name":"IQueryHandler","kind":"interface","line":6,"fieldCount":0,"evidencePaths":["NexusReader.Application/Abstractions/Messaging/IQueryHandler.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"IQueryHandler","line":6,"summary":"interface with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Abstractions/Messaging/IQueryHandler.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__Abstractions__Messaging__ISyncBroadcaster.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__Abstractions__Messaging__ISyncBroadcaster.cs.json new file mode 100644 index 0000000..79997d5 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__Abstractions__Messaging__ISyncBroadcaster.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/Abstractions/Messaging/ISyncBroadcaster.cs","purpose":"Defines an application-layer abstraction for broadcasting real-time sync events (reading progress and ingestion progress) to connected client devices so handlers in Application layer avoid a direct dependency on SignalR.","classification":{"role":"service","layer":"application","confidence":0.9,"evidence":["File defines ISyncBroadcaster interface used to broadcast to connected clients (lines 3-6, 9-17, 25-32).","Comments explicitly state this is defined in Application to prevent a direct dependency on SignalR (line 5)."]},"className":"ISyncBroadcaster","methods":[{"name":"BroadcastProgressAsync","line":18,"endLine":23,"signature":"(userId: string, pageId: string, timestamp: DateTime, excludedConnectionId: string? , cancellationToken: CancellationToken = default) -> Task","purpose":"Broadcasts a user's reading progress to that user's other connected devices, optionally excluding the originating SignalR connection.","calls":[],"actions":[{"id":"external-call_18","kind":"external-call","label":"Broadcast to connected clients (real-time hub / SignalR) - abstracted","line":18,"detail":"Implied: implementation will send a progress update to user devices; interface intentionally avoids referencing SignalR here.","visibility":"detail-only","confidence":0.7},{"id":"parameter-behavior_22","kind":"mapping","label":"Exclude originating connection","line":22,"detail":"excludedConnectionId allows the implementer to omit the sender's connection from the broadcast.","visibility":"detail-only","confidence":0.7},{"id":"cancellation_23","kind":"mapping","label":"Supports cancellation","line":23,"detail":"CancellationToken parameter present with default.","visibility":"detail-only","confidence":0.7}]},{"name":"BroadcastIngestionProgressAsync","line":33,"endLine":37,"signature":"(userId: string, message: string, progress: double, cancellationToken: CancellationToken = default) -> Task","purpose":"Sends ingestion status messages and progress percentage to a specific user (used by background workers during AI/ingestion tasks).","calls":[],"actions":[{"id":"parameter-behavior_31","kind":"mapping","label":"Progress value range","line":31,"detail":"progress parameter is documented as a percentage in range 0.0 to 1.0.","visibility":"detail-only","confidence":0.7},{"id":"external-call_33","kind":"external-call","label":"Notify specific user about ingestion progress (real-time hub)","line":33,"detail":"Implied: implementation will send human-readable status and progress to the user's connected clients.","visibility":"detail-only","confidence":0.7},{"id":"cancellation_37","kind":"mapping","label":"Supports cancellation","line":37,"detail":"CancellationToken parameter present with default.","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"ISyncBroadcaster","kind":"interface","line":7,"purpose":"Defines methods for broadcasting real-time synchronization and ingestion progress events to user devices without tying Application layer to SignalR.","fields":[{"name":"BroadcastProgressAsync","type":"method","required":true,"line":18,"description":"Broadcasts reading progress to user's devices; may exclude originating connection; supports cancellation."},{"name":"BroadcastIngestionProgressAsync","type":"method","required":true,"line":33,"description":"Sends ingestion status messages and progress to a specific user; supports cancellation."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["Pub-Sub","Adapter (abstraction over real-time/hub implementation)"],"domainConcepts":["real-time sync","reading progress","ingestion progress","user devices"],"keyDetails":"Interface exists to decouple Application handlers from SignalR; implementations will perform external real-time broadcasts and must honor excludedConnectionId and CancellationToken parameters.","orchestrationMethods":[{"name":"BroadcastProgressAsync","line":18,"confidence":0.57,"reason":"Contains 1 architectural actions relevant to business execution.","actionKinds":["external-call","mapping"],"evidencePaths":["NexusReader.Application/Abstractions/Messaging/ISyncBroadcaster.cs"]},{"name":"BroadcastIngestionProgressAsync","line":33,"confidence":0.57,"reason":"Contains 1 architectural actions relevant to business execution.","actionKinds":["mapping","external-call"],"evidencePaths":["NexusReader.Application/Abstractions/Messaging/ISyncBroadcaster.cs"]}],"typedContracts":[{"name":"ISyncBroadcaster","kind":"interface","line":7,"fieldCount":2,"evidencePaths":["NexusReader.Application/Abstractions/Messaging/ISyncBroadcaster.cs"]}],"persistenceInteractions":[],"externalInteractions":[{"methodName":"BroadcastProgressAsync","line":18,"kind":"external-call","detail":"Implied: implementation will send a progress update to user devices; interface intentionally avoids referencing SignalR here.","evidencePaths":["NexusReader.Application/Abstractions/Messaging/ISyncBroadcaster.cs"]},{"methodName":"BroadcastIngestionProgressAsync","line":33,"kind":"external-call","detail":"Implied: implementation will send human-readable status and progress to the user's connected clients.","evidencePaths":["NexusReader.Application/Abstractions/Messaging/ISyncBroadcaster.cs"]}],"evidenceAnchors":[{"kind":"orchestration-method","label":"BroadcastProgressAsync","line":18,"summary":"Contains 1 architectural actions relevant to business execution.","confidence":0.57,"evidencePaths":["NexusReader.Application/Abstractions/Messaging/ISyncBroadcaster.cs"]},{"kind":"orchestration-method","label":"BroadcastIngestionProgressAsync","line":33,"summary":"Contains 1 architectural actions relevant to business execution.","confidence":0.57,"evidencePaths":["NexusReader.Application/Abstractions/Messaging/ISyncBroadcaster.cs"]},{"kind":"typed-contract","label":"ISyncBroadcaster","line":7,"summary":"interface with 2 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Abstractions/Messaging/ISyncBroadcaster.cs"]},{"kind":"external-call","label":"BroadcastProgressAsync","line":18,"summary":"Implied: implementation will send a progress update to user devices; interface intentionally avoids referencing SignalR here.","confidence":0.8,"evidencePaths":["NexusReader.Application/Abstractions/Messaging/ISyncBroadcaster.cs"]},{"kind":"external-call","label":"BroadcastIngestionProgressAsync","line":33,"summary":"Implied: implementation will send human-readable status and progress to the user's connected clients.","confidence":0.8,"evidencePaths":["NexusReader.Application/Abstractions/Messaging/ISyncBroadcaster.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__Abstractions__Persistence__IEbookRepository.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__Abstractions__Persistence__IEbookRepository.cs.json new file mode 100644 index 0000000..bd2c45f --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__Abstractions__Persistence__IEbookRepository.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/Abstractions/Persistence/IEbookRepository.cs","purpose":"Defines the application-layer abstraction for Ebook and Author persistence operations so higher layers can work without a direct dependency on EF Core or a specific data implementation.","classification":{"role":"repository","layer":"application","confidence":0.9,"evidence":["Repository naming pattern","Namespace: NexusReader.Application.Abstractions.Persistence","XML comment: Abstraction for Ebook and Author persistence operations","Interface name IEbookRepository indicates repository pattern"]},"className":"IEbookRepository","methods":[{"name":"FindAuthorByNameAsync","line":14,"endLine":14,"signature":"(name: string, cancellationToken: CancellationToken = default) -> Task","purpose":"Asynchronously looks up an Author by name using a case-insensitive comparison.","calls":[],"actions":[{"id":"async_14","kind":"mapping","label":"async boundary","line":14,"detail":"Returns Task to be implemented by concrete repository (async behavior expected).","visibility":"detail-only","confidence":0.7},{"id":"query_14","kind":"mapping","label":"Case-insensitive author lookup","line":14,"detail":"Declared contract to query the underlying store for an Author by name (case-insensitive).","visibility":"detail-only","confidence":0.7},{"id":"findauthorbynameasync_repository-read_14_0","kind":"repository-read","label":"Reads repository or persistence state","line":14,"detail":"Task FindAuthorByNameAsync(string name, CancellationToken cancellationToken = default);","visibility":"secondary-visible","confidence":0.86}]},{"name":"AddAuthor","line":19,"endLine":19,"signature":"(author: Author) -> void","purpose":"Stages a new Author for insertion into the repository (does not persist immediately).","calls":[],"actions":[{"id":"staged-write_19","kind":"mapping","label":"Stage author for insertion","line":19,"detail":"Contract indicates the author is added to a staging/track list; persistence occurs on SaveChangesAsync.","visibility":"detail-only","confidence":0.7}]},{"name":"AddEbook","line":24,"endLine":24,"signature":"(ebook: Ebook) -> void","purpose":"Stages a new Ebook for insertion into the repository (does not persist immediately).","calls":[],"actions":[{"id":"staged-write_24","kind":"mapping","label":"Stage ebook for insertion","line":24,"detail":"Contract indicates the ebook is added to a staging/track list; persistence occurs on SaveChangesAsync.","visibility":"detail-only","confidence":0.7}]},{"name":"SaveChangesAsync","line":29,"endLine":29,"signature":"(cancellationToken: CancellationToken = default) -> Task","purpose":"Persists all staged changes to the underlying store and returns number of affected records.","calls":[],"actions":[{"id":"async_29","kind":"mapping","label":"async boundary","line":29,"detail":"Returns Task indicating asynchronous commit semantics.","visibility":"detail-only","confidence":0.7},{"id":"persist_29","kind":"mapping","label":"Commit staged changes","line":29,"detail":"Declared contract to flush staged AddAuthor/AddEbook operations to the data store and return an int result.","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"IEbookRepository","kind":"interface","line":9,"purpose":"Application-layer persistence abstraction for Authors and Ebooks to avoid direct EF Core dependency.","fields":[{"name":"FindAuthorByNameAsync","type":"Task","required":true,"line":14,"description":"Asynchronous method to find an Author by name (case-insensitive)."},{"name":"AddAuthor","type":"void","required":true,"line":19,"description":"Stages an Author for insertion."},{"name":"AddEbook","type":"void","required":true,"line":24,"description":"Stages an Ebook for insertion."},{"name":"SaveChangesAsync","type":"Task","required":true,"line":29,"description":"Commits staged changes to the store and returns number of affected records."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Domain/Entities (referenced via using NexusReader.Domain.Entities)"],"patterns":["Repository"],"domainConcepts":["Author","Ebook"],"keyDetails":"This interface defines a repository contract in the Application layer for author/ebook persistence: query by name (case-insensitive), stage additions, and an explicit SaveChangesAsync to commit staged changes. It exists to decouple application logic from EF Core or concrete data implementations.","orchestrationMethods":[{"name":"FindAuthorByNameAsync","line":14,"confidence":0.57,"reason":"Contains 1 architectural actions relevant to business execution.","actionKinds":["mapping","repository-read"],"evidencePaths":["NexusReader.Application/Abstractions/Persistence/IEbookRepository.cs"]}],"typedContracts":[{"name":"IEbookRepository","kind":"interface","line":9,"fieldCount":4,"evidencePaths":["NexusReader.Application/Abstractions/Persistence/IEbookRepository.cs"]}],"persistenceInteractions":[{"methodName":"FindAuthorByNameAsync","line":14,"kind":"persistence-read","detail":"Task FindAuthorByNameAsync(string name, CancellationToken cancellationToken = default);","evidencePaths":["NexusReader.Application/Abstractions/Persistence/IEbookRepository.cs"]}],"externalInteractions":[],"evidenceAnchors":[{"kind":"orchestration-method","label":"FindAuthorByNameAsync","line":14,"summary":"Contains 1 architectural actions relevant to business execution.","confidence":0.57,"evidencePaths":["NexusReader.Application/Abstractions/Persistence/IEbookRepository.cs"]},{"kind":"typed-contract","label":"IEbookRepository","line":9,"summary":"interface with 4 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Abstractions/Persistence/IEbookRepository.cs"]},{"kind":"persistence","label":"FindAuthorByNameAsync","line":14,"summary":"Task FindAuthorByNameAsync(string name, CancellationToken cancellationToken = default);","confidence":0.82,"evidencePaths":["NexusReader.Application/Abstractions/Persistence/IEbookRepository.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__Abstractions__Services__IBillingService.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__Abstractions__Services__IBillingService.cs.json new file mode 100644 index 0000000..76281c4 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__Abstractions__Services__IBillingService.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/Abstractions/Services/IBillingService.cs","purpose":"Defines an application-layer billing service contract for handling subscription lifecycle events (updated/deleted) using asynchronous results.","classification":{"role":"service","layer":"application","confidence":0.9,"evidence":["Service naming pattern","Application/service path heuristic","File declares IBillingService in Application.Abstractions.Services namespace (line 4-6)","Methods represent application-level operations for subscription events (lines 8-9)"]},"className":"IBillingService","methods":[{"name":"HandleSubscriptionUpdatedAsync","line":8,"endLine":8,"signature":"(customerEmail: string, stripeProductId: string) -> Task","purpose":"Contract method to process a subscription update for a customer (e.g., map Stripe product change to app state) and return an operation Result asynchronously.","calls":[],"actions":[{"id":"abstract-method_8","kind":"mapping","label":"Declaration of async handler for subscription-updated events","line":8,"detail":"Interface method only; implementation must handle orchestration, persistence, notifications, or external calls.","visibility":"detail-only","confidence":0.7},{"id":"returns_8","kind":"mapping","label":"Returns a FluentResults.Result wrapped in Task","line":8,"detail":"Task indicates success/failure reporting from implementations.","visibility":"detail-only","confidence":0.7}]},{"name":"HandleSubscriptionDeletedAsync","line":9,"endLine":9,"signature":"(customerEmail: string) -> Task","purpose":"Contract method to process a subscription deletion for a customer and return an operation Result asynchronously.","calls":[],"actions":[{"id":"abstract-method_9","kind":"mapping","label":"Declaration of async handler for subscription-deleted events","line":9,"detail":"Interface method only; implementation must handle cleanup, persistence updates, or downstream notifications.","visibility":"detail-only","confidence":0.7},{"id":"returns_9","kind":"mapping","label":"Returns a FluentResults.Result wrapped in Task","line":9,"detail":"Task indicates success/failure reporting from implementations.","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"IBillingService","kind":"interface","line":6,"purpose":"Service contract for handling billing/subscription lifecycle events (update/delete).","fields":[{"name":"HandleSubscriptionUpdatedAsync","type":"Task","required":true,"line":8,"description":"Async operation to handle subscription updates given customer email and Stripe product id."},{"name":"HandleSubscriptionDeletedAsync","type":"Task","required":true,"line":9,"description":"Async operation to handle subscription deletions given customer email."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Domain.Entities (imported at line 1)","FluentResults (imported at line 2)"],"patterns":["Service Interface","Dependency Injection (interface abstraction for implementations)"],"domainConcepts":["Billing","Subscription","Customer","Stripe (stripeProductId)"],"keyDetails":"This file is an application-layer abstraction defining two async handlers that implementations must use to reconcile subscription updates/deletions; it returns FluentResults to surface success/failure.","orchestrationMethods":[],"typedContracts":[{"name":"IBillingService","kind":"interface","line":6,"fieldCount":2,"evidencePaths":["NexusReader.Application/Abstractions/Services/IBillingService.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"IBillingService","line":6,"summary":"interface with 2 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Abstractions/Services/IBillingService.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__Abstractions__Services__IBookStorageService.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__Abstractions__Services__IBookStorageService.cs.json new file mode 100644 index 0000000..7456192 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__Abstractions__Services__IBookStorageService.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/Abstractions/Services/IBookStorageService.cs","purpose":"Defines an application-layer abstraction for persisting ebook and cover image files (byte[] or Stream) and returning their relative path/URL; cover save methods may return null when no data is provided.","classification":{"role":"service","layer":"application","confidence":0.85,"evidence":["Service naming pattern","Application/service path heuristic","namespace NexusReader.Application.Abstractions.Services (line 1) indicates an application-layer abstraction","File declares IBookStorageService interface with SaveEbookAsync/SaveCoverAsync methods (lines 6-29)"]},"className":"IBookStorageService","methods":[{"name":"SaveEbookAsync","line":11,"endLine":11,"signature":"(data: byte[], fileName: string) -> Task","purpose":"Saves an ebook provided as a byte array and returns its relative path/URL.","calls":[],"actions":[{"id":"return_11","kind":"return","label":"returns path/url","line":11,"detail":"Returns Task containing the relative path/URL of the saved ebook","visibility":"detail-only","confidence":0.7}]},{"name":"SaveEbookAsync","line":16,"endLine":16,"signature":"(data: Stream, fileName: string) -> Task","purpose":"Saves an ebook provided as a Stream and returns its relative path/URL.","calls":[],"actions":[{"id":"return_16","kind":"return","label":"returns path/url","line":16,"detail":"Returns Task containing the relative path/URL of the saved ebook","visibility":"detail-only","confidence":0.7}]},{"name":"SaveCoverAsync","line":22,"endLine":22,"signature":"(data: byte[], fileName: string) -> Task","purpose":"Saves a cover image provided as a byte array and returns its relative path/URL; may return null if no cover data.","calls":[],"actions":[{"id":"nullable-return_19","kind":"mapping","label":"may return null when no data provided","line":19,"detail":"Method returns Task; documentation notes null is returned if no cover data is provided","visibility":"detail-only","confidence":0.7}]},{"name":"SaveCoverAsync","line":28,"endLine":28,"signature":"(data: Stream, fileName: string) -> Task","purpose":"Saves a cover image provided as a Stream and returns its relative path/URL; may return null if no cover data.","calls":[],"actions":[{"id":"nullable-return_25","kind":"mapping","label":"may return null when no data provided","line":25,"detail":"Method returns Task; documentation notes null is returned if no cover data is provided","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"IBookStorageService","kind":"interface","line":6,"purpose":"Abstraction for persisting ebook and cover files and returning their storage path/URLs.","fields":[{"name":"SaveEbookAsync(byte[])","type":"Task","required":true,"line":11,"description":"Saves ebook from byte array and returns relative path/URL"},{"name":"SaveEbookAsync(Stream)","type":"Task","required":true,"line":16,"description":"Saves ebook from stream and returns relative path/URL"},{"name":"SaveCoverAsync(byte[])","type":"Task","required":true,"line":22,"description":"Saves cover from byte array and returns relative path/URL or null if no data"},{"name":"SaveCoverAsync(Stream)","type":"Task","required":true,"line":28,"description":"Saves cover from stream and returns relative path/URL or null if no data"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["Storage Abstraction","Adapter"],"domainConcepts":["Ebook","Cover","File Storage","Path/URL"],"keyDetails":"Application-layer abstraction for ebook and cover persistence; supports both byte[] and Stream overloads; cover save methods explicitly allow null when no data is provided.","orchestrationMethods":[],"typedContracts":[{"name":"IBookStorageService","kind":"interface","line":6,"fieldCount":4,"evidencePaths":["NexusReader.Application/Abstractions/Services/IBookStorageService.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"IBookStorageService","line":6,"summary":"interface with 4 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Abstractions/Services/IBookStorageService.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__Abstractions__Services__IEpubMetadataExtractor.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__Abstractions__Services__IEpubMetadataExtractor.cs.json new file mode 100644 index 0000000..f9e7e70 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__Abstractions__Services__IEpubMetadataExtractor.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/Abstractions/Services/IEpubMetadataExtractor.cs","purpose":"Defines an application-layer service abstraction for extracting metadata from an EPUB stream, returning a Result-wrapped LocalEpubMetadata.","classification":{"role":"service","layer":"application","confidence":0.9,"evidence":["Service naming pattern","Application/service path heuristic","Namespace: NexusReader.Application.Abstractions.Services","Type is an interface named IEpubMetadataExtractor and lives in Application project","Method returns application DTO LocalEpubMetadata (imported from Queries.Reader)"]},"className":"IEpubMetadataExtractor","methods":[{"name":"ExtractMetadataAsync","line":9,"endLine":9,"signature":"(epubStream: Stream) -> Task>","purpose":"Asynchronously extracts EPUB metadata from the provided stream and returns it wrapped in a FluentResults Result.","calls":[],"actions":[{"id":"async-signature_9","kind":"mapping","label":"Asynchronous extraction contract","line":9,"detail":"Returns Task> to signal success/failure and carry metadata","visibility":"detail-only","confidence":0.7}]}],"types":[],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Application/Queries/Reader (LocalEpubMetadata)","FluentResults","System.IO"],"patterns":["Service Interface","Abstraction"],"domainConcepts":["EPUB","Metadata"],"keyDetails":"Small application-layer interface specifying a single async operation to extract EPUB metadata; implementation is expected elsewhere in the Application/Infrastructure layers.","orchestrationMethods":[],"typedContracts":[],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__Abstractions__Services__IEpubReader.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__Abstractions__Services__IEpubReader.cs.json new file mode 100644 index 0000000..153c43a --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__Abstractions__Services__IEpubReader.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/Abstractions/Services/IEpubReader.cs","purpose":"Defines an application-level abstraction for reading and parsing EPUB content for a specific ebook and chapter, exposing a single async operation that returns a Result-wrapped ReaderPageViewModel.","classification":{"role":"service","layer":"application","confidence":0.9,"evidence":["Service naming pattern","Application/service path heuristic","namespace NexusReader.Application.Abstractions.Services","public interface IEpubReader with a GetEpubContentAsync method"]},"className":"IEpubReader","methods":[{"name":"GetEpubContentAsync","line":18,"endLine":22,"signature":"(ebookId: Guid, chapterIndex: int, userId: string? = null, cancellationToken: CancellationToken = default) -> Task>","purpose":"Retrieve content blocks for a specific ebook chapter, returning a Result that wraps a ReaderPageViewModel; supports optional tenant userId and cancellation.","calls":[],"actions":[{"id":"parameter_16","kind":"mapping","label":"tenant-isolation-hint","line":16,"detail":"userId parameter is documented as used for tenant isolation in DB lookup (implementation responsibility).","visibility":"detail-only","confidence":0.7},{"id":"return_18","kind":"return","label":"result-wrapper","line":18,"detail":"Returns a FluentResults.Result wrapping ReaderPageViewModel to convey success/failure and payload.","visibility":"detail-only","confidence":0.7},{"id":"parameter_22","kind":"mapping","label":"cancellation-token","line":22,"detail":"Accepts CancellationToken to allow caller-driven cancellation of the async read.","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"IEpubReader","kind":"interface","line":9,"purpose":"Abstraction for EPUB reading/parsing service used by application code to fetch chapter content.","fields":[{"name":"GetEpubContentAsync","type":"Task>","required":true,"line":18,"description":"Async method to get EPUB chapter content by ebookId and chapterIndex, with optional userId and cancellationToken."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Application.Queries.Reader (ReaderPageViewModel)","FluentResults (Result)"],"patterns":["Abstraction/Service Interface"],"domainConcepts":["Ebook","Chapter","TenantIsolation","ReaderPage (content blocks)"],"keyDetails":"Single-method interface that returns a FluentResults.Result of ReaderPageViewModel; userId is explicitly documented for tenant isolation and a CancellationToken is supported for cooperative cancellation.","orchestrationMethods":[],"typedContracts":[{"name":"IEpubReader","kind":"interface","line":9,"fieldCount":1,"evidencePaths":["NexusReader.Application/Abstractions/Services/IEpubReader.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"IEpubReader","line":9,"summary":"interface with 1 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Abstractions/Services/IEpubReader.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__Abstractions__Services__IIdentityService.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__Abstractions__Services__IIdentityService.cs.json new file mode 100644 index 0000000..2ef47e1 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__Abstractions__Services__IIdentityService.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/Abstractions/Services/IIdentityService.cs","purpose":"Defines the application-layer contract for identity/authentication operations (register, login, logout, profile, token refresh) and an event to notify consumers when authentication state is invalidated.","classification":{"role":"service","layer":"application","confidence":0.9,"evidence":["Service naming pattern","Application/service path heuristic","Namespace: NexusReader.Application.Abstractions.Services","Interface named IIdentityService with auth-related methods (RegisterAsync, LoginAsync, LogoutAsync, GetProfileAsync, RefreshTokenAsync)"]},"className":"IIdentityService","methods":[{"name":"OnStateInvalidated","line":8,"endLine":8,"signature":"event Func? -> void (event declaration)","purpose":"Event that implementations raise/trigger when the identity/authentication state becomes invalid and consumers should refresh/clear state.","calls":[],"actions":[{"id":"event-declaration_8","kind":"mapping","label":"Authentication state invalidation notification","line":8,"detail":"An nullable Func event that subscribers can attach to; raised by implementations when auth state is invalidated.","visibility":"detail-only","confidence":0.7}]},{"name":"RegisterAsync","line":9,"endLine":9,"signature":"(email: string, password: string) -> Task","purpose":"Contract to register a new user account using email and password, returning a FluentResults Result indicating success/failure.","calls":[],"actions":[{"id":"contract_9","kind":"mapping","label":"Registration operation contract","line":9,"detail":"Interface method—implementation should handle validation, persistence, and result mapping.","visibility":"detail-only","confidence":0.7}]},{"name":"LoginAsync","line":10,"endLine":10,"signature":"(email: string, password: string, rememberMe: bool = false) -> Task","purpose":"Contract to authenticate a user with credentials and optional persistence (rememberMe), returning success/failure result.","calls":[],"actions":[{"id":"contract_10","kind":"mapping","label":"Login operation contract","line":10,"detail":"Interface method—implementation expected to perform credential verification, session/token issuance, and optionally persistent login.","visibility":"detail-only","confidence":0.7}]},{"name":"LogoutAsync","line":11,"endLine":11,"signature":"() -> Task","purpose":"Contract to sign out the current user/session and perform any server/client cleanup, returning a result.","calls":[],"actions":[{"id":"contract_11","kind":"mapping","label":"Logout operation contract","line":11,"detail":"Interface method—implementation should revoke tokens/clear session and potentially raise OnStateInvalidated.","visibility":"detail-only","confidence":0.7}]},{"name":"GetProfileAsync","line":12,"endLine":12,"signature":"() -> Task>","purpose":"Contract to retrieve the current user's profile data wrapped in a FluentResults Result.","calls":[],"actions":[{"id":"contract_12","kind":"mapping","label":"Profile retrieval contract","line":12,"detail":"Interface method—implementation should read user profile data from user store or cache and return it.","visibility":"detail-only","confidence":0.7}]},{"name":"RefreshTokenAsync","line":13,"endLine":13,"signature":"() -> Task","purpose":"Contract to refresh authentication tokens (e.g., access/refresh tokens) and return operation result.","calls":[],"actions":[{"id":"contract_13","kind":"mapping","label":"Token refresh contract","line":13,"detail":"Interface method—implementation should attempt token refresh, handle failures, and possibly raise OnStateInvalidated on unrecoverable errors.","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"IIdentityService","kind":"interface","line":6,"purpose":"Application-layer abstraction that specifies authentication/identity operations and a state-invalidated event for consumers.","fields":[{"name":"OnStateInvalidated","type":"Func?","required":false,"line":8,"description":"Event invoked by implementations to notify subscribers when auth/identity state must be refreshed or cleared."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Application.DTOs.User (UserProfileDto)","FluentResults (Result)"],"patterns":["Service Interface","Authentication/Identity"],"domainConcepts":["User","Authentication","Token","Session"],"keyDetails":"Interface-only file—no implementation logic present. It defines the contract for authentication flows and an event to notify consumers about state invalidation; implementations are responsible for validation, persistence, token management, and raising the event.","orchestrationMethods":[],"typedContracts":[{"name":"IIdentityService","kind":"interface","line":6,"fieldCount":1,"evidencePaths":["NexusReader.Application/Abstractions/Services/IIdentityService.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"IIdentityService","line":6,"summary":"interface with 1 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Abstractions/Services/IIdentityService.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__Abstractions__Services__IKnowledgeService.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__Abstractions__Services__IKnowledgeService.cs.json new file mode 100644 index 0000000..5c64d64 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__Abstractions__Services__IKnowledgeService.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/Abstractions/Services/IKnowledgeService.cs","purpose":"Defines the application-level contract for knowledge/AI related operations (semantic search, summarization, groundedness verification, Q&A) used by other layers to interact with AI/knowledge capabilities.","classification":{"role":"service","layer":"application","confidence":0.9,"evidence":["Service naming pattern","Application/service path heuristic","Namespace: NexusReader.Application.Abstractions.Services","Interface named IKnowledgeService exposing async operations for knowledge/AI","Methods return FluentResults.Result and reference DTOs in NexusReader.Application.DTOs.AI"]},"className":"IKnowledgeService","methods":[{"name":"GetKnowledgeAsync","line":8,"endLine":8,"signature":"(text: string, tenantId: string, ebookId: Guid? = null, cancellationToken: CancellationToken = default) -> Task>","purpose":"Retrieve a KnowledgePacket for the supplied text and tenant, optionally scoped to an ebook.","calls":[],"actions":[]},{"name":"GetGraphDataAsync","line":9,"endLine":9,"signature":"(text: string, tenantId: string, ebookId: Guid? = null, cancellationToken: CancellationToken = default) -> Task>","purpose":"Produce graph-structured knowledge data for the given text and tenant (optionally ebook-scoped).","calls":[],"actions":[]},{"name":"GetKnowledgeMapAsync","line":10,"endLine":10,"signature":"(text: string, tenantId: string, ebookId: Guid? = null, cancellationToken: CancellationToken = default) -> Task>","purpose":"Generate a knowledge map representation for the input text for the specified tenant/ebook.","calls":[],"actions":[]},{"name":"GetSummaryAndQuizAsync","line":11,"endLine":11,"signature":"(text: string, tenantId: string, ebookId: Guid? = null, cancellationToken: CancellationToken = default) -> Task>","purpose":"Create a summarized version of the text and accompanying quiz content for the tenant/ebook.","calls":[],"actions":[]},{"name":"GetRelevantContextAsync","line":12,"endLine":12,"signature":"(query: string, tenantId: string, cancellationToken: CancellationToken = default) -> Task>>","purpose":"Return a list of relevant context entries for a query within the tenant scope (used for context retrieval/augmentation).","calls":[],"actions":[]},{"name":"VerifyGroundednessAsync","line":13,"endLine":13,"signature":"(answer: string, context: string, tenantId: string, cancellationToken: CancellationToken = default) -> Task>","purpose":"Assess whether an answer is grounded in provided context and return a scored rationale.","calls":[],"actions":[]},{"name":"SearchLibrarySemanticallyAsync","line":14,"endLine":14,"signature":"(queryText: string, tenantId: string, limit: int, cancellationToken: CancellationToken = default) -> Task>>","purpose":"Perform semantic search against the library for the tenant, returning up to a specified limit of results.","calls":[],"actions":[]},{"name":"AskQuestionAsync","line":15,"endLine":15,"signature":"(question: string, tenantId: string, ebookId: Guid? = null, limit: int = 5, cancellationToken: CancellationToken = default) -> Task>","purpose":"Ask a question in the tenant/optional ebook context and receive a grounded response (with limit for candidate/context size).","calls":[],"actions":[]},{"name":"ClearCacheAsync","line":16,"endLine":16,"signature":"(cancellationToken: CancellationToken = default) -> Task","purpose":"Clear any knowledge/AI related caches used by the implementation.","calls":[],"actions":[]}],"types":[{"name":"GroundednessResult","kind":"dto","line":19,"purpose":"Represents the result of a groundedness check: score, textual rationale, and a boolean grounded flag.","fields":[{"name":"Score","type":"float","required":true,"line":19,"description":"Numeric groundedness score"},{"name":"Rationale","type":"string","required":true,"line":19,"description":"Explanation of the grounding assessment"},{"name":"IsGrounded","type":"bool","required":true,"line":19,"description":"Whether the answer is considered grounded in the context"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["FluentResults (library)","NexusReader.Application.DTOs.AI (DTO namespace referenced)"],"patterns":["Service Interface","Result-wrapping (FluentResults)"],"domainConcepts":["KnowledgePacket","Groundedness","Semantic Search","RelevantContext","GroundedResponse"],"keyDetails":"This file is an abstraction-level interface describing async knowledge/AI operations across tenants and optional ebook scoping; implementations will use FluentResults.Result for outcome modeling and DTOs from the AI DTO namespace.","orchestrationMethods":[],"typedContracts":[{"name":"GroundednessResult","kind":"dto","line":19,"fieldCount":3,"evidencePaths":["NexusReader.Application/Abstractions/Services/IKnowledgeService.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"GroundednessResult","line":19,"summary":"dto with 3 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Abstractions/Services/IKnowledgeService.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__Abstractions__Services__INativeStorageService.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__Abstractions__Services__INativeStorageService.cs.json new file mode 100644 index 0000000..7ae1107 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__Abstractions__Services__INativeStorageService.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/Abstractions/Services/INativeStorageService.cs","purpose":"Defines an application-level abstraction for synchronous/asynchronous native (including secure) key/value storage operations across platforms.","classification":{"role":"service","layer":"application","confidence":0.9,"evidence":["Service naming pattern","Application/service path heuristic","Namespace NexusReader.Application.Abstractions.Services","Interface named INativeStorageService exposes storage operations (Save/Get/Remove) including secure variants"]},"className":"INativeStorageService","methods":[{"name":"SaveStringAsync","line":7,"endLine":7,"signature":"(key: string, value: string) -> Task","purpose":"Persist a string value by key in native storage.","calls":[],"actions":[{"id":"declaration-only_7","kind":"mapping","label":"Interface method declaration","line":7,"detail":"No runtime body; contract for implementing classes","visibility":"detail-only","confidence":0.7}]},{"name":"GetStringAsync","line":8,"endLine":8,"signature":"(key: string) -> Task>","purpose":"Retrieve an optional string value by key from native storage.","calls":[],"actions":[{"id":"declaration-only_8","kind":"mapping","label":"Interface method declaration","line":8,"detail":"Returns Result wrapper with nullable string payload","visibility":"detail-only","confidence":0.7}]},{"name":"SaveBoolAsync","line":9,"endLine":9,"signature":"(key: string, value: bool) -> Task","purpose":"Persist a boolean value by key in native storage.","calls":[],"actions":[{"id":"declaration-only_9","kind":"mapping","label":"Interface method declaration","line":9,"detail":"Contract for saving booleans","visibility":"detail-only","confidence":0.7}]},{"name":"GetBoolAsync","line":10,"endLine":10,"signature":"(key: string, defaultValue: bool = false) -> Task>","purpose":"Retrieve a boolean value by key, returning a default if absent, wrapped in a Result.","calls":[],"actions":[{"id":"declaration-only_10","kind":"mapping","label":"Interface method declaration with default parameter","line":10,"detail":"Includes defaultValue parameter to indicate fallback behavior for implementers","visibility":"detail-only","confidence":0.7}]},{"name":"RemoveAsync","line":11,"endLine":11,"signature":"(key: string) -> Task","purpose":"Remove an entry by key from native storage.","calls":[],"actions":[{"id":"declaration-only_11","kind":"mapping","label":"Interface method declaration","line":11,"detail":"Contract for deletion/removal","visibility":"detail-only","confidence":0.7}]},{"name":"SaveSecureString","line":13,"endLine":13,"signature":"(key: string, value: string) -> Task","purpose":"Persist a string securely (platform secure storage) by key.","calls":[],"actions":[{"id":"declaration-only_13","kind":"mapping","label":"Interface method declaration for secure storage","line":13,"detail":"Indicates secure storage variant for sensitive data","visibility":"detail-only","confidence":0.7}]},{"name":"GetSecureString","line":14,"endLine":14,"signature":"(key: string) -> Task>","purpose":"Retrieve an optional securely stored string by key.","calls":[],"actions":[{"id":"declaration-only_14","kind":"mapping","label":"Interface method declaration for secure retrieval","line":14,"detail":"Returns Result wrapper with nullable string payload","visibility":"detail-only","confidence":0.7}]},{"name":"RemoveSecureAsync","line":15,"endLine":15,"signature":"(key: string) -> Task","purpose":"Remove a securely stored entry by key.","calls":[],"actions":[{"id":"declaration-only_15","kind":"mapping","label":"Interface method declaration for secure removal","line":15,"detail":"Contract for removing secure entries","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"INativeStorageService","kind":"interface","line":5,"purpose":"Contract specifying async key/value native storage operations including secure variants for cross-platform implementations.","fields":[{"name":"SaveStringAsync","type":"Task","required":true,"line":7,"description":"Save a string value by key"},{"name":"GetStringAsync","type":"Task>","required":true,"line":8,"description":"Get a nullable string value by key"},{"name":"SaveBoolAsync","type":"Task","required":true,"line":9,"description":"Save a boolean value by key"},{"name":"GetBoolAsync","type":"Task>","required":true,"line":10,"description":"Get a boolean value by key with a default fallback"},{"name":"RemoveAsync","type":"Task","required":true,"line":11,"description":"Remove a stored entry by key"},{"name":"SaveSecureString","type":"Task","required":true,"line":13,"description":"Save sensitive string data in secure storage"},{"name":"GetSecureString","type":"Task>","required":true,"line":14,"description":"Retrieve sensitive string data from secure storage"},{"name":"RemoveSecureAsync","type":"Task","required":true,"line":15,"description":"Remove sensitive entry from secure storage"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["Interface","Abstraction","Adapter"],"domainConcepts":["Key/value storage","Secure storage","Configuration/Preferences"],"keyDetails":"A lightweight application-level abstraction (interface) intended for platform-specific implementations to provide persistent and secure key/value storage with Result-wrapped async operations.","orchestrationMethods":[],"typedContracts":[{"name":"INativeStorageService","kind":"interface","line":5,"fieldCount":8,"evidencePaths":["NexusReader.Application/Abstractions/Services/INativeStorageService.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"INativeStorageService","line":5,"summary":"interface with 8 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Abstractions/Services/INativeStorageService.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__Abstractions__Services__IPlatformService.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__Abstractions__Services__IPlatformService.cs.json new file mode 100644 index 0000000..9e0148c --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__Abstractions__Services__IPlatformService.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/Abstractions/Services/IPlatformService.cs","purpose":"Defines an application-level platform abstraction for device capabilities (vibration) and a small device info model (DeviceContext) used by UI/client layers to adapt behavior per device.","classification":{"role":"service","layer":"application","confidence":0.9,"evidence":["Service naming pattern","Application/service path heuristic","Namespace NexusReader.Application.Abstractions.Services indicates an application-level service abstraction","File exposes an interface IPlatformService and types representing device context and enums for device/orientation"]},"className":"IPlatformService","methods":[{"name":"VibrateSuccessAsync","line":7,"endLine":7,"signature":"() -> Task","purpose":"Requests a short platform-specific 'success' vibration; returns a Result indicating success/failure.","calls":[],"actions":[{"id":"return_7","kind":"return","label":"async result","line":7,"detail":"Task returned by implementation","visibility":"detail-only","confidence":0.7}]},{"name":"VibrateErrorAsync","line":8,"endLine":8,"signature":"() -> Task","purpose":"Requests a short platform-specific 'error' vibration; returns a Result indicating success/failure.","calls":[],"actions":[{"id":"return_8","kind":"return","label":"async result","line":8,"detail":"Task returned by implementation","visibility":"detail-only","confidence":0.7}]},{"name":"VibrateAsync","line":9,"endLine":9,"signature":"(milliseconds: int) -> Task","purpose":"Requests a platform vibration for the specified duration in milliseconds; returns a Result indicating success/failure.","calls":[],"actions":[{"id":"return_9","kind":"return","label":"async result","line":9,"detail":"Task returned by implementation","visibility":"detail-only","confidence":0.7},{"id":"parameter_9","kind":"mapping","label":"milliseconds","line":9,"detail":"duration passed to platform implementation","visibility":"detail-only","confidence":0.7}]},{"name":"GetDeviceContext","line":10,"endLine":10,"signature":"() -> Result","purpose":"Retrieves current device characteristics (model, manufacturer, type, orientation) wrapped in a Result.","calls":[],"actions":[{"id":"return_10","kind":"return","label":"synchronous result","line":10,"detail":"Result returned by implementation","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"DeviceContext","kind":"dto","line":13,"purpose":"Represents device metadata (model, manufacturer, device type, display orientation) for platform-aware logic.","fields":[{"name":"Model","type":"string","required":true,"line":14,"description":"Device model identifier"},{"name":"Manufacturer","type":"string","required":true,"line":15,"description":"Device manufacturer"},{"name":"DeviceType","type":"DeviceType","required":true,"line":16,"description":"High-level category of device (Phone/Tablet/Desktop/Unknown)"},{"name":"Orientation","type":"DisplayOrientation","required":true,"line":17,"description":"Current display orientation"}]},{"name":"DeviceType","kind":"enum","line":20,"purpose":"Enumerates device categories used to adapt UI/behavior.","fields":[{"name":"Unknown","type":"DeviceType","required":true,"line":22,"description":"Unclassified device"},{"name":"Phone","type":"DeviceType","required":true,"line":23,"description":"Phone-sized device"},{"name":"Tablet","type":"DeviceType","required":true,"line":24,"description":"Tablet-sized device"},{"name":"Desktop","type":"DeviceType","required":true,"line":25,"description":"Desktop device"}]},{"name":"DisplayOrientation","kind":"enum","line":28,"purpose":"Enumerates possible screen orientations to allow layout/behavior adjustments.","fields":[{"name":"Unknown","type":"DisplayOrientation","required":true,"line":30,"description":"Orientation not determined"},{"name":"Portrait","type":"DisplayOrientation","required":true,"line":31,"description":"Portrait orientation"},{"name":"Landscape","type":"DisplayOrientation","required":true,"line":32,"description":"Landscape orientation"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["Service Interface","Platform Abstraction / Adapter"],"domainConcepts":["Device","Vibration","DisplayOrientation"],"keyDetails":"Pure abstraction: interface declares vibration operations and a device-context DTO; implementations will be platform-specific (WASM/MAUI/desktop) and are responsible for actual vibration and device info retrieval.","orchestrationMethods":[],"typedContracts":[{"name":"DeviceContext","kind":"dto","line":13,"fieldCount":4,"evidencePaths":["NexusReader.Application/Abstractions/Services/IPlatformService.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"DeviceContext","line":13,"summary":"dto with 4 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Abstractions/Services/IPlatformService.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__Commands__AI__VerifyGroundednessCommand.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__Commands__AI__VerifyGroundednessCommand.cs.json new file mode 100644 index 0000000..4e2b2d3 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__Commands__AI__VerifyGroundednessCommand.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/Commands/AI/VerifyGroundednessCommand.cs","purpose":"Defines a MediatR command (VerifyGroundednessCommand) and its handler which delegates groundedness verification to an IKnowledgeService implementation.","classification":{"role":"handler","layer":"application","confidence":0.9,"evidence":["Command pattern","Contains a record that implements IRequest>","Handler class implements MediatR IRequestHandler and calls IKnowledgeService"]},"className":"VerifyGroundednessCommandHandler","methods":[{"name":"VerifyGroundednessCommandHandler","line":13,"endLine":16,"signature":"(knowledgeService: IKnowledgeService) -> VerifyGroundednessCommandHandler","purpose":"Constructs the handler and stores the required IKnowledgeService dependency for later calls.","calls":[],"actions":[{"id":"dependency-injection_13","kind":"mapping","label":"Receives IKnowledgeService via constructor","line":13,"detail":"constructor parameter injection","visibility":"detail-only","confidence":0.7},{"id":"assign-field_15","kind":"mapping","label":"Assigns injected service to private field","line":15,"detail":"_knowledgeService = knowledgeService;","visibility":"detail-only","confidence":0.7}]},{"name":"Handle","line":18,"endLine":21,"signature":"(request: VerifyGroundednessCommand, cancellationToken: CancellationToken) -> Task>","purpose":"Handles the VerifyGroundednessCommand by delegating to IKnowledgeService.VerifyGroundednessAsync and returning its result.","calls":[{"targetFile":"NexusReader.Application/Abstractions/Services/IKnowledgeService.cs","targetMethod":"VerifyGroundednessAsync","callLine":20,"paramSummary":"request.Answer, request.Context, request.TenantId, cancellationToken"}],"actions":[{"id":"external-call_20","kind":"external-call","label":"Delegates verification to knowledge service","line":20,"detail":"await _knowledgeService.VerifyGroundednessAsync(...)","visibility":"detail-only","confidence":0.7},{"id":"handle_return_20_0","kind":"return","label":"Returns result","line":20,"detail":"return await _knowledgeService.VerifyGroundednessAsync(request.Answer, request.Context, request.TenantId, cancellationToken);","visibility":"detail-only","confidence":0.7},{"id":"return_20","kind":"return","label":"Returns service result directly","line":20,"detail":"returns Task> from the knowledge service","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"VerifyGroundednessCommand","kind":"command","line":7,"purpose":"Carries the answer, context, and tenant id for a groundedness verification request through MediatR.","fields":[{"name":"Answer","type":"string","required":true,"line":7,"description":"The answer text to verify"},{"name":"Context","type":"string","required":true,"line":7,"description":"Contextual information used for verification"},{"name":"TenantId","type":"string","required":true,"line":7,"description":"Tenant identifier for scoped verification"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Application/Abstractions/Services/IKnowledgeService.cs"],"patterns":["Mediator (MediatR) handler","Dependency Injection"],"domainConcepts":["Groundedness","AI verification","KnowledgeService"],"keyDetails":"This file provides a thin MediatR handler that simply forwards the request to an IKnowledgeService; no branching, validation, or local persistence occurs here.","orchestrationMethods":[{"name":"Handle","line":18,"confidence":0.65,"reason":"Contains 1 architectural actions relevant to business execution.","actionKinds":["external-call","return"],"evidencePaths":["NexusReader.Application/Commands/AI/VerifyGroundednessCommand.cs","NexusReader.Application/Abstractions/Services/IKnowledgeService.cs"]}],"typedContracts":[{"name":"VerifyGroundednessCommand","kind":"command","line":7,"fieldCount":3,"evidencePaths":["NexusReader.Application/Commands/AI/VerifyGroundednessCommand.cs"]}],"persistenceInteractions":[],"externalInteractions":[{"methodName":"Handle","line":20,"kind":"external-call","detail":"await _knowledgeService.VerifyGroundednessAsync(...)","evidencePaths":["NexusReader.Application/Commands/AI/VerifyGroundednessCommand.cs"]}],"evidenceAnchors":[{"kind":"orchestration-method","label":"Handle","line":18,"summary":"Contains 1 architectural actions relevant to business execution.","confidence":0.65,"evidencePaths":["NexusReader.Application/Commands/AI/VerifyGroundednessCommand.cs","NexusReader.Application/Abstractions/Services/IKnowledgeService.cs"]},{"kind":"typed-contract","label":"VerifyGroundednessCommand","line":7,"summary":"command with 3 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Commands/AI/VerifyGroundednessCommand.cs"]},{"kind":"external-call","label":"Handle","line":20,"summary":"await _knowledgeService.VerifyGroundednessAsync(...)","confidence":0.8,"evidencePaths":["NexusReader.Application/Commands/AI/VerifyGroundednessCommand.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__Commands__Library__IngestEbookCommand.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__Commands__Library__IngestEbookCommand.cs.json new file mode 100644 index 0000000..83668c2 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__Commands__Library__IngestEbookCommand.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/Commands/Library/IngestEbookCommand.cs","purpose":"Defines a CQRS command record used to ingest a new ebook into the library, carrying payload (metadata, content bytes, ownership and tenant info) for application-side handlers.","classification":{"role":"handler","layer":"application","confidence":0.9,"evidence":["Command pattern","Namespace: NexusReader.Application.Commands.Library (line 3)","Declares a record named IngestEbookCommand that implements ICommand (lines 15-23)"]},"className":"IngestEbookCommand","methods":[],"types":[{"name":"IngestEbookCommand","kind":"command","line":15,"purpose":"Represents the input payload to ingest a new ebook (title, author, cover bytes, EPUB bytes, description, owner and tenant) for processing by an application command handler.","fields":[{"name":"Title","type":"string","required":true,"line":16,"description":"The title of the ebook."},{"name":"AuthorName","type":"string","required":true,"line":17,"description":"The name of the author."},{"name":"CoverImage","type":"byte[]?","required":false,"line":18,"description":"Optional raw bytes for the cover image."},{"name":"EpubData","type":"byte[]","required":true,"line":19,"description":"Raw bytes of the EPUB file (content to persist/process)."},{"name":"Description","type":"string?","required":false,"line":20,"description":"Optional description or summary of the book."},{"name":"UserId","type":"string","required":true,"line":21,"description":"ID of the user who owns/ingested the book."},{"name":"TenantId","type":"string","required":false,"line":22,"description":"Tenant ID for multi-tenant isolation; defaults to \"global\"."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Application.Abstractions.Messaging"],"patterns":["CQRS Command"],"domainConcepts":["Ebook","Library","Tenant","User/Ownership"],"keyDetails":"Record implements ICommand (line 23) so it is intended for a command handler that will return a Guid (likely the created ebook id). TenantId has a default of \"global\" indicating single-tenant default behavior. Contains raw binary payloads (CoverImage, EpubData) which imply handlers will perform persistence or external storage operations.","orchestrationMethods":[],"typedContracts":[{"name":"IngestEbookCommand","kind":"command","line":15,"fieldCount":7,"evidencePaths":["NexusReader.Application/Commands/Library/IngestEbookCommand.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"IngestEbookCommand","line":15,"summary":"command with 7 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Commands/Library/IngestEbookCommand.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__Commands__Library__IngestEbookCommandHandler.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__Commands__Library__IngestEbookCommandHandler.cs.json new file mode 100644 index 0000000..a9eceb1 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__Commands__Library__IngestEbookCommandHandler.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/Commands/Library/IngestEbookCommandHandler.cs","purpose":"Handles ingestion of an EPUB into application storage and persistence: saves files via storage service, ensures/creates author, creates Ebook entity, and persists it returning the new Ebook Id or a failure result.","classification":{"role":"handler","layer":"application","confidence":0.95,"evidence":["Command pattern","Implements MediatR IRequestHandler (line 10)","Namespace NexusReader.Application.Commands.Library (line 8)","Calls repository and storage service abstractions to persist domain entities and files (lines 31, 52, 72)"]},"className":"IngestEbookCommandHandler","methods":[{"name":"IngestEbookCommandHandler","line":15,"endLine":21,"signature":"(ebookRepository: IEbookRepository, storageService: IBookStorageService) -> IngestEbookCommandHandler","purpose":"Constructor that receives and stores repository and storage service dependencies.","calls":[],"actions":[{"id":"assignment_19","kind":"mapping","label":"Assign injected dependencies to fields","line":19,"detail":"_ebookRepository = ebookRepository; _storageService = storageService;","visibility":"detail-only","confidence":0.7}]},{"name":"Handle","line":23,"endLine":81,"signature":"(request: IngestEbookCommand, cancellationToken: CancellationToken) -> Task>","purpose":"Orchestrates saving ebook files to storage, resolving/creating the author, creating and persisting the Ebook entity, and returning success/failure Result with the Ebook Id.","calls":[{"targetFile":"NexusReader.Application.Abstractions.Services/IBookStorageService.cs","targetMethod":"SaveEbookAsync","callLine":31,"paramSummary":"request.EpubData, filename = \"{request.Title}.epub\""},{"targetFile":"NexusReader.Application.Abstractions.Services/IBookStorageService.cs","targetMethod":"SaveCoverAsync","callLine":33,"paramSummary":"request.CoverImage, filename = \"{request.Title}_cover.jpg\" (conditional)"},{"targetFile":"NexusReader.Application.Abstractions.Persistence/IEbookRepository.cs","targetMethod":"FindAuthorByNameAsync","callLine":52,"paramSummary":"authorName (trimmed/defaulted), cancellationToken"},{"targetFile":"NexusReader.Application.Abstractions.Persistence/IEbookRepository.cs","targetMethod":"AddAuthor","callLine":56,"paramSummary":"new Author { Name = authorName }"},{"targetFile":"NexusReader.Application.Abstractions.Persistence/IEbookRepository.cs","targetMethod":"AddEbook","callLine":72,"paramSummary":"ebook (new Ebook entity with Title, Author, FilePath, CoverUrl, Description, UserId, TenantId, AddedDate)"},{"targetFile":"NexusReader.Application.Abstractions.Persistence/IEbookRepository.cs","targetMethod":"SaveChangesAsync","callLine":73,"paramSummary":"cancellationToken"}],"actions":[{"id":"try-block_28","kind":"mapping","label":"Save files to storage","line":28,"detail":"Attempts SaveEbookAsync and conditionally SaveCoverAsync; catches IOException and generic Exception separately to return storage failures.","visibility":"detail-only","confidence":0.7},{"id":"external-call_31","kind":"external-call","label":"Save EPUB file","line":31,"detail":"Calls storage service to persist epub; assigns returned path to epubPath.","visibility":"detail-only","confidence":0.7},{"id":"branch_32","kind":"branch","label":"Conditional cover save","line":32,"detail":"If present, saves cover and sets coverUrl; otherwise leaves coverUrl null.","conditionSummary":"request.CoverImage != null && request.CoverImage.Length > 0","outcomeLabels":["save cover (calls SaveCoverAsync)","no cover (coverUrl = null)"],"visibility":"detail-only","confidence":0.7},{"id":"catch_36","kind":"mapping","label":"Storage I/O failure handling","line":36,"detail":"Returns Result.Fail with message 'Storage I/O failure: ...'.","conditionSummary":"IOException from storage service","outcomeLabels":["return failure Result with error caused by exception"],"visibility":"detail-only","confidence":0.7},{"id":"handle_return_38_0","kind":"return","label":"Returns result","line":38,"detail":"return Result.Fail(new Error($\"Storage I/O failure: {ex.Message}\").CausedBy(ex));","visibility":"detail-only","confidence":0.7},{"id":"catch_40","kind":"mapping","label":"Storage generic failure handling","line":40,"detail":"Returns Result.Fail with message 'Storage failure: ...'.","conditionSummary":"Any Exception from storage service","outcomeLabels":["return failure Result with error caused by exception"],"visibility":"detail-only","confidence":0.7},{"id":"handle_return_42_1","kind":"return","label":"Returns result","line":42,"detail":"return Result.Fail(new Error($\"Storage failure: {ex.Message}\").CausedBy(ex));","visibility":"detail-only","confidence":0.7},{"id":"try-block_45","kind":"mapping","label":"Create/resolve author and persist ebook","line":45,"detail":"Resolves author by name (creates if missing), constructs Ebook entity, persists via repository and SaveChangesAsync; returns success Result or fails on exceptions.","visibility":"detail-only","confidence":0.7},{"id":"guard-clause_48","kind":"guard-clause","label":"Default author name","line":48,"detail":"Normalizes author name to non-empty value.","conditionSummary":"string.IsNullOrWhiteSpace(request.AuthorName)","outcomeLabels":["use 'Unknown Author'","use trimmed request.AuthorName"],"visibility":"detail-only","confidence":0.7},{"id":"external-call_52","kind":"external-call","label":"Find author by name (repository)","line":52,"detail":"Attempts case-insensitive repository lookup for existing Author.","visibility":"detail-only","confidence":0.7},{"id":"handle_repository-read_52_2","kind":"repository-read","label":"Reads repository or persistence state","line":52,"detail":"var author = await _ebookRepository.FindAuthorByNameAsync(authorName, cancellationToken);","visibility":"secondary-visible","confidence":0.86},{"id":"branch_53","kind":"branch","label":"Author creation fallback","line":53,"detail":"Adds new Author to repository when not found.","conditionSummary":"author == null","outcomeLabels":["create and add new Author","reuse existing Author"],"visibility":"detail-only","confidence":0.7},{"id":"handle_branch_53_3","kind":"branch","label":"Evaluates branch condition","line":53,"detail":"if (author == null)","conditionSummary":"author == null","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"persistence-write_72","kind":"mapping","label":"Add Ebook to repository","line":72,"detail":"Calls AddEbook with constructed Ebook entity.","visibility":"detail-only","confidence":0.7},{"id":"persistence-commit_73","kind":"mapping","label":"Commit repository changes","line":73,"detail":"Calls SaveChangesAsync to persist Author and Ebook.","visibility":"detail-only","confidence":0.7},{"id":"return_75","kind":"return","label":"Return success Result with Ebook Id","line":75,"detail":"Result.Ok(ebook.Id)","visibility":"detail-only","confidence":0.7},{"id":"handle_return_75_4","kind":"return","label":"Returns result","line":75,"detail":"return Result.Ok(ebook.Id);","visibility":"detail-only","confidence":0.7},{"id":"catch_77","kind":"mapping","label":"Database error handling","line":77,"detail":"Returns Result.Fail with 'Database error during ingestion: ...'.","conditionSummary":"Any Exception during repository operations","outcomeLabels":["return failure Result with database error"],"visibility":"detail-only","confidence":0.7},{"id":"handle_return_79_5","kind":"return","label":"Returns result","line":79,"detail":"return Result.Fail(new Error($\"Database error during ingestion: {ex.Message}\").CausedBy(ex));","visibility":"detail-only","confidence":0.7}]}],"types":[],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Application.Abstractions.Services/IBookStorageService.cs","NexusReader.Application.Abstractions.Persistence/IEbookRepository.cs","NexusReader.Domain.Entities/Author.cs","NexusReader.Domain.Entities/Ebook.cs","NexusReader.Application.Commands.Library/IngestEbookCommand.cs"],"patterns":["Mediator (MediatR) Command Handler","Repository","Unit of Work (SaveChangesAsync)"],"domainConcepts":["Ebook","Author","TenantId/UserId (multitenancy/audit metadata)"],"keyDetails":"Handler performs two-phase operation: file storage first (with distinct I/O error handling), then DB work (author resolution/creation and ebook persistence) with separate error mapping to Result failures; uses repository SaveChangesAsync to commit both author and ebook.","orchestrationMethods":[{"name":"Handle","line":23,"confidence":0.98,"reason":"Coordinates 6 downstream calls with 6 architectural actions.","actionKinds":["mapping","external-call","branch","return","guard-clause","repository-read"],"evidencePaths":["NexusReader.Application/Commands/Library/IngestEbookCommandHandler.cs","NexusReader.Application.Abstractions.Services/IBookStorageService.cs","NexusReader.Application.Abstractions.Services/IBookStorageService.cs","NexusReader.Application.Abstractions.Persistence/IEbookRepository.cs","NexusReader.Application.Abstractions.Persistence/IEbookRepository.cs","NexusReader.Application.Abstractions.Persistence/IEbookRepository.cs"]}],"typedContracts":[],"persistenceInteractions":[{"methodName":"Handle","line":52,"kind":"persistence-read","detail":"var author = await _ebookRepository.FindAuthorByNameAsync(authorName, cancellationToken);","evidencePaths":["NexusReader.Application/Commands/Library/IngestEbookCommandHandler.cs"]}],"externalInteractions":[{"methodName":"Handle","line":31,"kind":"external-call","detail":"Calls storage service to persist epub; assigns returned path to epubPath.","evidencePaths":["NexusReader.Application/Commands/Library/IngestEbookCommandHandler.cs"]},{"methodName":"Handle","line":52,"kind":"external-call","detail":"Attempts case-insensitive repository lookup for existing Author.","evidencePaths":["NexusReader.Application/Commands/Library/IngestEbookCommandHandler.cs"]}],"evidenceAnchors":[{"kind":"orchestration-method","label":"Handle","line":23,"summary":"Coordinates 6 downstream calls with 6 architectural actions.","confidence":0.98,"evidencePaths":["NexusReader.Application/Commands/Library/IngestEbookCommandHandler.cs","NexusReader.Application.Abstractions.Services/IBookStorageService.cs","NexusReader.Application.Abstractions.Services/IBookStorageService.cs","NexusReader.Application.Abstractions.Persistence/IEbookRepository.cs","NexusReader.Application.Abstractions.Persistence/IEbookRepository.cs","NexusReader.Application.Abstractions.Persistence/IEbookRepository.cs"]},{"kind":"persistence","label":"Handle","line":52,"summary":"var author = await _ebookRepository.FindAuthorByNameAsync(authorName, cancellationToken);","confidence":0.82,"evidencePaths":["NexusReader.Application/Commands/Library/IngestEbookCommandHandler.cs"]},{"kind":"external-call","label":"Handle","line":31,"summary":"Calls storage service to persist epub; assigns returned path to epubPath.","confidence":0.8,"evidencePaths":["NexusReader.Application/Commands/Library/IngestEbookCommandHandler.cs"]},{"kind":"external-call","label":"Handle","line":52,"summary":"Attempts case-insensitive repository lookup for existing Author.","confidence":0.8,"evidencePaths":["NexusReader.Application/Commands/Library/IngestEbookCommandHandler.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__Commands__Library__IngestEbookRequest.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__Commands__Library__IngestEbookRequest.cs.json new file mode 100644 index 0000000..3675cb7 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__Commands__Library__IngestEbookRequest.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/Commands/Library/IngestEbookRequest.cs","purpose":"Defines a command/request DTO used to ingest an ebook into the library (carries metadata and base64-encoded payload).","classification":{"role":"handler","layer":"application","confidence":0.9,"evidence":["Command pattern","Namespace: NexusReader.Application.Commands.Library","File path indicates Commands/Library and the type is named IngestEbookRequest","Record shape carries data for an application-level request (ingest)"]},"className":"IngestEbookRequest","methods":[],"types":[{"name":"IngestEbookRequest","kind":"command","line":3,"purpose":"Represents the data required to ingest an ebook: metadata, optional cover image, and the EPUB payload (base64).","fields":[{"name":"Title","type":"string","required":true,"line":4,"description":"Ebook title"},{"name":"AuthorName","type":"string","required":true,"line":5,"description":"Author's name"},{"name":"CoverImageBase64","type":"string?","required":false,"line":6,"description":"Optional cover image encoded as base64"},{"name":"EpubDataBase64","type":"string","required":true,"line":7,"description":"EPUB file content encoded as base64"},{"name":"Description","type":"string?","required":false,"line":8,"description":"Optional description (has default null)"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["Command DTO"],"domainConcepts":["Ebook","Library","Author","CoverImage"],"keyDetails":"Simple immutable record used as an application command carrying base64-encoded EPUB payload and optional cover/description; no runtime behavior, methods, or external calls in this file.","orchestrationMethods":[],"typedContracts":[{"name":"IngestEbookRequest","kind":"command","line":3,"fieldCount":5,"evidencePaths":["NexusReader.Application/Commands/Library/IngestEbookRequest.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"IngestEbookRequest","line":3,"summary":"command with 5 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Commands/Library/IngestEbookRequest.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__Commands__Quiz__SubmitAnswerCommand.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__Commands__Quiz__SubmitAnswerCommand.cs.json new file mode 100644 index 0000000..8f4fe46 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__Commands__Quiz__SubmitAnswerCommand.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/Commands/Quiz/SubmitAnswerCommand.cs","purpose":"Defines a lightweight CQRS command that carries the user's selected answer index and the correct index for quiz answer submission.","classification":{"role":"handler","layer":"application","confidence":0.9,"evidence":["Command pattern","Namespace: NexusReader.Application.Commands.Quiz","Type implements ICommand from Application.Abstractions.Messaging"]},"className":"SubmitAnswerCommand","methods":[],"types":[{"name":"SubmitAnswerCommand","kind":"command","line":5,"purpose":"Represents a request to submit an answer for a quiz question carrying the selected and correct indices.","fields":[{"name":"SelectedIndex","type":"int","required":true,"line":5,"description":"Index chosen by the user"},{"name":"CorrectIndex","type":"int","required":true,"line":5,"description":"Index considered correct for the question"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Application.Abstractions.Messaging"],"patterns":["CQRS","Command"],"domainConcepts":["Quiz","Answer"],"keyDetails":"Simple immutable record used as a CQRS command (ICommand) carrying two integers; no methods or runtime branching present in this file.","orchestrationMethods":[],"typedContracts":[{"name":"SubmitAnswerCommand","kind":"command","line":5,"fieldCount":2,"evidencePaths":["NexusReader.Application/Commands/Quiz/SubmitAnswerCommand.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"SubmitAnswerCommand","line":5,"summary":"command with 2 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Commands/Quiz/SubmitAnswerCommand.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__Commands__Quiz__SubmitAnswerCommandHandler.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__Commands__Quiz__SubmitAnswerCommandHandler.cs.json new file mode 100644 index 0000000..16096fa --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__Commands__Quiz__SubmitAnswerCommandHandler.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/Commands/Quiz/SubmitAnswerCommandHandler.cs","purpose":"Command handler that processes a quiz answer submission: vibrates the device on correct answers and returns success/failure results.","classification":{"role":"handler","layer":"application","confidence":0.9,"evidence":["Command pattern","Class implements ICommandHandler (line 7)","Namespace NexusReader.Application.Commands.Quiz (line 5)"]},"className":"SubmitAnswerCommandHandler","methods":[{"name":"Handle","line":16,"endLine":25,"signature":"(request: SubmitAnswerCommand, cancellationToken: CancellationToken) -> Task","purpose":"Evaluates the submitted answer, triggers a short vibration if correct, and returns a success or failure Result.","calls":[{"targetFile":"NexusReader.Application.Abstractions.Services","targetMethod":"VibrateAsync","callLine":20,"paramSummary":"durationMs: 50"}],"actions":[{"id":"guard-clause_18","kind":"guard-clause","label":"Check if selected index equals correct index","line":18,"detail":"If true, vibrate and return Result.Ok(); otherwise return Result.Fail(...)","conditionSummary":"request.SelectedIndex == request.CorrectIndex","outcomeLabels":["correct","incorrect"],"visibility":"detail-only","confidence":0.7},{"id":"handle_branch_18_0","kind":"branch","label":"Evaluates branch condition","line":18,"detail":"if (request.SelectedIndex == request.CorrectIndex)","conditionSummary":"request.SelectedIndex == request.CorrectIndex","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"external-call_20","kind":"external-call","label":"Triggers platform vibration for correct answer","line":20,"detail":"await _platformService.VibrateAsync(50)","visibility":"detail-only","confidence":0.7},{"id":"return_21","kind":"return","label":"Return success Result","line":21,"detail":"Result.Ok()","visibility":"detail-only","confidence":0.7},{"id":"handle_return_21_1","kind":"return","label":"Returns result","line":21,"detail":"return Result.Ok();","visibility":"detail-only","confidence":0.7},{"id":"return_24","kind":"return","label":"Return failure Result","line":24,"detail":"Result.Fail(\"Incorrect answer.\")","visibility":"detail-only","confidence":0.7},{"id":"handle_return_24_2","kind":"return","label":"Returns result","line":24,"detail":"return Result.Fail(\"Incorrect answer.\");","visibility":"detail-only","confidence":0.7}]},{"name":"SubmitAnswerCommandHandler","line":11,"endLine":14,"signature":"(platformService: IPlatformService) -> SubmitAnswerCommandHandler","purpose":"Constructor that injects the platform service dependency.","calls":[],"actions":[{"id":"assign_13","kind":"mapping","label":"Assign injected dependency","line":13,"detail":"_platformService = platformService","visibility":"detail-only","confidence":0.7}]}],"types":[],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Application.Abstractions.Services","NexusReader.Application.Abstractions.Messaging","FluentResults (nuget)"],"patterns":["Command Handler","Dependency Injection"],"domainConcepts":["Quiz","Answer"],"keyDetails":"Runtime behavior centers on a simple branch: correct answer triggers a platform vibration (external call) and returns Result.Ok; incorrect returns Result.Fail. Implements ICommandHandler in the Application layer.","orchestrationMethods":[{"name":"Handle","line":16,"confidence":0.77,"reason":"Contains 2 architectural actions relevant to business execution.","actionKinds":["guard-clause","branch","external-call","return"],"evidencePaths":["NexusReader.Application/Commands/Quiz/SubmitAnswerCommandHandler.cs","NexusReader.Application.Abstractions.Services"]}],"typedContracts":[],"persistenceInteractions":[],"externalInteractions":[{"methodName":"Handle","line":20,"kind":"external-call","detail":"await _platformService.VibrateAsync(50)","evidencePaths":["NexusReader.Application/Commands/Quiz/SubmitAnswerCommandHandler.cs"]}],"evidenceAnchors":[{"kind":"orchestration-method","label":"Handle","line":16,"summary":"Contains 2 architectural actions relevant to business execution.","confidence":0.77,"evidencePaths":["NexusReader.Application/Commands/Quiz/SubmitAnswerCommandHandler.cs","NexusReader.Application.Abstractions.Services"]},{"kind":"external-call","label":"Handle","line":20,"summary":"await _platformService.VibrateAsync(50)","confidence":0.8,"evidencePaths":["NexusReader.Application/Commands/Quiz/SubmitAnswerCommandHandler.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__Commands__Sync__UpdateReadingProgressCommand.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__Commands__Sync__UpdateReadingProgressCommand.cs.json new file mode 100644 index 0000000..6052320 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__Commands__Sync__UpdateReadingProgressCommand.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs","purpose":"Defines a MediatR command DTO used to update/sync a user's reading progress for an ebook across the application.","classification":{"role":"handler","layer":"application","confidence":0.9,"evidence":["Command pattern","namespace NexusReader.Application.Commands.Sync","type implements IRequest (MediatR) — used as an application-level command/DTO"]},"className":"UpdateReadingProgressCommand","methods":[],"types":[{"name":"UpdateReadingProgressCommand","kind":"command","line":6,"purpose":"Represents the data required to update/synchronize reading progress for a user's ebook.","fields":[{"name":"PageId","type":"string","required":true,"line":7,"description":"Identifier of the current page"},{"name":"UserId","type":"string","required":true,"line":8,"description":"Identifier of the user whose progress is being updated"},{"name":"EbookId","type":"Guid","required":true,"line":9,"description":"Ebook identifier"},{"name":"Progress","type":"double","required":true,"line":10,"description":"Progress value (e.g., percentage or fraction) representing reading position"},{"name":"ChapterTitle","type":"string?","required":false,"line":11,"description":"Optional current chapter title"},{"name":"ChapterIndex","type":"int","required":true,"line":12,"description":"Index of the current chapter"},{"name":"ExcludedConnectionId","type":"string?","required":false,"line":13,"description":"Optional connection id to exclude from notifications (default null)"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["FluentResults (external package)","MediatR (external package)"],"patterns":["CQRS Command","MediatR IRequest"],"domainConcepts":["ReadingProgress","Ebook","User","Sync"],"keyDetails":"A simple record-level command DTO (lines 6–13). Implements IRequest for MediatR dispatch; includes an optional ExcludedConnectionId likely used to suppress notifying the originator when broadcasting updates.","orchestrationMethods":[],"typedContracts":[{"name":"UpdateReadingProgressCommand","kind":"command","line":6,"fieldCount":7,"evidencePaths":["NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"UpdateReadingProgressCommand","line":6,"summary":"command with 7 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__Commands__Sync__UpdateReadingProgressCommandHandler.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__Commands__Sync__UpdateReadingProgressCommandHandler.cs.json new file mode 100644 index 0000000..63f9b57 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__Commands__Sync__UpdateReadingProgressCommandHandler.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/Commands/Sync/UpdateReadingProgressCommandHandler.cs","purpose":"Handles UpdateReadingProgressCommand: persists a user's reading position to the database and broadcasts the update to other connected devices.","classification":{"role":"handler","layer":"application","confidence":0.9,"evidence":["Command pattern","Implements MediatR IRequestHandler (line 13)","Creates/uses AppDbContext (NexusReader.Data.Persistence) to update User and Ebook (lines 28-49)","Uses ISyncBroadcaster to BroadcastProgressAsync after persistence (lines 51-57)"]},"className":"UpdateReadingProgressCommandHandler","methods":[{"name":"Handle","line":26,"endLine":60,"signature":"(request: UpdateReadingProgressCommand, cancellationToken: CancellationToken) -> Task","purpose":"Orchestrates updating a user's last-read position and ebook progress in the DB, then broadcasts the progress to other devices.","calls":[{"targetFile":"NexusReader.Application.Abstractions.Messaging/ISyncBroadcaster.cs","targetMethod":"BroadcastProgressAsync","callLine":52,"paramSummary":"request.UserId, request.PageId, now, request.ExcludedConnectionId, cancellationToken"}],"actions":[{"id":"resource-acquisition_28","kind":"mapping","label":"Create DbContext","line":28,"detail":"using var context = await _dbContextFactory.CreateDbContextAsync(cancellationToken) - acquires EF DbContext from factory","visibility":"detail-only","confidence":0.7},{"id":"read_30","kind":"mapping","label":"Load user","line":30,"detail":"context.Users.FirstOrDefaultAsync(u => u.Id == request.UserId, cancellationToken)","visibility":"detail-only","confidence":0.7},{"id":"handle_repository-read_30_0","kind":"repository-read","label":"Reads repository or persistence state","line":30,"detail":"var user = await context.Users.FirstOrDefaultAsync(u => u.Id == request.UserId, cancellationToken);","visibility":"secondary-visible","confidence":0.86},{"id":"handle_branch_31_1","kind":"branch","label":"Evaluates branch condition","line":31,"detail":"if (user == null)","conditionSummary":"user == null","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"guard-clause_31","kind":"guard-clause","label":"User existence check","line":31,"detail":"if user not found returns Result.Fail(\"User not found.\") (lines 31-34)","conditionSummary":"user == null","outcomeLabels":["fail","continue"],"visibility":"detail-only","confidence":0.7},{"id":"handle_return_33_2","kind":"return","label":"Returns result","line":33,"detail":"return Result.Fail(\"User not found.\");","visibility":"detail-only","confidence":0.7},{"id":"state-update_36","kind":"mapping","label":"Update user last-read fields","line":36,"detail":"Sets user.LastReadPageId = request.PageId and user.LastReadAt = now","visibility":"detail-only","confidence":0.7},{"id":"read_40","kind":"mapping","label":"Load ebook (optional)","line":40,"detail":"context.Ebooks.FirstOrDefaultAsync(e => e.Id == request.EbookId, cancellationToken)","visibility":"detail-only","confidence":0.7},{"id":"handle_repository-read_40_3","kind":"repository-read","label":"Reads repository or persistence state","line":40,"detail":"var ebook = await context.Ebooks.FirstOrDefaultAsync(e => e.Id == request.EbookId, cancellationToken);","visibility":"secondary-visible","confidence":0.86},{"id":"handle_branch_41_4","kind":"branch","label":"Evaluates branch condition","line":41,"detail":"if (ebook != null)","conditionSummary":"ebook != null","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"branch_41","kind":"branch","label":"If ebook found, update progress fields","line":41,"detail":"If ebook exists, updates Progress, LastChapter, LastChapterIndex, LastReadDate (lines 43-47)","conditionSummary":"ebook != null","outcomeLabels":["update ebook fields","skip ebook update"],"visibility":"detail-only","confidence":0.7},{"id":"handle_repository-read_49_5","kind":"repository-read","label":"Reads repository or persistence state","line":49,"detail":"await context.SaveChangesAsync(cancellationToken);","visibility":"secondary-visible","confidence":0.86},{"id":"persistence-write_49","kind":"mapping","label":"Save changes to DB","line":49,"detail":"await context.SaveChangesAsync(cancellationToken) - persists user and optional ebook changes","visibility":"detail-only","confidence":0.7},{"id":"external-call_52","kind":"external-call","label":"Broadcast progress to other devices","line":52,"detail":"await _broadcaster.BroadcastProgressAsync(request.UserId, request.PageId, now, request.ExcludedConnectionId, cancellationToken)","visibility":"detail-only","confidence":0.7},{"id":"return_59","kind":"return","label":"Return success result","line":59,"detail":"return Result.Ok()","visibility":"detail-only","confidence":0.7},{"id":"handle_return_59_6","kind":"return","label":"Returns result","line":59,"detail":"return Result.Ok();","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"UpdateReadingProgressCommandHandler","kind":"model","line":13,"purpose":"MediatR handler that updates reading progress and triggers sync broadcasts.","fields":[{"name":"_dbContextFactory","type":"IDbContextFactory","required":true,"line":15,"description":"Factory used to create AppDbContext instances for persistence operations."},{"name":"_broadcaster","type":"ISyncBroadcaster","required":true,"line":16,"description":"Abstraction responsible for broadcasting progress updates to other devices/connections."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Data.Persistence (AppDbContext)","NexusReader.Application.Abstractions.Messaging (ISyncBroadcaster)"],"patterns":["Mediator (MediatR)","Repository/EF DbContext usage"],"domainConcepts":["User","Ebook","ReadingProgress","Device sync / Broadcast"],"keyDetails":"Performs a guarded update: verifies user exists, updates user and optionally ebook fields, persists via SaveChangesAsync, then broadcasts the update to other connected clients excluding the originating connection.","orchestrationMethods":[{"name":"Handle","line":26,"confidence":0.98,"reason":"Contains 7 architectural actions relevant to business execution.","actionKinds":["mapping","repository-read","branch","guard-clause","return","external-call"],"evidencePaths":["NexusReader.Application/Commands/Sync/UpdateReadingProgressCommandHandler.cs","NexusReader.Application.Abstractions.Messaging/ISyncBroadcaster.cs"]}],"typedContracts":[{"name":"UpdateReadingProgressCommandHandler","kind":"model","line":13,"fieldCount":2,"evidencePaths":["NexusReader.Application/Commands/Sync/UpdateReadingProgressCommandHandler.cs"]}],"persistenceInteractions":[{"methodName":"Handle","line":30,"kind":"persistence-read","detail":"var user = await context.Users.FirstOrDefaultAsync(u => u.Id == request.UserId, cancellationToken);","evidencePaths":["NexusReader.Application/Commands/Sync/UpdateReadingProgressCommandHandler.cs"]},{"methodName":"Handle","line":40,"kind":"persistence-read","detail":"var ebook = await context.Ebooks.FirstOrDefaultAsync(e => e.Id == request.EbookId, cancellationToken);","evidencePaths":["NexusReader.Application/Commands/Sync/UpdateReadingProgressCommandHandler.cs"]},{"methodName":"Handle","line":49,"kind":"persistence-read","detail":"await context.SaveChangesAsync(cancellationToken);","evidencePaths":["NexusReader.Application/Commands/Sync/UpdateReadingProgressCommandHandler.cs"]}],"externalInteractions":[{"methodName":"Handle","line":52,"kind":"external-call","detail":"await _broadcaster.BroadcastProgressAsync(request.UserId, request.PageId, now, request.ExcludedConnectionId, cancellationToken)","evidencePaths":["NexusReader.Application/Commands/Sync/UpdateReadingProgressCommandHandler.cs"]}],"evidenceAnchors":[{"kind":"orchestration-method","label":"Handle","line":26,"summary":"Contains 7 architectural actions relevant to business execution.","confidence":0.98,"evidencePaths":["NexusReader.Application/Commands/Sync/UpdateReadingProgressCommandHandler.cs","NexusReader.Application.Abstractions.Messaging/ISyncBroadcaster.cs"]},{"kind":"typed-contract","label":"UpdateReadingProgressCommandHandler","line":13,"summary":"model with 2 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Commands/Sync/UpdateReadingProgressCommandHandler.cs"]},{"kind":"persistence","label":"Handle","line":30,"summary":"var user = await context.Users.FirstOrDefaultAsync(u => u.Id == request.UserId, cancellationToken);","confidence":0.82,"evidencePaths":["NexusReader.Application/Commands/Sync/UpdateReadingProgressCommandHandler.cs"]},{"kind":"persistence","label":"Handle","line":40,"summary":"var ebook = await context.Ebooks.FirstOrDefaultAsync(e => e.Id == request.EbookId, cancellationToken);","confidence":0.82,"evidencePaths":["NexusReader.Application/Commands/Sync/UpdateReadingProgressCommandHandler.cs"]},{"kind":"persistence","label":"Handle","line":49,"summary":"await context.SaveChangesAsync(cancellationToken);","confidence":0.82,"evidencePaths":["NexusReader.Application/Commands/Sync/UpdateReadingProgressCommandHandler.cs"]},{"kind":"external-call","label":"Handle","line":52,"summary":"await _broadcaster.BroadcastProgressAsync(request.UserId, request.PageId, now, request.ExcludedConnectionId, cancellationToken)","confidence":0.8,"evidencePaths":["NexusReader.Application/Commands/Sync/UpdateReadingProgressCommandHandler.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__Common__AppJsonContext.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__Common__AppJsonContext.cs.json new file mode 100644 index 0000000..b26986e --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__Common__AppJsonContext.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/Common/AppJsonContext.cs","purpose":"Defines a System.Text.Json source-generation context that registers graph-related DTO types for ahead-of-time JSON (de)serialization with indented output.","classification":{"role":"config","layer":"application","confidence":0.9,"evidence":["Namespace NexusReader.Application.Common (application layer)","Uses JsonSourceGenerationOptions and multiple JsonSerializable attributes (lines 6-11)"]},"className":"AppJsonContext","methods":[],"types":[{"name":"AppJsonContext","kind":"model","line":12,"purpose":"Partial JsonSerializerContext type that drives System.Text.Json source generation for specified DTO types.","fields":[]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["System.Text.Json.Serialization (framework)","NexusReader.Application.Queries.Graph (referenced DTOs GraphNodeDto, GraphLinkDto, GraphDataDto)"],"patterns":["Source Generator","Json Source Generation"],"domainConcepts":["GraphNode","GraphLink","GraphData"],"keyDetails":"Lines 6-11 apply JsonSourceGenerationOptions(WriteIndented=true) and register JsonSerializable for GraphNodeDto, GraphLinkDto, GraphDataDto and List variants. The class (line 12) is an empty partial inheriting JsonSerializerContext used at compile-time to generate optimized JSON serializers.","orchestrationMethods":[],"typedContracts":[{"name":"AppJsonContext","kind":"model","line":12,"fieldCount":0,"evidencePaths":["NexusReader.Application/Common/AppJsonContext.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"AppJsonContext","line":12,"summary":"model with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Common/AppJsonContext.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__Constants__PlanConstants.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__Constants__PlanConstants.cs.json new file mode 100644 index 0000000..4a822d1 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__Constants__PlanConstants.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/Constants/PlanConstants.cs","purpose":"Defines application-wide default constants for Plan-related settings (name, token limit, activity label).","classification":{"role":"config","layer":"application","confidence":0.85,"evidence":["namespace NexusReader.Application.Constants","static class with public constant values for Plan defaults"]},"className":"PlanConstants","methods":[],"types":[{"name":"PlanConstants","kind":"model","line":3,"purpose":"Holds compile-time constant defaults for plan configuration used across the application.","fields":[{"name":"DefaultPlanName","type":"string","required":true,"line":5,"description":"Default plan name (e.g., 'Free')."},{"name":"DefaultTokenLimit","type":"int","required":true,"line":6,"description":"Default numeric token limit for the plan."},{"name":"DefaultActivityLabel","type":"string","required":true,"line":7,"description":"Default label shown when there's no activity."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["Constants holder"],"domainConcepts":["Plan"],"keyDetails":"Simple static container of compile-time constants; no runtime behavior, no external calls, and safe for inlining/compile-time use.","orchestrationMethods":[],"typedContracts":[{"name":"PlanConstants","kind":"model","line":3,"fieldCount":3,"evidencePaths":["NexusReader.Application/Constants/PlanConstants.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"PlanConstants","line":3,"summary":"model with 3 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Constants/PlanConstants.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__Constants__StorageKeys.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__Constants__StorageKeys.cs.json new file mode 100644 index 0000000..529f931 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__Constants__StorageKeys.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/Constants/StorageKeys.cs","purpose":"Defines application-wide string keys used for client/local storage (auth tokens and user metadata).","classification":{"role":"config","layer":"application","confidence":0.9,"evidence":["Namespace NexusReader.Application.Constants indicates application-level constants","Public static class with const string fields used as storage keys"]},"className":"StorageKeys","methods":[],"types":[{"name":"StorageKeys","kind":"model","line":3,"purpose":"Holds constant keys for storing authentication and user metadata in client/local storage.","fields":[{"name":"AuthToken","type":"string","required":true,"line":5,"description":"Key for the auth token (\"nexus_auth_token\")."},{"name":"RefreshToken","type":"string","required":true,"line":6,"description":"Key for the refresh token (\"nexus_refresh_token\")."},{"name":"UserEmail","type":"string","required":true,"line":7,"description":"Key for the user's email (\"nexus_user_email\")."},{"name":"UserTenant","type":"string","required":true,"line":8,"description":"Key for the user's tenant identifier (\"nexus_user_tenant\")."},{"name":"UserRoles","type":"string","required":true,"line":9,"description":"Key for the user's roles (\"nexus_user_roles\")."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["Constants"],"domainConcepts":["Auth","User","Tenant","Roles","Token storage"],"keyDetails":"Simple static constant holder used across client and application code to standardize local storage keys for authentication and user metadata.","orchestrationMethods":[],"typedContracts":[{"name":"StorageKeys","kind":"model","line":3,"fieldCount":5,"evidencePaths":["NexusReader.Application/Constants/StorageKeys.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"StorageKeys","line":3,"summary":"model with 5 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Constants/StorageKeys.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__DTOs__AI__GroundedResponseDto.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__DTOs__AI__GroundedResponseDto.cs.json new file mode 100644 index 0000000..6552516 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__DTOs__AI__GroundedResponseDto.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/DTOs/AI/GroundedResponseDto.cs","purpose":"Defines simple DTOs used to return a grounded AI response (answer plus provenance/citations) from application services.","classification":{"role":"dto","layer":"application","confidence":0.9,"evidence":["DTO/view-model naming pattern","Namespace NexusReader.Application.DTOs.AI","File only contains plain data-holder classes (GroundedResponseDto, CitationDto) with auto-properties"]},"className":"GroundedResponseDto","methods":[],"types":[{"name":"GroundedResponseDto","kind":"dto","line":5,"purpose":"Carries an AI-generated answer and a list of provenance citations back to callers.","fields":[{"name":"Answer","type":"string","required":true,"line":7,"description":"The generated answer text"},{"name":"Citations","type":"List","required":true,"line":8,"description":"List of contextual citations supporting the answer"}]},{"name":"CitationDto","kind":"dto","line":11,"purpose":"Represents a single provenance item (chunk id, snippet, and source) used to justify the answer.","fields":[{"name":"CitationId","type":"string","required":true,"line":13,"description":"Identifier for the cited chunk (e.g., chunk hash/ID)"},{"name":"Snippet","type":"string","required":true,"line":14,"description":"Verified text snippet extracted from context"},{"name":"SourceBook","type":"string","required":true,"line":15,"description":"Book title or human-readable source description"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["DTO"],"domainConcepts":["GroundedResponse","Citation","AI/Knowledge","Answering","Provenance"],"keyDetails":"Small, self-contained DTOs with default non-null initializers (string.Empty, new List) intended for safe transport over app/service boundaries.","orchestrationMethods":[],"typedContracts":[{"name":"GroundedResponseDto","kind":"dto","line":5,"fieldCount":2,"evidencePaths":["NexusReader.Application/DTOs/AI/GroundedResponseDto.cs"]},{"name":"CitationDto","kind":"dto","line":11,"fieldCount":3,"evidencePaths":["NexusReader.Application/DTOs/AI/GroundedResponseDto.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"GroundedResponseDto","line":5,"summary":"dto with 2 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/DTOs/AI/GroundedResponseDto.cs"]},{"kind":"typed-contract","label":"CitationDto","line":11,"summary":"dto with 3 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/DTOs/AI/GroundedResponseDto.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__DTOs__AI__KnowledgePacket.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__DTOs__AI__KnowledgePacket.cs.json new file mode 100644 index 0000000..99fddd8 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__DTOs__AI__KnowledgePacket.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/DTOs/AI/KnowledgePacket.cs","purpose":"Defines DTO record types used to represent AI/knowledge extraction payloads (concepts, quizzes, knowledge units/links, and an optional graph/summary) for application-level serialization and transport.","classification":{"role":"dto","layer":"application","confidence":0.9,"evidence":["DTO/view-model naming pattern","File namespace NexusReader.Application.DTOs.AI (line 3) indicates DTOs in Application layer","All types are C# record types with JsonPropertyName attributes (lines 5-26) — serialization-focused"]},"className":"KnowledgePacket","methods":[],"types":[{"name":"KeyConcept","kind":"dto","line":5,"purpose":"Represents a key concept with a title and description for knowledge payloads.","fields":[{"name":"Title","type":"string","required":true,"line":6,"description":"Concept title (serialized as 'title')"},{"name":"Description","type":"string","required":true,"line":7,"description":"Concept description (serialized as 'description')"}]},{"name":"QuizQuestion","kind":"dto","line":10,"purpose":"Represents a single quiz question with options and the index of the correct answer.","fields":[{"name":"Question","type":"string","required":true,"line":11,"description":"Question text (serialized as 'question')"},{"name":"Options","type":"List","required":true,"line":12,"description":"Answer choices (serialized as 'options')"},{"name":"CorrectIndex","type":"int","required":true,"line":13,"description":"Index of correct option (serialized as 'correct_index')"}]},{"name":"KnowledgeUnitDto","kind":"dto","line":16,"purpose":"Represents an individual knowledge unit (atomic piece of content) with optional metadata.","fields":[{"name":"Id","type":"string","required":true,"line":16,"description":"Unit identifier"},{"name":"Type","type":"string","required":true,"line":16,"description":"Unit type/category"},{"name":"Content","type":"string","required":true,"line":16,"description":"Unit content payload"},{"name":"Metadata","type":"Dictionary?","required":false,"line":16,"description":"Optional arbitrary metadata map"}]},{"name":"KnowledgeLinkDto","kind":"dto","line":17,"purpose":"Represents a directed relation/link between two knowledge units.","fields":[{"name":"Source","type":"string","required":true,"line":17,"description":"Source unit id"},{"name":"Target","type":"string","required":true,"line":17,"description":"Target unit id"},{"name":"Relation","type":"string","required":true,"line":17,"description":"Nature of the relation"}]},{"name":"KnowledgePacket","kind":"dto","line":19,"purpose":"Aggregates concepts, quizzes, units, links, optional graph data, and an optional summary into a single serializable payload.","fields":[{"name":"Concepts","type":"List","required":true,"line":21,"description":"List of key concepts (serialized as 'concepts'), default initialized empty"},{"name":"Quizzes","type":"List","required":true,"line":22,"description":"List of quiz questions (serialized as 'quizzes'), default initialized empty"},{"name":"Units","type":"List","required":true,"line":23,"description":"Knowledge units included in the packet (serialized as 'units'), default initialized empty"},{"name":"Links","type":"List","required":true,"line":24,"description":"Links between units (serialized as 'links'), default initialized empty"},{"name":"Graph","type":"NexusReader.Application.Queries.Graph.GraphDataDto?","required":false,"line":25,"description":"Optional graph structure (serialized as 'graph'), references GraphDataDto in Queries.Graph namespace"},{"name":"Summary","type":"string?","required":false,"line":26,"description":"Optional textual summary of the packet (serialized as 'summary')"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Application/Queries/Graph/GraphDataDto.cs"],"patterns":["DTO","Record","Serialization (System.Text.Json)"],"domainConcepts":["Knowledge","KeyConcept","QuizQuestion","KnowledgeUnit","KnowledgeLink","Graph"],"keyDetails":"All types are immutable C# records with System.Text.Json property mappings; KnowledgePacket aggregates multiple collections initialized to empty lists and optionally includes a GraphDataDto and Summary.","orchestrationMethods":[],"typedContracts":[{"name":"KeyConcept","kind":"dto","line":5,"fieldCount":2,"evidencePaths":["NexusReader.Application/DTOs/AI/KnowledgePacket.cs"]},{"name":"QuizQuestion","kind":"dto","line":10,"fieldCount":3,"evidencePaths":["NexusReader.Application/DTOs/AI/KnowledgePacket.cs"]},{"name":"KnowledgeUnitDto","kind":"dto","line":16,"fieldCount":4,"evidencePaths":["NexusReader.Application/DTOs/AI/KnowledgePacket.cs"]},{"name":"KnowledgeLinkDto","kind":"dto","line":17,"fieldCount":3,"evidencePaths":["NexusReader.Application/DTOs/AI/KnowledgePacket.cs"]},{"name":"KnowledgePacket","kind":"dto","line":19,"fieldCount":6,"evidencePaths":["NexusReader.Application/DTOs/AI/KnowledgePacket.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"KeyConcept","line":5,"summary":"dto with 2 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/DTOs/AI/KnowledgePacket.cs"]},{"kind":"typed-contract","label":"QuizQuestion","line":10,"summary":"dto with 3 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/DTOs/AI/KnowledgePacket.cs"]},{"kind":"typed-contract","label":"KnowledgeUnitDto","line":16,"summary":"dto with 4 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/DTOs/AI/KnowledgePacket.cs"]},{"kind":"typed-contract","label":"KnowledgeLinkDto","line":17,"summary":"dto with 3 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/DTOs/AI/KnowledgePacket.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__DTOs__AI__RelevantContext.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__DTOs__AI__RelevantContext.cs.json new file mode 100644 index 0000000..2c4eaf0 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__DTOs__AI__RelevantContext.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/DTOs/AI/RelevantContext.cs","purpose":"Defines a small DTO that carries a piece of retrieved context (text, source id and confidence) used by AI/knowledge features.","classification":{"role":"dto","layer":"application","confidence":0.9,"evidence":["DTO/view-model naming pattern","Namespace NexusReader.Application.DTOs.AI","File path implies DTOs for AI features and contains only plain properties"]},"className":"RelevantContext","methods":[],"types":[{"name":"RelevantContext","kind":"dto","line":3,"purpose":"Represents a single relevant context item (text snippet) returned or passed to AI/knowledge components, including its source and confidence score.","fields":[{"name":"Text","type":"string","required":true,"line":5,"description":"The context text snippet; initialized to empty string by default."},{"name":"SourceId","type":"string","required":true,"line":6,"description":"Identifier of the source (e.g., ContentHash or EbookTitle); initialized to empty string."},{"name":"Confidence","type":"double","required":false,"line":7,"description":"Confidence score for how relevant the snippet is."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["DTO"],"domainConcepts":["AI","Knowledge Retrieval","Context Snippet"],"keyDetails":"Tiny immutable-appearing DTO (auto-properties with defaults) used to transport relevant context text, its source id, and a numeric confidence between layers or AI components.","orchestrationMethods":[],"typedContracts":[{"name":"RelevantContext","kind":"dto","line":3,"fieldCount":3,"evidencePaths":["NexusReader.Application/DTOs/AI/RelevantContext.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"RelevantContext","line":3,"summary":"dto with 3 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/DTOs/AI/RelevantContext.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__DTOs__AI__SemanticSearchResultDto.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__DTOs__AI__SemanticSearchResultDto.cs.json new file mode 100644 index 0000000..9759636 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__DTOs__AI__SemanticSearchResultDto.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/DTOs/AI/SemanticSearchResultDto.cs","purpose":"Defines a data transfer object representing a semantic search hit returned by AI/semantic search operations, carrying content identifiers, a snippet, relevance score and optional metadata.","classification":{"role":"dto","layer":"application","confidence":0.9,"evidence":["DTO/view-model naming pattern","Namespace NexusReader.Application.DTOs.AI indicates an Application-layer DTO","File declares a single plain data class SemanticSearchResultDto with no methods"]},"className":"SemanticSearchResultDto","methods":[],"types":[{"name":"SemanticSearchResultDto","kind":"dto","line":3,"purpose":"Carries the result of a semantic search (content identifier, snippet, unit type, relevance and optional source/metadata) across application boundaries.","fields":[{"name":"ContentHash","type":"string","required":true,"line":5,"description":"Identifier/hash for the matched content (non-null, initialized to empty string)."},{"name":"Snippet","type":"string","required":true,"line":6,"description":"Text snippet or excerpt used to show the match (non-null, initialized to empty string)."},{"name":"UnitType","type":"string?","required":false,"line":7,"description":"Optional unit/type of the content (nullable)."},{"name":"RelevanceScore","type":"float","required":true,"line":8,"description":"Numeric relevance score from the semantic search."},{"name":"SourceBookTitle","type":"string?","required":false,"line":9,"description":"Optional title of the source book where the content originated (nullable)."},{"name":"Metadata","type":"Dictionary?","required":false,"line":10,"description":"Optional arbitrary metadata / bonus context attached to the result (nullable)."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["DTO"],"domainConcepts":["Semantic Search","Search Result","Knowledge Retrieval"],"keyDetails":"Plain DTO used to transport semantic search hits; contains nullable metadata for extensibility and initialized non-null strings for ContentHash and Snippet.","orchestrationMethods":[],"typedContracts":[{"name":"SemanticSearchResultDto","kind":"dto","line":3,"fieldCount":6,"evidencePaths":["NexusReader.Application/DTOs/AI/SemanticSearchResultDto.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"SemanticSearchResultDto","line":3,"summary":"dto with 6 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/DTOs/AI/SemanticSearchResultDto.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__DTOs__User__AuthorDto.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__DTOs__User__AuthorDto.cs.json new file mode 100644 index 0000000..c432369 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__DTOs__User__AuthorDto.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/DTOs/User/AuthorDto.cs","purpose":"Defines a simple data transfer object representing an author (Id and Name) used by the Application layer to pass user/author data between boundaries.","classification":{"role":"dto","layer":"application","confidence":0.9,"evidence":["DTO/view-model naming pattern","Namespace: NexusReader.Application.DTOs.User","File path and name: Application/DTOs/User/AuthorDto.cs","Declares a record named AuthorDto with simple properties"]},"className":"AuthorDto","methods":[],"types":[{"name":"AuthorDto","kind":"dto","line":3,"purpose":"Immutable DTO carrying basic author identity data across application boundaries.","fields":[{"name":"Id","type":"int","required":true,"line":5,"description":"Numeric author identifier"},{"name":"Name","type":"string","required":true,"line":6,"description":"Author display name (defaults to empty string)"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["DTO","record"],"domainConcepts":["Author","User"],"keyDetails":"Small immutable record DTO in the Application layer representing author/user identity (Id and Name).","orchestrationMethods":[],"typedContracts":[{"name":"AuthorDto","kind":"dto","line":3,"fieldCount":2,"evidencePaths":["NexusReader.Application/DTOs/User/AuthorDto.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"AuthorDto","line":3,"summary":"dto with 2 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/DTOs/User/AuthorDto.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__DTOs__User__SubscriptionPlanDto.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__DTOs__User__SubscriptionPlanDto.cs.json new file mode 100644 index 0000000..9d9366b --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__DTOs__User__SubscriptionPlanDto.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/DTOs/User/SubscriptionPlanDto.cs","purpose":"Defines a simple immutable DTO representing a subscription plan used across the application layer (billing/AI quota).","classification":{"role":"dto","layer":"application","confidence":0.9,"evidence":["DTO/view-model naming pattern","Namespace: NexusReader.Application.DTOs.User","File name and shape: SubscriptionPlanDto record with init-only properties"]},"className":"SubscriptionPlanDto","methods":[],"types":[{"name":"SubscriptionPlanDto","kind":"dto","line":3,"purpose":"Carries subscription plan data (id, name, AI token limits, price) across application boundaries.","fields":[{"name":"Id","type":"int","required":true,"line":5,"description":"Numeric identifier of the subscription plan"},{"name":"Name","type":"string","required":true,"line":6,"description":"Human-readable plan name"},{"name":"AITokenLimit","type":"int","required":true,"line":7,"description":"Token allowance for AI usage on the plan"},{"name":"IsUnlimitedTokens","type":"bool","required":true,"line":8,"description":"Flag indicating whether token limits are disabled"},{"name":"MonthlyPrice","type":"decimal","required":true,"line":9,"description":"Monthly price for the subscription plan"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["DTO","Immutable Record"],"domainConcepts":["SubscriptionPlan","Billing","AI Tokens"],"keyDetails":"A minimal, immutable data-transfer record used to move subscription plan data; no methods, behavior, or external calls in this file.","orchestrationMethods":[],"typedContracts":[{"name":"SubscriptionPlanDto","kind":"dto","line":3,"fieldCount":5,"evidencePaths":["NexusReader.Application/DTOs/User/SubscriptionPlanDto.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"SubscriptionPlanDto","line":3,"summary":"dto with 5 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/DTOs/User/SubscriptionPlanDto.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__DTOs__User__UserProfileDto.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__DTOs__User__UserProfileDto.cs.json new file mode 100644 index 0000000..a010893 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__DTOs__User__UserProfileDto.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/DTOs/User/UserProfileDto.cs","purpose":"Defines application-level DTOs representing a user's profile and their last-read book, including UI helper properties that project domain values and defaults for client consumption.","classification":{"role":"dto","layer":"application","confidence":0.9,"evidence":["DTO/view-model naming pattern","File path: NexusReader.Application/DTOs/User","Types are declared as record DTOs (UserProfileDto, LastReadBookDto)","Uses PlanConstants and other DTO types (typical application DTO composition)"]},"className":"UserProfileDto","methods":[{"name":"CurrentPlan","line":26,"endLine":26,"signature":"() -> string","purpose":"Returns the current plan name from Plan or a default plan name when Plan is null or its Name is null.","calls":[{"targetFile":"NexusReader.Application/Constants/PlanConstants.cs","targetMethod":"DefaultPlanName (field)","callLine":26,"paramSummary":"none"}],"actions":[{"id":"null-coalesce_26","kind":"mapping","label":"Fallback to default plan name","line":26,"detail":"returns Plan?.Name ?? PlanConstants.DefaultPlanName","visibility":"detail-only","confidence":0.7}]},{"name":"AITokenLimit","line":27,"endLine":27,"signature":"() -> int","purpose":"Exposes the AI token limit from the Plan or returns a default token limit when Plan is null.","calls":[{"targetFile":"NexusReader.Application/Constants/PlanConstants.cs","targetMethod":"DefaultTokenLimit (field)","callLine":27,"paramSummary":"none"}],"actions":[{"id":"null-coalesce_27","kind":"mapping","label":"Fallback to default token limit","line":27,"detail":"returns Plan?.AITokenLimit ?? PlanConstants.DefaultTokenLimit","visibility":"detail-only","confidence":0.7}]},{"name":"LastReadBookTitle","line":28,"endLine":28,"signature":"() -> string","purpose":"Returns the title of the last read book or a default activity label when LastReadBook is null.","calls":[{"targetFile":"NexusReader.Application/Constants/PlanConstants.cs","targetMethod":"DefaultActivityLabel (field)","callLine":28,"paramSummary":"none"}],"actions":[{"id":"null-coalesce_28","kind":"mapping","label":"Fallback to default activity label","line":28,"detail":"returns LastReadBook?.Title ?? PlanConstants.DefaultActivityLabel","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"UserProfileDto","kind":"dto","line":5,"purpose":"Represents a user's profile data returned by application services, including plan, usage, roles and a brief last-read-book summary.","fields":[{"name":"Email","type":"string","required":true,"line":7,"description":"User email address"},{"name":"AITokensUsed","type":"int","required":true,"line":8,"description":"Number of AI tokens the user has consumed"},{"name":"TenantId","type":"Guid","required":true,"line":9,"description":"Tenant identifier for multi-tenant scoping"},{"name":"Plan","type":"SubscriptionPlanDto","required":true,"line":14,"description":"Relational DTO representing the user's subscription plan (initialized to new())"},{"name":"AverageQuizScore","type":"int","required":true,"line":16,"description":"Average score across quizzes"},{"name":"LastReadBook","type":"LastReadBookDto?","required":false,"line":21,"description":"Optional summary DTO for the last read book"},{"name":"Roles","type":"string[]","required":true,"line":23,"description":"Array of role names assigned to the user"}]},{"name":"LastReadBookDto","kind":"dto","line":31,"purpose":"Represents a lightweight summary of the last-read book for display in UI.","fields":[{"name":"Id","type":"Guid","required":true,"line":33,"description":"Book identifier"},{"name":"Title","type":"string","required":true,"line":34,"description":"Book title"},{"name":"Author","type":"AuthorDto","required":true,"line":35,"description":"Author DTO"},{"name":"CoverUrl","type":"string?","required":false,"line":36,"description":"Optional cover image URL"},{"name":"Progress","type":"double","required":true,"line":37,"description":"Reading progress percentage"},{"name":"LastChapter","type":"string?","required":false,"line":38,"description":"Title of the last chapter read"},{"name":"LastChapterIndex","type":"int","required":true,"line":39,"description":"Index of the last chapter read"},{"name":"Description","type":"string?","required":false,"line":40,"description":"Optional short description of the book"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Application/Constants/PlanConstants.cs","NexusReader.Application/DTOs/Subscription/SubscriptionPlanDto.cs","NexusReader.Application/DTOs/AuthorDto.cs"],"patterns":["DTO"],"domainConcepts":["User","SubscriptionPlan","Book","Author","Tenant","Roles"],"keyDetails":"Contains UI-friendly helper properties that null-coalesce domain values to application-level defaults (via PlanConstants) and composes other DTOs (SubscriptionPlanDto, AuthorDto). No persistence, orchestration, or external calls in this file.","orchestrationMethods":[],"typedContracts":[{"name":"UserProfileDto","kind":"dto","line":5,"fieldCount":7,"evidencePaths":["NexusReader.Application/DTOs/User/UserProfileDto.cs"]},{"name":"LastReadBookDto","kind":"dto","line":31,"fieldCount":8,"evidencePaths":["NexusReader.Application/DTOs/User/UserProfileDto.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"UserProfileDto","line":5,"summary":"dto with 7 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/DTOs/User/UserProfileDto.cs"]},{"kind":"typed-contract","label":"LastReadBookDto","line":31,"summary":"dto with 8 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/DTOs/User/UserProfileDto.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__DependencyInjection.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__DependencyInjection.cs.json new file mode 100644 index 0000000..cc15f62 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__DependencyInjection.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/DependencyInjection.cs","purpose":"Provides application-level DI registrations (Mapster mapping config and MediatR handler registration) and exposes the application assembly for composition/root usage.","classification":{"role":"service-registration","layer":"application","confidence":0.9,"evidence":["Contains an AddApplication(IServiceCollection) extension that registers services","Exposes Assembly property for registering handlers from this assembly"]},"className":"DependencyInjection","methods":[{"name":"AddApplication","line":8,"endLine":14,"signature":"(services: IServiceCollection) -> IServiceCollection","purpose":"Extension method that registers application mapping configuration and MediatR handlers, returning the IServiceCollection for chaining.","calls":[{"targetFile":"NexusReader.Application/Mappings.cs","targetMethod":"AddMapsterConfiguration","callLine":10,"paramSummary":"this IServiceCollection (extension call to register Mapster mappings)"}],"actions":[{"id":"service-registration_10","kind":"mapping","label":"Register mapping configuration","line":10,"detail":"Calls AddMapsterConfiguration() to add Mapster mapping setup","visibility":"detail-only","confidence":0.7},{"id":"service-registration_11","kind":"mapping","label":"Register MediatR handlers","line":11,"detail":"Calls AddMediatR(...) to register MediatR handlers from this assembly (external library call)","visibility":"detail-only","confidence":0.7},{"id":"return_13","kind":"return","label":"Return IServiceCollection","line":13,"detail":"Returns the same IServiceCollection for fluent chaining","visibility":"detail-only","confidence":0.7},{"id":"addapplication_return_13_0","kind":"return","label":"Returns result","line":13,"detail":"return services;","visibility":"detail-only","confidence":0.7}]},{"name":"Assembly","line":16,"endLine":16,"signature":"-> System.Reflection.Assembly","purpose":"Exposes the current assembly (NexusReader.Application) for use when registering handlers or scanning types.","calls":[],"actions":[{"id":"expose-value_16","kind":"mapping","label":"Provide assembly reference","line":16,"detail":"Getter returns typeof(DependencyInjection).Assembly","visibility":"detail-only","confidence":0.7}]}],"types":[],"serviceRegistrations":[{"line":10,"serviceType":"Mapster configuration / mapping profiles","implementationType":"configured via AddMapsterConfiguration extension","lifetime":"unknown","factorySummary":"Calls AddMapsterConfiguration to register Mapster mapping setup for the Application project"},{"line":11,"serviceType":"MediatR handlers (from this assembly)","implementationType":"handlers discovered in this assembly","lifetime":"unknown","factorySummary":"Calls AddMediatR(cfg => cfg.RegisterServicesFromAssembly(Assembly)) to register MediatR handlers"}],"startupActions":[],"dependencies":["NexusReader.Application/Mappings.cs","MediatR (external package)"],"patterns":["Dependency Injection extension","Service registration"],"domainConcepts":[],"keyDetails":"Intended to be called from the composition root (e.g., Web project startup) to wire up application mapping and MediatR handler discovery; exposes Assembly for scanning.","orchestrationMethods":[],"typedContracts":[],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__Mappings__MappingConfig.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__Mappings__MappingConfig.cs.json new file mode 100644 index 0000000..fec8b34 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__Mappings__MappingConfig.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/Mappings/MappingConfig.cs","purpose":"Defines and registers Mapster mapping configuration and the Mapster IMapper into the application's DI container.","classification":{"role":"service-registration","layer":"application","confidence":0.9,"evidence":["Service registration API usage","Provides an IServiceCollection extension method AddMapsterConfiguration that registers mapping services","Calls AddSingleton and AddScoped to register TypeAdapterConfig and IMapper"]},"className":"MappingConfig","methods":[{"name":"AddMapsterConfiguration","line":11,"endLine":23,"signature":"(this IServiceCollection services) -> IServiceCollection","purpose":"Configures Mapster type mappings and registers the mapping configuration and IMapper implementation into DI, then returns the IServiceCollection.","calls":[{"targetFile":"unknown","targetMethod":"TypeAdapterConfig.GlobalSettings","callLine":13,"paramSummary":"access global Mapster configuration instance"},{"targetFile":"unknown","targetMethod":"NewConfig","callLine":15,"paramSummary":"Generic mapping registration: NexusUser -> UserProfileDto"},{"targetFile":"unknown","targetMethod":"NewConfig","callLine":16,"paramSummary":"Generic mapping registration: Ebook -> LastReadBookDto"},{"targetFile":"unknown","targetMethod":"Map","callLine":17,"paramSummary":"Configures Description -> Description mapping lambda"},{"targetFile":"unknown","targetMethod":"AddSingleton","callLine":19,"paramSummary":"Registers the mapped TypeAdapterConfig instance as singleton"},{"targetFile":"unknown","targetMethod":"AddScoped","callLine":20,"paramSummary":"Registers IMapper -> ServiceMapper as scoped"}],"actions":[{"id":"access_13","kind":"mapping","label":"Obtain global Mapster config","line":13,"detail":"var config = TypeAdapterConfig.GlobalSettings;","visibility":"detail-only","confidence":0.7},{"id":"map-config_15","kind":"mapping","label":"Register NexusUser -> UserProfileDto mapping","line":15,"detail":"config.NewConfig()","visibility":"detail-only","confidence":0.7},{"id":"map-config_16","kind":"mapping","label":"Register Ebook -> LastReadBookDto mapping","line":16,"detail":"config.NewConfig()","visibility":"detail-only","confidence":0.7},{"id":"map-config_17","kind":"mapping","label":"Explicitly map Description property","line":17,"detail":".Map(dest => dest.Description, src => src.Description)","visibility":"detail-only","confidence":0.7},{"id":"addmapsterconfiguration_mapping_17_0","kind":"mapping","label":"Maps data or transforms shape","line":17,"detail":".Map(dest => dest.Description, src => src.Description);","visibility":"detail-only","confidence":0.74},{"id":"service-registration_19","kind":"mapping","label":"Register TypeAdapterConfig as singleton","line":19,"detail":"services.AddSingleton(config)","visibility":"detail-only","confidence":0.7},{"id":"service-registration_20","kind":"mapping","label":"Register IMapper implementation as scoped","line":20,"detail":"services.AddScoped()","visibility":"detail-only","confidence":0.7},{"id":"return_22","kind":"return","label":"Return service collection","line":22,"detail":"return services;","visibility":"detail-only","confidence":0.7},{"id":"addmapsterconfiguration_return_22_1","kind":"return","label":"Returns result","line":22,"detail":"return services;","visibility":"detail-only","confidence":0.7}]}],"types":[],"serviceRegistrations":[{"line":19,"serviceType":"TypeAdapterConfig","implementationType":"TypeAdapterConfig (instance)","lifetime":"singleton","factorySummary":"Registers the global Mapster TypeAdapterConfig instance as a singleton"},{"line":20,"serviceType":"IMapper","implementationType":"ServiceMapper","lifetime":"scoped","factorySummary":"Registers Mapster ServiceMapper as the application's IMapper implementation"}],"startupActions":[],"dependencies":["NexusReader.Domain.Entities","NexusReader.Application.DTOs.User","Mapster","MapsterMapper","Microsoft.Extensions.DependencyInjection"],"patterns":["Mapping/Adapter","DI service registration","Extension method for IServiceCollection"],"domainConcepts":["NexusUser","UserProfileDto","Ebook","LastReadBookDto"],"keyDetails":"Single extension method that centralizes Mapster mapping registrations (including an explicit mapping for Description) and registers the Mapster config and IMapper in DI for application-wide usage.","orchestrationMethods":[{"name":"AddMapsterConfiguration","line":11,"confidence":0.93,"reason":"Coordinates 6 downstream calls with 0 architectural actions.","actionKinds":["mapping","return"],"evidencePaths":["NexusReader.Application/Mappings/MappingConfig.cs","unknown","unknown","unknown","unknown","unknown"]}],"typedContracts":[],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"orchestration-method","label":"AddMapsterConfiguration","line":11,"summary":"Coordinates 6 downstream calls with 0 architectural actions.","confidence":0.93,"evidencePaths":["NexusReader.Application/Mappings/MappingConfig.cs","unknown","unknown","unknown","unknown","unknown"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__NexusReader.Application.csproj.json b/src/.documentation/cache/summaries/NexusReader.Application__NexusReader.Application.csproj.json new file mode 100644 index 0000000..271bbfa --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__NexusReader.Application.csproj.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/NexusReader.Application.csproj","purpose":"Project file for the NexusReader.Application .NET project: declares project-to-project references, NuGet package dependencies, and build properties (target framework, nullable, implicit usings, runtime config generation).","classification":{"role":"config","layer":"application","confidence":0.9,"evidence":["Project references to NexusReader.Domain and NexusReader.Data (lines 4-6)","Multiple PackageReference entries including MediatR, EF Core, AI, Identity, resilience libraries (lines 9-18)","TargetFramework, Nullable, ImplicitUsings defined (lines 21-26)"]},"className":"","methods":[],"types":[],"serviceRegistrations":[],"startupActions":[],"dependencies":["..\\NexusReader.Domain\\NexusReader.Domain.csproj","..\\NexusReader.Data\\NexusReader.Data.csproj"],"patterns":["MediatR (Mediator/CQRS)","Mapster (mapping)","EF Core repository/persistence","Resilience patterns (Microsoft.Extensions.Resilience)"],"domainConcepts":["Authentication/Identity","AI/Knowledge (Microsoft.Extensions.AI)","Vector search (Pgvector)","Persistence/EF Core","Mapping/DTOs"],"keyDetails":"TargetFramework: net10.0 (line 22); ImplicitUsings enabled (line 23); Nullable enabled (line 24); GenerateRuntimeConfigurationFiles true (line 25). NuGet packages: FluentResults, Mapster, Mapster.DependencyInjection, MediatR, Microsoft.AspNetCore.Authorization, Microsoft.EntityFrameworkCore, Microsoft.Extensions.AI, Microsoft.Extensions.Identity.Core, Pgvector.EntityFrameworkCore, Microsoft.Extensions.Resilience (lines 9-18). Project references to Domain and Data projects (lines 4-5).","orchestrationMethods":[],"typedContracts":[],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__Queries__Graph__GetKnowledgeGraphQuery.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__Queries__Graph__GetKnowledgeGraphQuery.cs.json new file mode 100644 index 0000000..18c6065 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__Queries__Graph__GetKnowledgeGraphQuery.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/Queries/Graph/GetKnowledgeGraphQuery.cs","purpose":"Defines a CQRS query record that carries input for extracting a knowledge graph from text within a tenant and optional ebook scope.","classification":{"role":"handler","layer":"application","confidence":0.9,"evidence":["Query naming pattern","File path: NexusReader.Application/Queries/Graph/GetKnowledgeGraphQuery.cs","Type implements IQuery"]},"className":"GetKnowledgeGraphQuery","methods":[{"name":"GetKnowledgeGraphQuery (ctor)","line":8,"endLine":8,"signature":"(Text: string, TenantId: string, EbookId: Guid? = null) -> GetKnowledgeGraphQuery","purpose":"Constructs the query DTO carrying text, tenant, and optional ebook id for knowledge-graph extraction.","calls":[],"actions":[{"id":"ctor_8","kind":"mapping","label":"Primary record constructor","line":8,"detail":"Immutable record positional parameters: Text, TenantId, EbookId (nullable, default null)","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"GetKnowledgeGraphQuery","kind":"query","line":8,"purpose":"Represents a request to produce a GraphDataDto from provided text within a tenant and optional ebook context.","fields":[{"name":"Text","type":"string","required":true,"line":8,"description":"Chapter or page content to extract the graph from."},{"name":"TenantId","type":"string","required":true,"line":8,"description":"Tenant scope for knowledge extraction and caching."},{"name":"EbookId","type":"Guid?","required":false,"line":8,"description":"Optional Ebook ID to link the knowledge units to."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Application.Abstractions.Messaging (referenced via using)","GraphDataDto (referenced in IQuery, file unknown)"],"patterns":["CQRS Query"],"domainConcepts":["Knowledge Graph","Tenant","Ebook"],"keyDetails":"Lightweight immutable record used as the application-layer query DTO; no runtime logic in this file.","orchestrationMethods":[],"typedContracts":[{"name":"GetKnowledgeGraphQuery","kind":"query","line":8,"fieldCount":3,"evidencePaths":["NexusReader.Application/Queries/Graph/GetKnowledgeGraphQuery.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"GetKnowledgeGraphQuery","line":8,"summary":"query with 3 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Graph/GetKnowledgeGraphQuery.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__Queries__Graph__GetKnowledgeGraphQueryHandler.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__Queries__Graph__GetKnowledgeGraphQueryHandler.cs.json new file mode 100644 index 0000000..0d2b806 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__Queries__Graph__GetKnowledgeGraphQueryHandler.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/Queries/Graph/GetKnowledgeGraphQueryHandler.cs","purpose":"Handles GetKnowledgeGraphQuery by delegating to an IKnowledgeService to produce a GraphDataDto (returns empty graph for empty input or on null results).","classification":{"role":"handler","layer":"application","confidence":0.9,"evidence":["class implements IQueryHandler (line 7)","uses IKnowledgeService to obtain graph data (lines 9, 21)"]},"className":"GetKnowledgeGraphQueryHandler","methods":[{"name":"GetKnowledgeGraphQueryHandler","line":11,"endLine":14,"signature":"(knowledgeService: IKnowledgeService) -> GetKnowledgeGraphQueryHandler","purpose":"Constructor — captures IKnowledgeService dependency.","calls":[],"actions":[{"id":"assignment_13","kind":"mapping","label":"Assigns dependency to field","line":13,"detail":"_knowledgeService = knowledgeService","visibility":"detail-only","confidence":0.7}]},{"name":"Handle","line":16,"endLine":33,"signature":"(request: GetKnowledgeGraphQuery, cancellationToken: CancellationToken) -> Task>","purpose":"Handles the query: validates input, calls IKnowledgeService.GetGraphDataAsync, and maps the result to Result with guard/fallback behavior.","calls":[{"targetFile":"NexusReader.Application.Abstractions.Services/IKnowledgeService","targetMethod":"GetGraphDataAsync","callLine":21,"paramSummary":"request.Text, request.TenantId, ebookId: request.EbookId, cancellationToken"}],"actions":[{"id":"guard-clause_18","kind":"guard-clause","label":"Empty-text fast-return","line":18,"detail":"if text is empty returns Result.Ok(new GraphDataDto())","conditionSummary":"string.IsNullOrWhiteSpace(request.Text)","outcomeLabels":["return empty GraphDataDto","skip service call"],"visibility":"detail-only","confidence":0.7},{"id":"handle_branch_18_0","kind":"branch","label":"Evaluates branch condition","line":18,"detail":"if (string.IsNullOrWhiteSpace(request.Text))","conditionSummary":"string.IsNullOrWhiteSpace(request.Text)","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"handle_return_19_1","kind":"return","label":"Returns result","line":19,"detail":"return Result.Ok(new GraphDataDto());","visibility":"detail-only","confidence":0.7},{"id":"external-call_21","kind":"external-call","label":"Fetch graph data","line":21,"detail":"Calls _knowledgeService.GetGraphDataAsync(...) and awaits result; passes cancellationToken","visibility":"detail-only","confidence":0.7},{"id":"handle_branch_27_2","kind":"branch","label":"Evaluates branch condition","line":27,"detail":"if (result.IsFailed)","conditionSummary":"result.IsFailed","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"branch_27","kind":"branch","label":"Service failure handling","line":27,"detail":"Propagates errors from knowledge service as Result.Fail","conditionSummary":"result.IsFailed","outcomeLabels":["return Result.Fail(result.Errors)","continue"],"visibility":"detail-only","confidence":0.7},{"id":"handle_return_28_3","kind":"return","label":"Returns result","line":28,"detail":"return Result.Fail(result.Errors);","visibility":"detail-only","confidence":0.7},{"id":"null-check_32","kind":"mapping","label":"Graph null -> empty DTO","line":32,"detail":"Returns Result.Ok(new GraphDataDto()) if graph null, otherwise Result.Ok(graph)","conditionSummary":"graph is null","outcomeLabels":["return empty GraphDataDto","return graph"],"visibility":"detail-only","confidence":0.7},{"id":"handle_return_32_4","kind":"return","label":"Returns result","line":32,"detail":"return graph is null ? Result.Ok(new GraphDataDto()) : Result.Ok(graph);","visibility":"detail-only","confidence":0.7}]}],"types":[],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Application.Abstractions.Services/IKnowledgeService","NexusReader.Application.Queries.Graph/GetKnowledgeGraphQuery","NexusReader.Application.Queries.Graph/GraphDataDto"],"patterns":["CQRS Handler","Query Handler"],"domainConcepts":["Knowledge Graph","GraphData"],"keyDetails":"Uses FluentResults.Result for success/failure wrapping; short-circuits on empty input; propagates service errors; returns empty GraphDataDto when service returns null graph.","orchestrationMethods":[{"name":"Handle","line":16,"confidence":0.98,"reason":"Contains 4 architectural actions relevant to business execution.","actionKinds":["guard-clause","branch","return","external-call","mapping"],"evidencePaths":["NexusReader.Application/Queries/Graph/GetKnowledgeGraphQueryHandler.cs","NexusReader.Application.Abstractions.Services/IKnowledgeService"]}],"typedContracts":[],"persistenceInteractions":[],"externalInteractions":[{"methodName":"Handle","line":21,"kind":"external-call","detail":"Calls _knowledgeService.GetGraphDataAsync(...) and awaits result; passes cancellationToken","evidencePaths":["NexusReader.Application/Queries/Graph/GetKnowledgeGraphQueryHandler.cs"]}],"evidenceAnchors":[{"kind":"orchestration-method","label":"Handle","line":16,"summary":"Contains 4 architectural actions relevant to business execution.","confidence":0.98,"evidencePaths":["NexusReader.Application/Queries/Graph/GetKnowledgeGraphQueryHandler.cs","NexusReader.Application.Abstractions.Services/IKnowledgeService"]},{"kind":"external-call","label":"Handle","line":21,"summary":"Calls _knowledgeService.GetGraphDataAsync(...) and awaits result; passes cancellationToken","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Graph/GetKnowledgeGraphQueryHandler.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__Queries__Graph__GraphViewModels.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__Queries__Graph__GraphViewModels.cs.json new file mode 100644 index 0000000..ed97b0d --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__Queries__Graph__GraphViewModels.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/Queries/Graph/GraphViewModels.cs","purpose":"Defines simple DTO/view-model records for graph visualization: node, link, and a container holding collections of nodes and links used by application queries.","classification":{"role":"dto","layer":"application","confidence":0.9,"evidence":["DTO/view-model naming pattern","Namespace NexusReader.Application.Queries.Graph indicates application query DTOs","File contains only record types named GraphNodeDto, GraphLinkDto, GraphDataDto"]},"className":"","methods":[],"types":[{"name":"GraphNodeDto","kind":"dto","line":3,"purpose":"Represents a single graph node with id, display label, group and optional type.","fields":[{"name":"Id","type":"string","required":true,"line":3,"description":"Unique identifier for the node (constructor parameter)"},{"name":"Label","type":"string","required":true,"line":3,"description":"Human-readable label for the node (constructor parameter)"},{"name":"Group","type":"string","required":true,"line":3,"description":"Grouping/category for visualization (constructor parameter)"},{"name":"Type","type":"string?","required":false,"line":3,"description":"Optional semantic type of the node (nullable constructor parameter)"}]},{"name":"GraphLinkDto","kind":"dto","line":4,"purpose":"Represents an edge/link between two nodes with a relation type and optional weight/value.","fields":[{"name":"Source","type":"string","required":true,"line":4,"description":"Source node id (constructor parameter)"},{"name":"Target","type":"string","required":true,"line":4,"description":"Target node id (constructor parameter)"},{"name":"RelationType","type":"string","required":true,"line":4,"description":"Label/type of the relationship (constructor parameter)"},{"name":"Value","type":"int","required":true,"line":4,"description":"Numeric weight/strength of the link with default 1 (constructor parameter)"}]},{"name":"GraphDataDto","kind":"dto","line":5,"purpose":"Container holding collections of GraphNodeDto and GraphLinkDto for graph results returned by queries.","fields":[{"name":"Nodes","type":"List","required":true,"line":7,"description":"List of nodes (init-only property, defaults to empty list)"},{"name":"Links","type":"List","required":true,"line":8,"description":"List of links/edges (init-only property, defaults to empty list)"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["DTO","View-Model"],"domainConcepts":["Graph","Node","Link"],"keyDetails":"Minimal, immutable record types used to transport graph data in application query responses; no behavior, persistence, or external calls present.","orchestrationMethods":[],"typedContracts":[{"name":"GraphNodeDto","kind":"dto","line":3,"fieldCount":4,"evidencePaths":["NexusReader.Application/Queries/Graph/GraphViewModels.cs"]},{"name":"GraphLinkDto","kind":"dto","line":4,"fieldCount":4,"evidencePaths":["NexusReader.Application/Queries/Graph/GraphViewModels.cs"]},{"name":"GraphDataDto","kind":"dto","line":5,"fieldCount":2,"evidencePaths":["NexusReader.Application/Queries/Graph/GraphViewModels.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"GraphNodeDto","line":3,"summary":"dto with 4 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Graph/GraphViewModels.cs"]},{"kind":"typed-contract","label":"GraphLinkDto","line":4,"summary":"dto with 4 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Graph/GraphViewModels.cs"]},{"kind":"typed-contract","label":"GraphDataDto","line":5,"summary":"dto with 2 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Graph/GraphViewModels.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__Queries__Library__AskLibraryQuestionQuery.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__Queries__Library__AskLibraryQuestionQuery.cs.json new file mode 100644 index 0000000..d935854 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__Queries__Library__AskLibraryQuestionQuery.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/Queries/Library/AskLibraryQuestionQuery.cs","purpose":"Defines a MediatR query (AskLibraryQuestionQuery) and its handler which validates the request and delegates question answering to an IKnowledgeService, returning a grounded AI response.","classification":{"role":"handler","layer":"application","confidence":0.9,"evidence":["Command pattern","Implements MediatR IRequest/IRequestHandler (lines 11, 14)","Namespace NexusReader.Application.Queries.Library and uses IKnowledgeService (lines 6, 9, 16)"]},"className":"AskLibraryQuestionQueryHandler","methods":[{"name":"AskLibraryQuestionQueryHandler","line":18,"endLine":21,"signature":"(knowledgeService: IKnowledgeService) -> void","purpose":"Constructor that injects the IKnowledgeService dependency.","calls":[],"actions":[{"id":"assignment_20","kind":"mapping","label":"Store injected dependency","line":20,"detail":"_knowledgeService = knowledgeService","visibility":"detail-only","confidence":0.7}]},{"name":"Handle","line":23,"endLine":36,"signature":"(request: AskLibraryQuestionQuery, cancellationToken: CancellationToken) -> Task>","purpose":"Validates the query (non-empty question) and forwards it to IKnowledgeService.AskQuestionAsync, returning the service result.","calls":[{"targetFile":"NexusReader.Application/Abstractions/Services/IKnowledgeService.cs","targetMethod":"AskQuestionAsync","callLine":30,"paramSummary":"request.Question, request.TenantId, request.EbookId, request.Limit, cancellationToken"}],"actions":[{"id":"handle_branch_25_0","kind":"branch","label":"Evaluates branch condition","line":25,"detail":"if (string.IsNullOrWhiteSpace(request.Question))","conditionSummary":"string.IsNullOrWhiteSpace(request.Question)","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"guard-clause_25","kind":"guard-clause","label":"Reject empty question","line":25,"detail":"if question is null/whitespace returns Result.Fail(\"Question cannot be empty.\") (lines 25-28)","conditionSummary":"string.IsNullOrWhiteSpace(request.Question)","outcomeLabels":["invalid -> return Result.Fail","continue"],"visibility":"detail-only","confidence":0.7},{"id":"return_27","kind":"return","label":"Return service result or failure","line":27,"detail":"Returns Result.Fail on invalid input or the awaited service result on success","visibility":"detail-only","confidence":0.7},{"id":"handle_return_27_1","kind":"return","label":"Returns result","line":27,"detail":"return Result.Fail(\"Question cannot be empty.\");","visibility":"detail-only","confidence":0.7},{"id":"external-call_30","kind":"external-call","label":"Delegate to knowledge service","line":30,"detail":"await _knowledgeService.AskQuestionAsync(...) and return its Result","visibility":"detail-only","confidence":0.7},{"id":"handle_return_30_2","kind":"return","label":"Returns result","line":30,"detail":"return await _knowledgeService.AskQuestionAsync(","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"AskLibraryQuestionQuery","kind":"query","line":11,"purpose":"Query DTO representing a user's library question and selection parameters.","fields":[{"name":"Question","type":"string","required":true,"line":11,"description":"The natural-language question to ask the knowledge service"},{"name":"TenantId","type":"string","required":true,"line":11,"description":"Tenant identifier for scoping the knowledge query"},{"name":"EbookId","type":"Guid?","required":false,"line":11,"description":"Optional ebook/context identifier to narrow the knowledge search"},{"name":"Limit","type":"int","required":true,"line":11,"description":"Limit of returned grounding sources (default 5)"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Application/Abstractions/Services/IKnowledgeService.cs","NexusReader.Application/DTOs/AI/GroundedResponseDto.cs"],"patterns":["Mediator (MediatR)","Query Handler","Dependency Injection"],"domainConcepts":["KnowledgeService","Library Question","Ebook","Grounded AI Response"],"keyDetails":"Handler performs simple validation and delegates to IKnowledgeService.AskQuestionAsync, returning a FluentResults.Result.","orchestrationMethods":[{"name":"Handle","line":23,"confidence":0.77,"reason":"Contains 2 architectural actions relevant to business execution.","actionKinds":["branch","guard-clause","return","external-call"],"evidencePaths":["NexusReader.Application/Queries/Library/AskLibraryQuestionQuery.cs","NexusReader.Application/Abstractions/Services/IKnowledgeService.cs"]}],"typedContracts":[{"name":"AskLibraryQuestionQuery","kind":"query","line":11,"fieldCount":4,"evidencePaths":["NexusReader.Application/Queries/Library/AskLibraryQuestionQuery.cs"]}],"persistenceInteractions":[],"externalInteractions":[{"methodName":"Handle","line":30,"kind":"external-call","detail":"await _knowledgeService.AskQuestionAsync(...) and return its Result","evidencePaths":["NexusReader.Application/Queries/Library/AskLibraryQuestionQuery.cs"]}],"evidenceAnchors":[{"kind":"orchestration-method","label":"Handle","line":23,"summary":"Contains 2 architectural actions relevant to business execution.","confidence":0.77,"evidencePaths":["NexusReader.Application/Queries/Library/AskLibraryQuestionQuery.cs","NexusReader.Application/Abstractions/Services/IKnowledgeService.cs"]},{"kind":"typed-contract","label":"AskLibraryQuestionQuery","line":11,"summary":"query with 4 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Library/AskLibraryQuestionQuery.cs"]},{"kind":"external-call","label":"Handle","line":30,"summary":"await _knowledgeService.AskQuestionAsync(...) and return its Result","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Library/AskLibraryQuestionQuery.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__Queries__Library__GetMyEbooksQuery.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__Queries__Library__GetMyEbooksQuery.cs.json new file mode 100644 index 0000000..9e554e1 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__Queries__Library__GetMyEbooksQuery.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/Queries/Library/GetMyEbooksQuery.cs","purpose":"MediatR query + handler that reads the current user's ebooks from the EF Core AppDbContext, projects them to LastReadBookDto and returns a successful FluentResults Result with the list.","classification":{"role":"handler","layer":"application","confidence":0.85,"evidence":["Command pattern","Implements MediatR IRequestHandler>>","Reads AppDbContext.Ebooks and returns DTOs (projection)"]},"className":"GetMyEbooksQueryHandler","methods":[{"name":"Handle","line":20,"endLine":45,"signature":"(request: GetMyEbooksQuery, cancellationToken: CancellationToken) -> Task>>","purpose":"Creates a DB context, queries the Ebooks owned by the given user, projects each entity to LastReadBookDto (with a default for LastChapter), and returns Result.Ok(list).","calls":[{"targetFile":"unknown","targetMethod":"CreateDbContextAsync","callLine":22,"paramSummary":"cancellationToken (to create an AppDbContext instance via IDbContextFactory)"},{"targetFile":"NexusReader.Data.Persistence/AppDbContext.cs","targetMethod":"Ebooks (DbSet)","callLine":24,"paramSummary":"Access DbSet to query rows filtered by UserId"},{"targetFile":"NexusReader.Application.DTOs.User","targetMethod":"LastReadBookDto (projection/init)","callLine":27,"paramSummary":"maps entity properties: Id, Title, Author -> AuthorDto, CoverUrl, Progress, LastChapter (with fallback), LastChapterIndex, Description"},{"targetFile":"unknown","targetMethod":"ToListAsync","callLine":42,"paramSummary":"cancellationToken (executes the EF Core query and returns List)"},{"targetFile":"unknown","targetMethod":"Result.Ok","callLine":44,"paramSummary":"ebooks (List) to wrap into a successful FluentResults.Result"}],"actions":[{"id":"resource-acquisition_22","kind":"mapping","label":"creates DB context with using + await","line":22,"detail":"using var dbContext = await _dbContextFactory.CreateDbContextAsync(cancellationToken)","visibility":"detail-only","confidence":0.7},{"id":"persistence-read_24","kind":"mapping","label":"query Ebooks filtered by UserId","line":24,"detail":"dbContext.Ebooks.Where(e => e.UserId == request.UserId)","visibility":"detail-only","confidence":0.7},{"id":"handle_repository-read_25_0","kind":"repository-read","label":"Reads repository or persistence state","line":25,"detail":".Where(e => e.UserId == request.UserId)","visibility":"secondary-visible","confidence":0.86},{"id":"branch/order_26","kind":"mapping","label":"orders by LastReadDate or AddedDate","line":26,"detail":"OrderByDescending(e => e.LastReadDate ?? e.AddedDate)","visibility":"detail-only","confidence":0.7},{"id":"handle_mapping_27_1","kind":"mapping","label":"Maps data or transforms shape","line":27,"detail":".Select(e => new LastReadBookDto","visibility":"detail-only","confidence":0.74},{"id":"projection/mapping_27","kind":"mapping","label":"projects entity to LastReadBookDto and nested AuthorDto","line":27,"detail":"Select(...) mapping entity fields into DTO properties","visibility":"detail-only","confidence":0.7},{"id":"fallback_38","kind":"fallback","label":"default LastChapter when null","line":38,"detail":"LastChapter = e.LastChapter ?? \"Rozpoczynanie...\"","conditionSummary":"e.LastChapter == null","outcomeLabels":["use default string","use entity value"],"visibility":"detail-only","confidence":0.7},{"id":"async-await_42","kind":"mapping","label":"executes query asynchronously","line":42,"detail":"await ...ToListAsync(cancellationToken)","visibility":"detail-only","confidence":0.7},{"id":"handle_return_44_2","kind":"return","label":"Returns result","line":44,"detail":"return Result.Ok(ebooks);","visibility":"detail-only","confidence":0.7},{"id":"return_44","kind":"return","label":"wraps result into FluentResults success","line":44,"detail":"return Result.Ok(ebooks)","visibility":"detail-only","confidence":0.7}]},{"name":"GetMyEbooksQueryHandler (ctor)","line":15,"endLine":18,"signature":"(dbContextFactory: IDbContextFactory) -> GetMyEbooksQueryHandler","purpose":"Dependency-injects an IDbContextFactory for creating DbContext instances used by the handler.","calls":[],"actions":[{"id":"assignment_17","kind":"mapping","label":"stores injected dbContextFactory","line":17,"detail":"_dbContextFactory = dbContextFactory","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"GetMyEbooksQuery","kind":"query","line":9,"purpose":"MediatR request that carries the UserId to fetch ebooks for the current user.","fields":[{"name":"UserId","type":"string","required":true,"line":9,"description":"Identifier of the user whose ebooks should be returned"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Application.DTOs.User","NexusReader.Data.Persistence/AppDbContext.cs","Microsoft.EntityFrameworkCore (EF Core) - used for IDbContextFactory and LINQ execution"],"patterns":["CQRS Handler","Repository (EF Core DbContext)","Projection / DTO mapping"],"domainConcepts":["Ebook","Author","User","LastReadBookDto"],"keyDetails":"Performs a read-only pageless query of a user's ebooks, orders by last read or added date, maps to DTOs and returns a FluentResults success. Notable runtime behaviors: async DB context creation, EF Core LINQ pipeline, mapping fallback for LastChapter.","orchestrationMethods":[{"name":"Handle","line":20,"confidence":0.98,"reason":"Coordinates 5 downstream calls with 2 architectural actions.","actionKinds":["mapping","repository-read","fallback","return"],"evidencePaths":["NexusReader.Application/Queries/Library/GetMyEbooksQuery.cs","unknown","NexusReader.Data.Persistence/AppDbContext.cs","NexusReader.Application.DTOs.User","unknown","unknown"]}],"typedContracts":[{"name":"GetMyEbooksQuery","kind":"query","line":9,"fieldCount":1,"evidencePaths":["NexusReader.Application/Queries/Library/GetMyEbooksQuery.cs"]}],"persistenceInteractions":[{"methodName":"Handle","line":25,"kind":"persistence-read","detail":".Where(e => e.UserId == request.UserId)","evidencePaths":["NexusReader.Application/Queries/Library/GetMyEbooksQuery.cs"]}],"externalInteractions":[],"evidenceAnchors":[{"kind":"orchestration-method","label":"Handle","line":20,"summary":"Coordinates 5 downstream calls with 2 architectural actions.","confidence":0.98,"evidencePaths":["NexusReader.Application/Queries/Library/GetMyEbooksQuery.cs","unknown","NexusReader.Data.Persistence/AppDbContext.cs","NexusReader.Application.DTOs.User","unknown","unknown"]},{"kind":"typed-contract","label":"GetMyEbooksQuery","line":9,"summary":"query with 1 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Library/GetMyEbooksQuery.cs"]},{"kind":"persistence","label":"Handle","line":25,"summary":".Where(e => e.UserId == request.UserId)","confidence":0.82,"evidencePaths":["NexusReader.Application/Queries/Library/GetMyEbooksQuery.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__Queries__Library__SearchLibrarySemanticallyQuery.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__Queries__Library__SearchLibrarySemanticallyQuery.cs.json new file mode 100644 index 0000000..750d349 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__Queries__Library__SearchLibrarySemanticallyQuery.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/Queries/Library/SearchLibrarySemanticallyQuery.cs","purpose":"Implements a MediatR query and handler that semantically searches a tenant-scoped semantic cache using an embedding generated for the query text (with retry) and returns mapped DTO results.","classification":{"role":"handler","layer":"application","confidence":0.9,"evidence":["Command pattern","Implements IRequestHandler (MediatR)","Lives in namespace NexusReader.Application.Queries.Library and uses application DTOs and DbContext"]},"className":"SearchLibrarySemanticallyQueryHandler","methods":[{"name":"SearchLibrarySemanticallyQuery","line":19,"endLine":20,"signature":"(QueryText: string, TenantId: string, Limit: int = 5) -> IRequest>>","purpose":"DTO/Query record that represents a semantic search request (query text, tenant, optional limit).","calls":[],"actions":[{"id":"type-declaration_19","kind":"mapping","label":"Query shape declared","line":19,"detail":"record with QueryText, TenantId and Limit","visibility":"detail-only","confidence":0.7}]},{"name":"SearchLibrarySemanticallyQueryHandler","line":29,"endLine":39,"signature":"(embeddingGenerator: IEmbeddingGenerator>, dbContextFactory: IDbContextFactory, pipelineProvider: ResiliencePipelineProvider, mapper: IMapper) -> SearchLibrarySemanticallyQueryHandler","purpose":"Constructor that stores dependencies and obtains the named resilience pipeline ('ai-retry').","calls":[],"actions":[{"id":"dependency-wire_35","kind":"mapping","label":"Assigns dependencies to fields","line":35,"detail":"_embeddingGenerator, _dbContextFactory, _mapper assigned","visibility":"detail-only","confidence":0.7},{"id":"external-call_37","kind":"external-call","label":"Reads resilience pipeline by name","line":37,"detail":"_retryPipeline = pipelineProvider.GetPipeline(\"ai-retry\") (external/library)","visibility":"detail-only","confidence":0.7}]},{"name":"Handle","line":41,"endLine":62,"signature":"(request: SearchLibrarySemanticallyQuery, cancellationToken: CancellationToken) -> Task>>","purpose":"Executes semantic search: validates input, generates embedding (with retry), queries the semantic cache ordered by cosine distance, maps results to DTOs and returns them.","calls":[{"targetFile":"NexusReader.Data.Persistence/AppDbContext.cs","targetMethod":"SemanticKnowledgeCache","callLine":54,"paramSummary":"accessed to build LINQ query filtered by TenantId and non-null Embedding"}],"actions":[{"id":"handle_branch_43_0","kind":"branch","label":"Evaluates branch condition","line":43,"detail":"if (string.IsNullOrWhiteSpace(request.QueryText))","conditionSummary":"string.IsNullOrWhiteSpace(request.QueryText)","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"guard-clause_43","kind":"guard-clause","label":"Rejects empty query","line":43,"detail":"Returns Result.Fail(\"Query text cannot be empty.\")","conditionSummary":"string.IsNullOrWhiteSpace(request.QueryText)","outcomeLabels":["invalid","continue"],"visibility":"detail-only","confidence":0.7},{"id":"handle_return_45_1","kind":"return","label":"Returns result","line":45,"detail":"return Result.Fail(\"Query text cannot be empty.\");","visibility":"detail-only","confidence":0.7},{"id":"retry_49","kind":"retry","label":"Generate embedding with resilience pipeline","line":49,"detail":"await _retryPipeline.ExecuteAsync(... _embeddingGenerator.GenerateAsync(...)) — retry/resilience applied to embedding generation","visibility":"detail-only","confidence":0.7},{"id":"external-call_50","kind":"external-call","label":"Embedding generation","line":50,"detail":"Calls IEmbeddingGenerator.GenerateAsync with the request.QueryText (external/AI service)","visibility":"detail-only","confidence":0.7},{"id":"mapping_51","kind":"mapping","label":"Create query vector","line":51,"detail":"Wraps embedding response vector into Pgvector.Vector for DB cosine comparisons","visibility":"detail-only","confidence":0.7},{"id":"persistence-read_53","kind":"mapping","label":"Create DbContext and query semantic cache","line":53,"detail":"Uses IDbContextFactory.CreateDbContextAsync then queries dbContext.SemanticKnowledgeCache filtered by TenantId and non-null embedding, orders by Embedding.CosineDistance(queryVector), takes Limit and materializes ToListAsync","visibility":"detail-only","confidence":0.7},{"id":"linq-query_54","kind":"mapping","label":"Filter/order/limit","line":54,"detail":"Where(c => c.TenantId == request.TenantId && c.Embedding != null).OrderBy(c => c.Embedding!.CosineDistance(queryVector)).Take(request.Limit).ToListAsync(...)","visibility":"detail-only","confidence":0.7},{"id":"handle_repository-read_55_2","kind":"repository-read","label":"Reads repository or persistence state","line":55,"detail":".Where(c => c.TenantId == request.TenantId && c.Embedding != null)","visibility":"secondary-visible","confidence":0.86},{"id":"mapping_60","kind":"mapping","label":"Map entities to DTOs","line":60,"detail":"_mapper.Map>(cacheEntries) (Mapster mapper usage)","visibility":"detail-only","confidence":0.7},{"id":"return_61","kind":"return","label":"Return mapped results","line":61,"detail":"Result.Ok(dtos)","visibility":"detail-only","confidence":0.7},{"id":"handle_return_61_3","kind":"return","label":"Returns result","line":61,"detail":"return Result.Ok(dtos);","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"SearchLibrarySemanticallyQuery","kind":"query","line":19,"purpose":"Query object representing semantic search input (text, tenant, limit).","fields":[{"name":"QueryText","type":"string","required":true,"line":19,"description":"User-provided search text used to generate embedding"},{"name":"TenantId","type":"string","required":true,"line":19,"description":"Tenant identifier to scope the semantic cache"},{"name":"Limit","type":"int","required":false,"line":19,"description":"Maximum number of results to return (default 5)"}]},{"name":"SearchLibrarySemanticallyQueryHandler","kind":"model","line":22,"purpose":"MediatR handler that orchestrates embedding generation, resilient execution, DB querying and mapping.","fields":[{"name":"_embeddingGenerator","type":"IEmbeddingGenerator>","required":true,"line":24,"description":"Generates embeddings for input text (AI service)"},{"name":"_dbContextFactory","type":"IDbContextFactory","required":true,"line":25,"description":"Factory to create EF DbContext instances"},{"name":"_retryPipeline","type":"ResiliencePipeline","required":true,"line":26,"description":"Named resilience/retry pipeline used for external calls"},{"name":"_mapper","type":"IMapper","required":true,"line":27,"description":"Maps persistence entities to DTOs"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Data.Persistence/AppDbContext.cs","NexusReader.Application/DTOs/AI/SemanticSearchResultDto.cs"],"patterns":["CQRS Handler","Resilience/Retry","Semantic Search / Vector DB"],"domainConcepts":["SemanticKnowledgeCache","Embedding","Tenant scoping","CosineDistance"],"keyDetails":"Validates input, generates an embedding under a resilience pipeline, queries tenant-scoped semantic cache ordered by cosine distance using pgvector, maps to SemanticSearchResultDto, and returns a Result-wrapped list.","orchestrationMethods":[{"name":"Handle","line":41,"confidence":0.98,"reason":"Contains 4 architectural actions relevant to business execution.","actionKinds":["branch","guard-clause","return","retry","external-call","mapping","repository-read"],"evidencePaths":["NexusReader.Application/Queries/Library/SearchLibrarySemanticallyQuery.cs","NexusReader.Data.Persistence/AppDbContext.cs"]},{"name":"SearchLibrarySemanticallyQueryHandler","line":29,"confidence":0.57,"reason":"Contains 1 architectural actions relevant to business execution.","actionKinds":["mapping","external-call"],"evidencePaths":["NexusReader.Application/Queries/Library/SearchLibrarySemanticallyQuery.cs"]}],"typedContracts":[{"name":"SearchLibrarySemanticallyQuery","kind":"query","line":19,"fieldCount":3,"evidencePaths":["NexusReader.Application/Queries/Library/SearchLibrarySemanticallyQuery.cs"]},{"name":"SearchLibrarySemanticallyQueryHandler","kind":"model","line":22,"fieldCount":4,"evidencePaths":["NexusReader.Application/Queries/Library/SearchLibrarySemanticallyQuery.cs"]}],"persistenceInteractions":[{"methodName":"Handle","line":55,"kind":"persistence-read","detail":".Where(c => c.TenantId == request.TenantId && c.Embedding != null)","evidencePaths":["NexusReader.Application/Queries/Library/SearchLibrarySemanticallyQuery.cs"]}],"externalInteractions":[{"methodName":"SearchLibrarySemanticallyQueryHandler","line":37,"kind":"external-call","detail":"_retryPipeline = pipelineProvider.GetPipeline(\"ai-retry\") (external/library)","evidencePaths":["NexusReader.Application/Queries/Library/SearchLibrarySemanticallyQuery.cs"]},{"methodName":"Handle","line":50,"kind":"external-call","detail":"Calls IEmbeddingGenerator.GenerateAsync with the request.QueryText (external/AI service)","evidencePaths":["NexusReader.Application/Queries/Library/SearchLibrarySemanticallyQuery.cs"]}],"evidenceAnchors":[{"kind":"orchestration-method","label":"Handle","line":41,"summary":"Contains 4 architectural actions relevant to business execution.","confidence":0.98,"evidencePaths":["NexusReader.Application/Queries/Library/SearchLibrarySemanticallyQuery.cs","NexusReader.Data.Persistence/AppDbContext.cs"]},{"kind":"orchestration-method","label":"SearchLibrarySemanticallyQueryHandler","line":29,"summary":"Contains 1 architectural actions relevant to business execution.","confidence":0.57,"evidencePaths":["NexusReader.Application/Queries/Library/SearchLibrarySemanticallyQuery.cs"]},{"kind":"typed-contract","label":"SearchLibrarySemanticallyQuery","line":19,"summary":"query with 3 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Library/SearchLibrarySemanticallyQuery.cs"]},{"kind":"typed-contract","label":"SearchLibrarySemanticallyQueryHandler","line":22,"summary":"model with 4 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Library/SearchLibrarySemanticallyQuery.cs"]},{"kind":"persistence","label":"Handle","line":55,"summary":".Where(c => c.TenantId == request.TenantId && c.Embedding != null)","confidence":0.82,"evidencePaths":["NexusReader.Application/Queries/Library/SearchLibrarySemanticallyQuery.cs"]},{"kind":"external-call","label":"SearchLibrarySemanticallyQueryHandler","line":37,"summary":"_retryPipeline = pipelineProvider.GetPipeline(\"ai-retry\") (external/library)","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Library/SearchLibrarySemanticallyQuery.cs"]},{"kind":"external-call","label":"Handle","line":50,"summary":"Calls IEmbeddingGenerator.GenerateAsync with the request.QueryText (external/AI service)","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Library/SearchLibrarySemanticallyQuery.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__Queries__Quiz__QuizViewModels.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__Queries__Quiz__QuizViewModels.cs.json new file mode 100644 index 0000000..c343b82 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__Queries__Quiz__QuizViewModels.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/Queries/Quiz/QuizViewModels.cs","purpose":"Defines lightweight Data Transfer Objects (records) used by the Application layer to represent quizzes and quiz questions for queries and view models.","classification":{"role":"dto","layer":"application","confidence":0.9,"evidence":["DTO/view-model naming pattern","Namespace: NexusReader.Application.Queries.Quiz","File contains record types named QuizDto and QuizQuestionDto used for query/view-model purposes"]},"className":"","methods":[],"types":[{"name":"QuizQuestionDto","kind":"dto","line":3,"purpose":"Represents a single quiz question with its possible options and the index of the correct option.","fields":[{"name":"Question","type":"string","required":true,"line":3,"description":"The text of the question"},{"name":"Options","type":"List","required":true,"line":3,"description":"Possible answer options"},{"name":"CorrectIndex","type":"int","required":true,"line":3,"description":"Zero-based index of the correct option in Options"}]},{"name":"QuizDto","kind":"dto","line":4,"purpose":"Holds a collection of quiz questions to represent an entire quiz payload.","fields":[{"name":"Questions","type":"List","required":true,"line":4,"description":"List of quiz questions"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["DTO","Record"],"domainConcepts":["Quiz","Question","Options"],"keyDetails":"Very small file: only two immutable record DTOs used for query/view-model surface; no methods or external calls.","orchestrationMethods":[],"typedContracts":[{"name":"QuizQuestionDto","kind":"dto","line":3,"fieldCount":3,"evidencePaths":["NexusReader.Application/Queries/Quiz/QuizViewModels.cs"]},{"name":"QuizDto","kind":"dto","line":4,"fieldCount":1,"evidencePaths":["NexusReader.Application/Queries/Quiz/QuizViewModels.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"QuizQuestionDto","line":3,"summary":"dto with 3 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Quiz/QuizViewModels.cs"]},{"kind":"typed-contract","label":"QuizDto","line":4,"summary":"dto with 1 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Quiz/QuizViewModels.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__Queries__Reader__GetReaderPageQuery.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__Queries__Reader__GetReaderPageQuery.cs.json new file mode 100644 index 0000000..d0c0d3a --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__Queries__Reader__GetReaderPageQuery.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/Queries/Reader/GetReaderPageQuery.cs","purpose":"Defines a CQRS query record that models a request to retrieve a specific chapter/page of a user's ebook (ReaderPageViewModel) and carries tenant/user context.","classification":{"role":"handler","layer":"application","confidence":0.9,"evidence":["Query naming pattern","Namespace: NexusReader.Application.Queries.Reader","Record implements IQuery","File located under Application project area"]},"className":"GetReaderPageQuery","methods":[],"types":[{"name":"GetReaderPageQuery","kind":"query","line":11,"purpose":"Represents a request to fetch a reader page (chapter) for a specific ebook and user (tenant isolation).","fields":[{"name":"EbookId","type":"Guid","required":true,"line":12,"description":"Identifier of the ebook to read"},{"name":"ChapterIndex","type":"int","required":true,"line":13,"description":"Zero-based index of the chapter/page to retrieve (defaults to 0)"},{"name":"UserId","type":"string?","required":false,"line":14,"description":"Authenticated user's ID for tenant isolation (optional)"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Application.Abstractions.Messaging (using at line 1)","ReaderPageViewModel (referenced in generic IQuery<>; defined elsewhere)"],"patterns":["CQRS Query","Record DTO"],"domainConcepts":["Ebook","Chapter / ReaderPage","Tenant / User isolation"],"keyDetails":"Simple immutable record used as the application-layer query message type: GetReaderPageQuery(Guid EbookId, int ChapterIndex = 0, string? UserId = null) : IQuery (declared lines 11-14).","orchestrationMethods":[],"typedContracts":[{"name":"GetReaderPageQuery","kind":"query","line":11,"fieldCount":3,"evidencePaths":["NexusReader.Application/Queries/Reader/GetReaderPageQuery.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"GetReaderPageQuery","line":11,"summary":"query with 3 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Reader/GetReaderPageQuery.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__Queries__Reader__GetReaderPageQueryHandler.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__Queries__Reader__GetReaderPageQueryHandler.cs.json new file mode 100644 index 0000000..8a0a064 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__Queries__Reader__GetReaderPageQueryHandler.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/Queries/Reader/GetReaderPageQueryHandler.cs","purpose":"Handles GetReaderPageQuery requests by delegating to an EPUB reader service to produce a ReaderPageViewModel result.","classification":{"role":"handler","layer":"application","confidence":0.86,"evidence":["Namespace: NexusReader.Application.Queries.Reader","Implements IQueryHandler","Delegates to an injected IEpubReader service"]},"className":"GetReaderPageQueryHandler","methods":[{"name":"GetReaderPageQueryHandler","line":11,"endLine":14,"signature":"(epubReader: IEpubReader) -> void","purpose":"Constructs the handler and captures the IEpubReader dependency.","calls":[],"actions":[{"id":"assignment_13","kind":"mapping","label":"Assign DI dependency","line":13,"detail":"_epubReader = epubReader","visibility":"detail-only","confidence":0.7}]},{"name":"Handle","line":16,"endLine":19,"signature":"(request: GetReaderPageQuery, cancellationToken: CancellationToken) -> Task>","purpose":"Loads EPUB content for the requested ebook/chapter/user by delegating to IEpubReader.GetEpubContentAsync and returns the Result-wrapped ReaderPageViewModel.","calls":[{"targetFile":"NexusReader.Application.Abstractions.Services/IEpubReader.cs","targetMethod":"GetEpubContentAsync","callLine":18,"paramSummary":"request.EbookId, request.ChapterIndex, request.UserId, cancellationToken"}],"actions":[{"id":"external-call_18","kind":"external-call","label":"Delegates content loading","line":18,"detail":"Calls IEpubReader.GetEpubContentAsync and directly returns its Task>","visibility":"detail-only","confidence":0.7},{"id":"return_18","kind":"return","label":"Returns delegated Task result","line":18,"detail":"No local processing; returns the Task from the EPUB reader","visibility":"detail-only","confidence":0.7},{"id":"handle_return_18_0","kind":"return","label":"Returns result","line":18,"detail":"return _epubReader.GetEpubContentAsync(request.EbookId, request.ChapterIndex, request.UserId, cancellationToken);","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"GetReaderPageQueryHandler","kind":"model","line":7,"purpose":"Application handler that processes GetReaderPageQuery by calling the EPUB reader service.","fields":[{"name":"_epubReader","type":"IEpubReader","required":true,"line":9,"description":"Injected service used to load EPUB content"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Application.Abstractions.Messaging/IQueryHandler","NexusReader.Application.Abstractions.Services/IEpubReader","GetReaderPageQuery","ReaderPageViewModel","FluentResults/Result"],"patterns":["CQRS Handler","Dependency Injection","Adapter/Facade (delegation to service)"],"domainConcepts":["Ebook","Chapter","Reader session/content"],"keyDetails":"The handler performs no local business logic or validation; it directly returns the Task produced by IEpubReader.GetEpubContentAsync, making the EPUB reader the authority for content retrieval and error/result shaping.","orchestrationMethods":[{"name":"Handle","line":16,"confidence":0.65,"reason":"Contains 1 architectural actions relevant to business execution.","actionKinds":["external-call","return"],"evidencePaths":["NexusReader.Application/Queries/Reader/GetReaderPageQueryHandler.cs","NexusReader.Application.Abstractions.Services/IEpubReader.cs"]}],"typedContracts":[{"name":"GetReaderPageQueryHandler","kind":"model","line":7,"fieldCount":1,"evidencePaths":["NexusReader.Application/Queries/Reader/GetReaderPageQueryHandler.cs"]}],"persistenceInteractions":[],"externalInteractions":[{"methodName":"Handle","line":18,"kind":"external-call","detail":"Calls IEpubReader.GetEpubContentAsync and directly returns its Task>","evidencePaths":["NexusReader.Application/Queries/Reader/GetReaderPageQueryHandler.cs"]}],"evidenceAnchors":[{"kind":"orchestration-method","label":"Handle","line":16,"summary":"Contains 1 architectural actions relevant to business execution.","confidence":0.65,"evidencePaths":["NexusReader.Application/Queries/Reader/GetReaderPageQueryHandler.cs","NexusReader.Application.Abstractions.Services/IEpubReader.cs"]},{"kind":"typed-contract","label":"GetReaderPageQueryHandler","line":7,"summary":"model with 1 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Reader/GetReaderPageQueryHandler.cs"]},{"kind":"external-call","label":"Handle","line":18,"summary":"Calls IEpubReader.GetEpubContentAsync and directly returns its Task>","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Reader/GetReaderPageQueryHandler.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__Queries__Reader__LocalEpubMetadata.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__Queries__Reader__LocalEpubMetadata.cs.json new file mode 100644 index 0000000..9a15733 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__Queries__Reader__LocalEpubMetadata.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/Queries/Reader/LocalEpubMetadata.cs","purpose":"Defines a simple data-transfer record that carries metadata extracted from a local EPUB file (title, author, cover image, description) for use by application query handlers.","classification":{"role":"dto","layer":"application","confidence":0.86,"evidence":["Namespace: NexusReader.Application.Queries.Reader","File declares a record named LocalEpubMetadata used to carry EPUB metadata"]},"className":"LocalEpubMetadata","methods":[],"types":[{"name":"LocalEpubMetadata","kind":"dto","line":6,"purpose":"Holds extracted metadata from a local EPUB for query/transfer purposes.","fields":[{"name":"Title","type":"string","required":true,"line":11,"description":"The title of the book; non-nullable with default empty string."},{"name":"Author","type":"string","required":true,"line":16,"description":"The author(s) of the book; non-nullable with default empty string."},{"name":"CoverImage","type":"byte[]?","required":false,"line":21,"description":"Raw bytes of the cover image if available; nullable."},{"name":"Description","type":"string?","required":false,"line":26,"description":"Description or summary of the book; nullable."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["DTO","Record"],"domainConcepts":["Epub","Book","Metadata"],"keyDetails":"Pure data holder (record) with no runtime behavior; used in Application.Queries.Reader to transport EPUB metadata between components.","orchestrationMethods":[],"typedContracts":[{"name":"LocalEpubMetadata","kind":"dto","line":6,"fieldCount":4,"evidencePaths":["NexusReader.Application/Queries/Reader/LocalEpubMetadata.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"LocalEpubMetadata","line":6,"summary":"dto with 4 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Reader/LocalEpubMetadata.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__Queries__Reader__ViewModels.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__Queries__Reader__ViewModels.cs.json new file mode 100644 index 0000000..cc14393 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__Queries__Reader__ViewModels.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/Queries/Reader/ViewModels.cs","purpose":"Defines application-level view models for the reader UI, including a polymorphic ContentBlock hierarchy (text and AI-trigger blocks) and a ReaderPageViewModel used by reader queries.","classification":{"role":"dto","layer":"application","confidence":0.9,"evidence":["DTO/view-model naming pattern","namespace NexusReader.Application.Queries.Reader","records named *ViewModel and ContentBlock used to carry UI/query data","JsonDerivedType attributes declare polymorphic JSON serialization for ContentBlock"]},"className":"","methods":[],"types":[{"name":"ContentBlock","kind":"model","line":7,"purpose":"Abstract base record for polymorphic content blocks shown on a reader page (polymorphic JSON root).","fields":[{"name":"Id","type":"string","required":true,"line":7,"description":"Identifier for the content block"}]},{"name":"TextSegmentBlock","kind":"model","line":8,"purpose":"Concrete ContentBlock carrying a text segment to render.","fields":[{"name":"Id","type":"string","required":true,"line":8,"description":"Inherited block identifier"},{"name":"Content","type":"string","required":true,"line":8,"description":"Text payload for the segment"}]},{"name":"AiActionTriggerBlock","kind":"model","line":9,"purpose":"Concrete ContentBlock representing an AI-driven action trigger with dialog and selectable options.","fields":[{"name":"Id","type":"string","required":true,"line":9,"description":"Inherited block identifier"},{"name":"Dialogue","type":"string","required":true,"line":9,"description":"Prompt or dialogue text presented to the user"},{"name":"ActionOptions","type":"List","required":true,"line":9,"description":"List of selectable action identifiers or labels"}]},{"name":"ReaderPageViewModel","kind":"view-model","line":11,"purpose":"View model for a reader page, aggregating content blocks and chapter/eBook context used by queries and UI.","fields":[{"name":"Blocks","type":"List","required":true,"line":11,"description":"Ordered list of polymorphic content blocks to render on the page"},{"name":"CurrentChapterIndex","type":"int","required":true,"line":11,"description":"Zero-based index of the current chapter"},{"name":"TotalChapters","type":"int","required":true,"line":11,"description":"Total number of chapters in the eBook"},{"name":"ChapterTitle","type":"string","required":true,"line":11,"description":"Title of the current chapter"},{"name":"EbookId","type":"Guid","required":false,"line":11,"description":"Optional eBook identifier (defaults to Guid.Empty)"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["System.Text.Json.Serialization"],"patterns":["Polymorphic DTO","View Model","Record Types"],"domainConcepts":["ContentBlock","ReaderPage","Ebook","Chapter","AI Action"],"keyDetails":"Uses JsonDerivedType attributes (lines 5-6) to register two discriminators: \"text\" -> TextSegmentBlock and \"trigger\" -> AiActionTriggerBlock for System.Text.Json polymorphic serialization. File contains only immutable record types (no methods).","orchestrationMethods":[],"typedContracts":[{"name":"ContentBlock","kind":"model","line":7,"fieldCount":1,"evidencePaths":["NexusReader.Application/Queries/Reader/ViewModels.cs"]},{"name":"TextSegmentBlock","kind":"model","line":8,"fieldCount":2,"evidencePaths":["NexusReader.Application/Queries/Reader/ViewModels.cs"]},{"name":"AiActionTriggerBlock","kind":"model","line":9,"fieldCount":3,"evidencePaths":["NexusReader.Application/Queries/Reader/ViewModels.cs"]},{"name":"ReaderPageViewModel","kind":"view-model","line":11,"fieldCount":5,"evidencePaths":["NexusReader.Application/Queries/Reader/ViewModels.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"ContentBlock","line":7,"summary":"model with 1 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Reader/ViewModels.cs"]},{"kind":"typed-contract","label":"TextSegmentBlock","line":8,"summary":"model with 2 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Reader/ViewModels.cs"]},{"kind":"typed-contract","label":"AiActionTriggerBlock","line":9,"summary":"model with 3 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Reader/ViewModels.cs"]},{"kind":"typed-contract","label":"ReaderPageViewModel","line":11,"summary":"view-model with 5 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Reader/ViewModels.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__Queries__System__GetInitializationStatusQuery.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__Queries__System__GetInitializationStatusQuery.cs.json new file mode 100644 index 0000000..c12ee44 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__Queries__System__GetInitializationStatusQuery.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/Queries/System/GetInitializationStatusQuery.cs","purpose":"Defines a CQRS query message used to request the application's initialization status (returns a string).","classification":{"role":"handler","layer":"application","confidence":0.9,"evidence":["Query naming pattern","Namespace: NexusReader.Application.Queries.System","Type implements IQuery from the messaging abstractions","File placed under Application/Queries/System (query/command pattern)"]},"className":"GetInitializationStatusQuery","methods":[],"types":[{"name":"GetInitializationStatusQuery","kind":"query","line":5,"purpose":"Marker/query DTO representing a request to get the initialization status as a string.","fields":[]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Application.Abstractions.Messaging"],"patterns":["CQRS (Query object)"],"domainConcepts":["InitializationStatus"],"keyDetails":"A lightweight record with no payload used as a request message (IQuery) to fetch initialization status; runtime behavior implemented by a separate query handler elsewhere.","orchestrationMethods":[],"typedContracts":[{"name":"GetInitializationStatusQuery","kind":"query","line":5,"fieldCount":0,"evidencePaths":["NexusReader.Application/Queries/System/GetInitializationStatusQuery.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"GetInitializationStatusQuery","line":5,"summary":"query with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/System/GetInitializationStatusQuery.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__Queries__System__GetInitializationStatusQueryHandler.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__Queries__System__GetInitializationStatusQueryHandler.cs.json new file mode 100644 index 0000000..3aaa8bc --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__Queries__System__GetInitializationStatusQueryHandler.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/Queries/System/GetInitializationStatusQueryHandler.cs","purpose":"Query handler that answers whether the Nexus E-Reader application is initialized; returns a constant success message.","classification":{"role":"handler","layer":"application","confidence":0.85,"evidence":["Namespace: NexusReader.Application.Queries.System","Class implements IQueryHandler","Single Handle method returning a fixed initialization status message"]},"className":"GetInitializationStatusQueryHandler","methods":[{"name":"Handle","line":8,"endLine":11,"signature":"(request: GetInitializationStatusQuery, cancellationToken: CancellationToken) -> Task>","purpose":"Handles the GetInitializationStatusQuery by returning a constant success message indicating the application is initialized.","calls":[],"actions":[{"id":"return_10","kind":"return","label":"Returns constant initialization message","line":10,"detail":"Task.FromResult(Result.Ok(\"Nexus E-Reader Application is fully initialized and operational.\"))","visibility":"detail-only","confidence":0.7},{"id":"handle_return_10_0","kind":"return","label":"Returns result","line":10,"detail":"return Task.FromResult(Result.Ok(\"Nexus E-Reader Application is fully initialized and operational.\"));","visibility":"detail-only","confidence":0.7},{"id":"constant-response_10","kind":"mapping","label":"Static successful result","line":10,"detail":"Always returns Result.Ok with a fixed string; no branching or external calls.","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"GetInitializationStatusQueryHandler","kind":"model","line":6,"purpose":"Query handler type implementing IQueryHandler to provide initialization status.","fields":[{"name":"class-modifiers","type":"internal sealed","required":true,"line":6,"description":"Class is internal and sealed; no instance state or constructor logic present."},{"name":"implemented-interface","type":"IQueryHandler","required":true,"line":6,"description":"Indicates this class handles the GetInitializationStatusQuery via the application's messaging abstraction."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Application.Abstractions.Messaging","FluentResults"],"patterns":["Query Handler","Mediator"],"domainConcepts":["InitializationStatus","Application health / readiness"],"keyDetails":"Single-responsibility handler that always returns a fixed ready message; no external calls, no branching, suitable as a simple health/readiness query endpoint.","orchestrationMethods":[],"typedContracts":[{"name":"GetInitializationStatusQueryHandler","kind":"model","line":6,"fieldCount":2,"evidencePaths":["NexusReader.Application/Queries/System/GetInitializationStatusQueryHandler.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"GetInitializationStatusQueryHandler","line":6,"summary":"model with 2 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/System/GetInitializationStatusQueryHandler.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__Queries__User__GetUserProfileQuery.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__Queries__User__GetUserProfileQuery.cs.json new file mode 100644 index 0000000..5a9a7ee --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__Queries__User__GetUserProfileQuery.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/Queries/User/GetUserProfileQuery.cs","purpose":"Defines a MediatR query message representing a request to retrieve a user's profile (returns a FluentResults Result wrapping a UserProfileDto).","classification":{"role":"handler","layer":"application","confidence":0.9,"evidence":["Command pattern","Line 7: record implements MediatR IRequest>","Namespace: NexusReader.Application.Queries.User indicates an application-layer query object"]},"className":"GetUserProfileQuery","methods":[],"types":[{"name":"GetUserProfileQuery","kind":"query","line":7,"purpose":"CQRS query message carrying the user identifier to request a UserProfileDto wrapped in a FluentResults Result.","fields":[{"name":"UserId","type":"string","required":true,"line":7,"description":"Identifier of the user whose profile is being requested"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Application.DTOs.User (UserProfileDto)","MediatR","FluentResults"],"patterns":["CQRS Query","MediatR Request/Response Message"],"domainConcepts":["User","UserProfile"],"keyDetails":"Single-line record type (line 7) implementing IRequest>; no runtime logic here — a simple message/DTO used by a handler elsewhere.","orchestrationMethods":[],"typedContracts":[{"name":"GetUserProfileQuery","kind":"query","line":7,"fieldCount":1,"evidencePaths":["NexusReader.Application/Queries/User/GetUserProfileQuery.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"GetUserProfileQuery","line":7,"summary":"query with 1 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/User/GetUserProfileQuery.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__Queries__User__GetUserProfileQueryHandler.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__Queries__User__GetUserProfileQueryHandler.cs.json new file mode 100644 index 0000000..4b14177 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__Queries__User__GetUserProfileQueryHandler.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/Queries/User/GetUserProfileQueryHandler.cs","purpose":"MediatR query handler that reads a user's profile from the EF Core database, projects it into a UserProfileDto with computed fields (average quiz score, last read book, roles, subscription plan), and returns a FluentResults Result with success or failure.","classification":{"role":"handler","layer":"application","confidence":0.9,"evidence":["Implements MediatR IRequestHandler> (line 9)","Uses IDbContextFactory to create DbContext and issues EF Core queries against Users / UserRoles / Roles (lines 11, 20-58)"]},"className":"GetUserProfileQueryHandler","methods":[{"name":"GetUserProfileQueryHandler","line":13,"endLine":16,"signature":"(dbContextFactory: IDbContextFactory) -> void","purpose":"Constructor that captures the injected IDbContextFactory for creating AppDbContext instances.","calls":[],"actions":[{"id":"assign_15","kind":"mapping","label":"Stores injected DB context factory","line":15,"detail":"_dbContextFactory = dbContextFactory","visibility":"detail-only","confidence":0.7}]},{"name":"Handle","line":18,"endLine":66,"signature":"(request: GetUserProfileQuery, cancellationToken: CancellationToken) -> Task>","purpose":"Creates a DbContext, queries and projects a user record (including computed/related data) into UserProfileDto and returns Result.Ok(profile) or Result.Fail if not found.","calls":[],"actions":[{"id":"resource-acquire_20","kind":"mapping","label":"Create and scope DbContext","line":20,"detail":"using var dbContext = await _dbContextFactory.CreateDbContextAsync(cancellationToken)","visibility":"detail-only","confidence":0.7},{"id":"query_21","kind":"mapping","label":"Project user to UserProfileDto with related data","line":21,"detail":"dbContext.Users.Where(u => u.Id == request.UserId).Select(...) then FirstOrDefaultAsync","visibility":"detail-only","confidence":0.7},{"id":"handle_repository-read_22_0","kind":"repository-read","label":"Reads repository or persistence state","line":22,"detail":".Where(u => u.Id == request.UserId)","visibility":"secondary-visible","confidence":0.86},{"id":"mapping_23","kind":"mapping","label":"Map scalar and related fields to DTO","line":23,"detail":"Email, AITokensUsed, SubscriptionPlan -> SubscriptionPlanDto, LastReadBook -> LastReadBookDto, Roles array","visibility":"detail-only","confidence":0.7},{"id":"handle_mapping_23_1","kind":"mapping","label":"Maps data or transforms shape","line":23,"detail":".Select(u => new UserProfileDto","visibility":"detail-only","confidence":0.74},{"id":"branch_27","kind":"branch","label":"Compute TenantId safe parse","line":27,"detail":"If string length 36 -> new Guid(u.TenantId) else Guid.Empty","conditionSummary":"u.TenantId != null && u.TenantId.Length == 36","outcomeLabels":["parse to Guid","Guid.Empty"],"visibility":"detail-only","confidence":0.7},{"id":"branch_35","kind":"branch","label":"Compute AverageQuizScore with guard","line":35,"detail":"If any quiz has TotalQuestions>0, average (Score/TotalQuestions*100) cast to int, else 0","conditionSummary":"u.QuizResults.Any(q => q.TotalQuestions > 0)","outcomeLabels":["compute average percentage","0"],"visibility":"detail-only","confidence":0.7},{"id":"handle_repository-read_36_2","kind":"repository-read","label":"Reads repository or persistence state","line":36,"detail":"? (int)u.QuizResults.Where(q => q.TotalQuestions > 0).Average(q => (double)q.Score / q.TotalQuestions * 100)","visibility":"secondary-visible","confidence":0.86},{"id":"handle_mapping_38_3","kind":"mapping","label":"Maps data or transforms shape","line":38,"detail":"LastReadBook = u.Ebooks.OrderByDescending(e => e.LastReadDate).Select(e => new LastReadBookDto","visibility":"detail-only","confidence":0.74},{"id":"loop/ordering_38","kind":"mapping","label":"Select last read ebook","line":38,"detail":"Order ebooks by LastReadDate desc, project to LastReadBookDto, take FirstOrDefault","visibility":"detail-only","confidence":0.7},{"id":"handle_repository-read_52_4","kind":"repository-read","label":"Reads repository or persistence state","line":52,"detail":"}).FirstOrDefault(),","visibility":"secondary-visible","confidence":0.86},{"id":"join_53","kind":"mapping","label":"Resolve role names via join of UserRoles and Roles","line":53,"detail":"dbContext.UserRoles.Where(ur => ur.UserId == u.Id).Join(dbContext.Roles, ...).ToArray()","visibility":"detail-only","confidence":0.7},{"id":"handle_repository-read_54_5","kind":"repository-read","label":"Reads repository or persistence state","line":54,"detail":".Where(ur => ur.UserId == u.Id)","visibility":"secondary-visible","confidence":0.86},{"id":"handle_branch_60_6","kind":"branch","label":"Evaluates branch condition","line":60,"detail":"if (profile == null)","conditionSummary":"profile == null","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"guard-clause_60","kind":"guard-clause","label":"Return failure when profile missing","line":60,"detail":"if (profile == null) return Result.Fail(\"Profile not found.\")","conditionSummary":"profile == null","outcomeLabels":["invalid (Result.Fail)","continue"],"visibility":"detail-only","confidence":0.7},{"id":"handle_return_62_7","kind":"return","label":"Returns result","line":62,"detail":"return Result.Fail(\"Profile not found.\");","visibility":"detail-only","confidence":0.7},{"id":"return_65","kind":"return","label":"Return successful result with DTO","line":65,"detail":"return Result.Ok(profile)","visibility":"detail-only","confidence":0.7},{"id":"handle_return_65_8","kind":"return","label":"Returns result","line":65,"detail":"return Result.Ok(profile);","visibility":"detail-only","confidence":0.7}]}],"types":[],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Data.Persistence (AppDbContext)","NexusReader.Application.DTOs.User (UserProfileDto, SubscriptionPlanDto, LastReadBookDto, AuthorDto)","MediatR","FluentResults","Microsoft.EntityFrameworkCore"],"patterns":["Mediator / IRequestHandler","EF Core projection (DTO mapping)","Query Handler"],"domainConcepts":["User","SubscriptionPlan","QuizResults","Ebooks / LastReadBook","Roles","TenantId"],"keyDetails":"This handler projects a rich UserProfileDto in a single EF Core query: it safely parses TenantId to Guid, computes average quiz score only when questions exist, selects the most-recently read ebook with nested Author mapping and default strings, resolves roles via a join, disposes DbContext via 'using', and returns FluentResults.Ok or Fail.","orchestrationMethods":[{"name":"Handle","line":18,"confidence":0.98,"reason":"Contains 7 architectural actions relevant to business execution.","actionKinds":["mapping","repository-read","branch","guard-clause","return"],"evidencePaths":["NexusReader.Application/Queries/User/GetUserProfileQueryHandler.cs"]}],"typedContracts":[],"persistenceInteractions":[{"methodName":"Handle","line":22,"kind":"persistence-read","detail":".Where(u => u.Id == request.UserId)","evidencePaths":["NexusReader.Application/Queries/User/GetUserProfileQueryHandler.cs"]},{"methodName":"Handle","line":36,"kind":"persistence-read","detail":"? (int)u.QuizResults.Where(q => q.TotalQuestions > 0).Average(q => (double)q.Score / q.TotalQuestions * 100)","evidencePaths":["NexusReader.Application/Queries/User/GetUserProfileQueryHandler.cs"]},{"methodName":"Handle","line":52,"kind":"persistence-read","detail":"}).FirstOrDefault(),","evidencePaths":["NexusReader.Application/Queries/User/GetUserProfileQueryHandler.cs"]},{"methodName":"Handle","line":54,"kind":"persistence-read","detail":".Where(ur => ur.UserId == u.Id)","evidencePaths":["NexusReader.Application/Queries/User/GetUserProfileQueryHandler.cs"]}],"externalInteractions":[],"evidenceAnchors":[{"kind":"orchestration-method","label":"Handle","line":18,"summary":"Contains 7 architectural actions relevant to business execution.","confidence":0.98,"evidencePaths":["NexusReader.Application/Queries/User/GetUserProfileQueryHandler.cs"]},{"kind":"persistence","label":"Handle","line":22,"summary":".Where(u => u.Id == request.UserId)","confidence":0.82,"evidencePaths":["NexusReader.Application/Queries/User/GetUserProfileQueryHandler.cs"]},{"kind":"persistence","label":"Handle","line":36,"summary":"? (int)u.QuizResults.Where(q => q.TotalQuestions > 0).Average(q => (double)q.Score / q.TotalQuestions * 100)","confidence":0.82,"evidencePaths":["NexusReader.Application/Queries/User/GetUserProfileQueryHandler.cs"]},{"kind":"persistence","label":"Handle","line":52,"summary":"}).FirstOrDefault(),","confidence":0.82,"evidencePaths":["NexusReader.Application/Queries/User/GetUserProfileQueryHandler.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__Security__Authorization__ProUserHandler.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__Security__Authorization__ProUserHandler.cs.json new file mode 100644 index 0000000..7048598 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__Security__Authorization__ProUserHandler.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/Security/Authorization/ProUserHandler.cs","purpose":"Authorization handler that enforces 'Pro' user access by checking a user's subscription plan and AI token usage in the application database.","classification":{"role":"handler","layer":"application","confidence":0.8,"evidence":["Class ProUserHandler inherits AuthorizationHandler","Namespace NexusReader.Application.Security.Authorization","Performs authorization checks against AppDbContext (data access)"]},"className":"ProUserHandler","methods":[{"name":"ProUserHandler","line":15,"endLine":18,"signature":"(dbContextFactory: IDbContextFactory) -> void","purpose":"Constructs the handler and stores a DbContext factory for later DB access.","calls":[],"actions":[{"id":"assignment_17","kind":"mapping","label":"Store DbContextFactory","line":17,"detail":"_dbContextFactory = dbContextFactory","visibility":"detail-only","confidence":0.7}]},{"name":"HandleRequirementAsync","line":20,"endLine":53,"signature":"(context: AuthorizationHandlerContext, requirement: ProUserRequirement) -> Task","purpose":"Evaluates if the current user satisfies the ProUserRequirement by reading user subscription and token counters from the DB and marks the requirement succeeded when rules match.","calls":[{"targetFile":"NexusReader.Data.Persistence","targetMethod":"AppDbContext.Users.FirstOrDefaultAsync (includes SubscriptionPlan)","callLine":31,"paramSummary":"predicate: u => u.Id == userId; Include(u => u.SubscriptionPlan)"}],"actions":[{"id":"guard-clause_24","kind":"guard-clause","label":"Missing user id","line":24,"detail":"if (string.IsNullOrEmpty(userId)) return;","conditionSummary":"userId is null or empty","outcomeLabels":["return (no auth decision)"],"visibility":"detail-only","confidence":0.7},{"id":"handlerequirementasync_repository-read_24_0","kind":"repository-read","label":"Reads repository or persistence state","line":24,"detail":"var userId = context.User.FindFirstValue(ClaimTypes.NameIdentifier);","visibility":"secondary-visible","confidence":0.86},{"id":"handlerequirementasync_branch_25_1","kind":"branch","label":"Evaluates branch condition","line":25,"detail":"if (string.IsNullOrEmpty(userId))","conditionSummary":"string.IsNullOrEmpty(userId)","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"handlerequirementasync_return_27_2","kind":"return","label":"Returns result","line":27,"detail":"return;","visibility":"detail-only","confidence":0.7},{"id":"persistence-read_30","kind":"mapping","label":"Load user with subscription","line":30,"detail":"using var db = _dbContextFactory.CreateDbContext(); query Users.Include(SubscriptionPlan).FirstOrDefaultAsync(u => u.Id == userId)","visibility":"detail-only","confidence":0.7},{"id":"handlerequirementasync_branch_35_3","kind":"branch","label":"Evaluates branch condition","line":35,"detail":"if (user == null)","conditionSummary":"user == null","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"guard-clause_35","kind":"guard-clause","label":"User not found","line":35,"detail":"if (user == null) return;","conditionSummary":"user == null","outcomeLabels":["return (no auth decision)"],"visibility":"detail-only","confidence":0.7},{"id":"handlerequirementasync_return_37_4","kind":"return","label":"Returns result","line":37,"detail":"return;","visibility":"detail-only","confidence":0.7},{"id":"branch_40","kind":"branch","label":"Unlimited subscription rule","line":40,"detail":"if true: context.Succeed(requirement); return;","conditionSummary":"user.SubscriptionPlan?.IsUnlimitedTokens == true","outcomeLabels":["succeed requirement","continue"],"visibility":"detail-only","confidence":0.7},{"id":"handlerequirementasync_branch_41_5","kind":"branch","label":"Evaluates branch condition","line":41,"detail":"if (user.SubscriptionPlan?.IsUnlimitedTokens == true)","conditionSummary":"user.SubscriptionPlan?.IsUnlimitedTokens == true","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"action_43","kind":"mapping","label":"Mark requirement satisfied","line":43,"detail":"context.Succeed(requirement) (also at line 50)","visibility":"detail-only","confidence":0.7},{"id":"handlerequirementasync_repository-read_43_6","kind":"repository-read","label":"Reads repository or persistence state","line":43,"detail":"context.Succeed(requirement);","visibility":"secondary-visible","confidence":0.86},{"id":"handlerequirementasync_return_44_7","kind":"return","label":"Returns result","line":44,"detail":"return;","visibility":"detail-only","confidence":0.7},{"id":"branch_47","kind":"branch","label":"Token limit rule (SaaS)","line":47,"detail":"if true: context.Succeed(requirement); return;","conditionSummary":"user.AITokensUsed < user.AITokenLimit","outcomeLabels":["succeed requirement","deny/continue"],"visibility":"detail-only","confidence":0.7},{"id":"handlerequirementasync_branch_48_8","kind":"branch","label":"Evaluates branch condition","line":48,"detail":"if (user.AITokensUsed < user.AITokenLimit)","conditionSummary":"user.AITokensUsed < user.AITokenLimit","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"handlerequirementasync_repository-read_50_9","kind":"repository-read","label":"Reads repository or persistence state","line":50,"detail":"context.Succeed(requirement);","visibility":"secondary-visible","confidence":0.86},{"id":"handlerequirementasync_return_51_10","kind":"return","label":"Returns result","line":51,"detail":"return;","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"ProUserHandler","kind":"model","line":11,"purpose":"Authorization handler class that enforces Pro user rules using DB-backed state.","fields":[{"name":"_dbContextFactory","type":"IDbContextFactory","required":true,"line":13,"description":"Factory to create AppDbContext instances for reading user/subscription data"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Data.Persistence","NexusReader.Domain.Entities"],"patterns":["Authorization Handler","DB-backed authorization"],"domainConcepts":["User","SubscriptionPlan","AI tokens (AITokensUsed, AITokenLimit)"],"keyDetails":"Enforces two rules: unlimited-subscription bypass and per-user token limit; reads User and SubscriptionPlan from AppDbContext and calls context.Succeed(requirement) on positive checks.","orchestrationMethods":[{"name":"HandleRequirementAsync","line":20,"confidence":0.98,"reason":"Contains 9 architectural actions relevant to business execution.","actionKinds":["guard-clause","repository-read","branch","return","mapping"],"evidencePaths":["NexusReader.Application/Security/Authorization/ProUserHandler.cs","NexusReader.Data.Persistence"]}],"typedContracts":[{"name":"ProUserHandler","kind":"model","line":11,"fieldCount":1,"evidencePaths":["NexusReader.Application/Security/Authorization/ProUserHandler.cs"]}],"persistenceInteractions":[{"methodName":"HandleRequirementAsync","line":24,"kind":"persistence-read","detail":"var userId = context.User.FindFirstValue(ClaimTypes.NameIdentifier);","evidencePaths":["NexusReader.Application/Security/Authorization/ProUserHandler.cs"]},{"methodName":"HandleRequirementAsync","line":43,"kind":"persistence-read","detail":"context.Succeed(requirement);","evidencePaths":["NexusReader.Application/Security/Authorization/ProUserHandler.cs"]},{"methodName":"HandleRequirementAsync","line":50,"kind":"persistence-read","detail":"context.Succeed(requirement);","evidencePaths":["NexusReader.Application/Security/Authorization/ProUserHandler.cs"]}],"externalInteractions":[],"evidenceAnchors":[{"kind":"orchestration-method","label":"HandleRequirementAsync","line":20,"summary":"Contains 9 architectural actions relevant to business execution.","confidence":0.98,"evidencePaths":["NexusReader.Application/Security/Authorization/ProUserHandler.cs","NexusReader.Data.Persistence"]},{"kind":"typed-contract","label":"ProUserHandler","line":11,"summary":"model with 1 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Security/Authorization/ProUserHandler.cs"]},{"kind":"persistence","label":"HandleRequirementAsync","line":24,"summary":"var userId = context.User.FindFirstValue(ClaimTypes.NameIdentifier);","confidence":0.82,"evidencePaths":["NexusReader.Application/Security/Authorization/ProUserHandler.cs"]},{"kind":"persistence","label":"HandleRequirementAsync","line":43,"summary":"context.Succeed(requirement);","confidence":0.82,"evidencePaths":["NexusReader.Application/Security/Authorization/ProUserHandler.cs"]},{"kind":"persistence","label":"HandleRequirementAsync","line":50,"summary":"context.Succeed(requirement);","confidence":0.82,"evidencePaths":["NexusReader.Application/Security/Authorization/ProUserHandler.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Application__Security__Authorization__ProUserRequirement.cs.json b/src/.documentation/cache/summaries/NexusReader.Application__Security__Authorization__ProUserRequirement.cs.json new file mode 100644 index 0000000..f2ab824 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Application__Security__Authorization__ProUserRequirement.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Application/Security/Authorization/ProUserRequirement.cs","purpose":"Defines a marker authorization requirement representing users with an active Pro subscription or sufficient AI tokens for policy-based authorization checks.","classification":{"role":"unknown","layer":"application","confidence":0.65,"evidence":["Namespace NexusReader.Application.Security.Authorization indicates application-layer auth policy code","Implements Microsoft.AspNetCore.Authorization.IAuthorizationRequirement which is used by ASP.NET Core authorization handlers/policies"]},"className":"ProUserRequirement","methods":[],"types":[{"name":"ProUserRequirement","kind":"model","line":8,"purpose":"Marker requirement type used in authorization policies to represent Pro users or users with sufficient AI tokens.","fields":[]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["Microsoft.AspNetCore.Authorization"],"patterns":["Authorization Requirement","Policy-based Authorization"],"domainConcepts":["Pro subscription","AI tokens","Authorization policy"],"keyDetails":"Empty marker class implementing IAuthorizationRequirement (lines 8–10); actual authorization logic is expected in corresponding AuthorizationHandler(s) elsewhere.","orchestrationMethods":[],"typedContracts":[{"name":"ProUserRequirement","kind":"model","line":8,"fieldCount":0,"evidencePaths":["NexusReader.Application/Security/Authorization/ProUserRequirement.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"ProUserRequirement","line":8,"summary":"model with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Security/Authorization/ProUserRequirement.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260428184727_InitialPostgres.Designer.cs.json b/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260428184727_InitialPostgres.Designer.cs.json new file mode 100644 index 0000000..2d79f62 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260428184727_InitialPostgres.Designer.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Data/Migrations/20260428184727_InitialPostgres.Designer.cs","purpose":"EF Core auto-generated migration designer that describes the target EF Core model for the InitialPostgres migration (table/column/index/relationship configuration for Postgres).","classification":{"role":"database-config","layer":"data","confidence":0.9,"evidence":["Class decorated with [Migration(\"20260428184727_InitialPostgres\")] and [DbContext(typeof(AppDbContext))]","Contains BuildTargetModel(ModelBuilder) which configures entities, keys, indexes, tables and relationships"]},"className":"InitialPostgres","methods":[{"name":"BuildTargetModel","line":19,"endLine":375,"signature":"(modelBuilder: ModelBuilder) -> void","purpose":"Populate the ModelBuilder with entity types, properties, keys, indexes, table mappings and relationships that represent the target schema for the InitialPostgres migration.","calls":[],"actions":[{"id":"annotation_22","kind":"mapping","label":"Model annotations","line":22,"detail":"Sets ProductVersion and Relational:MaxIdentifierLength annotations on modelBuilder (lines 22-24).","visibility":"detail-only","confidence":0.7},{"id":"extension-call_26","kind":"mapping","label":"Use Postgres identity columns default","line":26,"detail":"Calls NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder) to configure identity column behavior for Postgres.","visibility":"detail-only","confidence":0.7},{"id":"entity-config_28","kind":"mapping","label":"Configure IdentityRole table","line":28,"detail":"Defines AspNetRoles table mapping, properties (Id, ConcurrencyStamp, Name, NormalizedName), unique index on NormalizedName, and primary key.","visibility":"detail-only","confidence":0.7},{"id":"entity-config_54","kind":"mapping","label":"Configure IdentityRoleClaim table","line":54,"detail":"Defines AspNetRoleClaims with integer Id (ValueGeneratedOnAdd + Postgres identity), RoleId FK, properties ClaimType/ClaimValue, index on RoleId.","visibility":"detail-only","confidence":0.7},{"id":"entity-config_79","kind":"mapping","label":"Configure IdentityUserClaim table","line":79,"detail":"Defines AspNetUserClaims with integer Id (ValueGeneratedOnAdd + Postgres identity), UserId FK, ClaimType/ClaimValue, index on UserId.","visibility":"detail-only","confidence":0.7},{"id":"entity-config_104","kind":"mapping","label":"Configure IdentityUserLogin table","line":104,"detail":"Defines AspNetUserLogins with composite PK (LoginProvider, ProviderKey), UserId FK, ProviderDisplayName, index on UserId.","visibility":"detail-only","confidence":0.7},{"id":"entity-config_126","kind":"mapping","label":"Configure IdentityUserRole table","line":126,"detail":"Defines AspNetUserRoles join table with composite PK (UserId, RoleId), index on RoleId and relationships to users and roles.","visibility":"detail-only","confidence":0.7},{"id":"entity-config_141","kind":"mapping","label":"Configure IdentityUserToken table","line":141,"detail":"Defines AspNetUserTokens with composite PK (UserId, LoginProvider, Name) and Value property.","visibility":"detail-only","confidence":0.7},{"id":"entity-config_160","kind":"mapping","label":"Configure Ebook entity","line":160,"detail":"Defines Ebooks table with properties: Id (Guid, ValueGeneratedOnAdd), AddedDate, Author (required, max 255), CoverUrl, FilePath (required), LastReadDate (nullable), Title (required, max 255), UserId (required); primary key on Id; index on UserId; relationship HasOne User -> NexusUser with cascade delete and navigation configured (lines 160-198 and 359-368).","visibility":"detail-only","confidence":0.7},{"id":"entity-config_200","kind":"mapping","label":"Configure NexusUser (AspNetUsers) entity","line":200,"detail":"Defines AspNetUsers table (NexusUser) with many identity and custom properties (Id, AITokenLimit, AITokensUsed, CurrentPlan required, TenantId, etc.), indexes on NormalizedEmail and unique NormalizedUserName (lines 200-275); navigation Ebooks configured (lines 370-373).","visibility":"detail-only","confidence":0.7},{"id":"entity-config_277","kind":"mapping","label":"Configure SemanticKnowledgeCache entity","line":277,"detail":"Defines SemanticKnowledgeCache table with ContentHash (PK, max 64), CreatedAt, JsonData (required), ModelId (required, max 50), PromptVersion (required, max 10); unique index on ContentHash (lines 277-306).","visibility":"detail-only","confidence":0.7},{"id":"relationship_308","kind":"mapping","label":"Identity relationships and cascade deletes","line":308,"detail":"Configures Identity role/claim/user relationships using HasOne/WithMany/HasForeignKey with OnDelete(DeleteBehavior.Cascade) for multiple identity tables (lines 308-357).","visibility":"detail-only","confidence":0.7},{"id":"navigation-config_367","kind":"mapping","label":"Entity navigations configured","line":367,"detail":"Configures navigation properties for Ebook.User and NexusUser.Ebooks via b.Navigation(...) calls (lines 367,372).","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"Ebook","kind":"entity","line":160,"purpose":"Domain entity persisted to Ebooks table representing a user's ebook metadata and file location.","fields":[{"name":"Id","type":"Guid","required":true,"line":162,"description":"Primary key, ValueGeneratedOnAdd, uuid column"},{"name":"AddedDate","type":"DateTime","required":true,"line":166,"description":"Timestamp with time zone when ebook was added"},{"name":"Author","type":"string","required":true,"line":169,"description":"Author name, max length 255"},{"name":"CoverUrl","type":"string","required":false,"line":174,"description":"Optional cover image URL"},{"name":"FilePath","type":"string","required":true,"line":177,"description":"Path or storage pointer to ebook file"},{"name":"LastReadDate","type":"DateTime?","required":false,"line":181,"description":"Nullable last read timestamp"},{"name":"Title","type":"string","required":true,"line":184,"description":"Ebook title, max length 255"},{"name":"UserId","type":"string","required":true,"line":189,"description":"FK to NexusUser (AspNetUsers) with cascade delete"}]},{"name":"NexusUser","kind":"entity","line":200,"purpose":"Application user entity (backed by AspNetUsers) extended with AI token tracking, TenantId and plan information.","fields":[{"name":"Id","type":"string","required":true,"line":202,"description":"Primary key for AspNetUsers"},{"name":"AITokenLimit","type":"int","required":true,"line":205,"description":"Configured AI token limit for user"},{"name":"AITokensUsed","type":"int","required":true,"line":208,"description":"AI tokens consumed by user"},{"name":"CurrentPlan","type":"string","required":true,"line":218,"description":"User's subscription/plan identifier"},{"name":"Email","type":"string","required":false,"line":222,"description":"User email, max length 256"},{"name":"NormalizedUserName","type":"string","required":false,"line":239,"description":"Normalized username with unique index"},{"name":"TenantId","type":"Guid","required":true,"line":255,"description":"Tenant identifier for multi-tenancy"}]},{"name":"SemanticKnowledgeCache","kind":"entity","line":277,"purpose":"Cache of semantic data keyed by content hash and model/prompt version to avoid recomputation for AI/knowledge features.","fields":[{"name":"ContentHash","type":"string","required":true,"line":279,"description":"Primary key and unique hash (max 64) identifying cached entry"},{"name":"CreatedAt","type":"DateTime","required":true,"line":283,"description":"Creation timestamp"},{"name":"JsonData","type":"string","required":true,"line":286,"description":"Serialized cached payload"},{"name":"ModelId","type":"string","required":true,"line":290,"description":"Model identifier (max 50) used to generate cache"},{"name":"PromptVersion","type":"string","required":true,"line":295,"description":"Prompt version (max 10) used for cache key"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Data/Persistence/AppDbContext (referenced via [DbContext(typeof(AppDbContext))])","NexusReader.Domain.Entities (Ebook, NexusUser, SemanticKnowledgeCache referenced)","Npgsql.EntityFrameworkCore.PostgreSQL.Metadata (UseIdentityByDefaultColumns)","Microsoft.AspNetCore.Identity (Identity tables referenced)"],"patterns":["EF Core Migration","Database Migrations","ASP.NET Core Identity integration"],"domainConcepts":["Ebook","NexusUser (application user)","SemanticKnowledgeCache","Identity roles/claims/logins"],"keyDetails":"Auto-generated EF Core migration designer that encodes Postgres-specific setup (identity columns, column types), identity table mappings, domain entity schemas (Ebook, NexusUser, SemanticKnowledgeCache), indexes and cascade delete relationships.","orchestrationMethods":[],"typedContracts":[{"name":"Ebook","kind":"entity","line":160,"fieldCount":8,"evidencePaths":["NexusReader.Data/Migrations/20260428184727_InitialPostgres.Designer.cs"]},{"name":"NexusUser","kind":"entity","line":200,"fieldCount":7,"evidencePaths":["NexusReader.Data/Migrations/20260428184727_InitialPostgres.Designer.cs"]},{"name":"SemanticKnowledgeCache","kind":"entity","line":277,"fieldCount":5,"evidencePaths":["NexusReader.Data/Migrations/20260428184727_InitialPostgres.Designer.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"Ebook","line":160,"summary":"entity with 8 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260428184727_InitialPostgres.Designer.cs"]},{"kind":"typed-contract","label":"NexusUser","line":200,"summary":"entity with 7 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260428184727_InitialPostgres.Designer.cs"]},{"kind":"typed-contract","label":"SemanticKnowledgeCache","line":277,"summary":"entity with 5 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260428184727_InitialPostgres.Designer.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260428184727_InitialPostgres.cs.json b/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260428184727_InitialPostgres.cs.json new file mode 100644 index 0000000..54f7f4e --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260428184727_InitialPostgres.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Data/Migrations/20260428184727_InitialPostgres.cs","purpose":"EF Core migration that creates the initial PostgreSQL schema (identity tables, Ebooks, and a semantic knowledge cache) and corresponding indexes/foreign keys for the NexusReader.Data project.","classification":{"role":"database-config","layer":"data","confidence":0.9,"evidence":["Class inherits Migration and implements Up/Down methods","Calls migrationBuilder.CreateTable / CreateIndex / DropTable to define DB schema"]},"className":"InitialPostgres","methods":[{"name":"Up","line":13,"endLine":250,"signature":"(migrationBuilder: MigrationBuilder) -> void","purpose":"Defines and applies the initial DB schema: creates identity tables, Ebooks, SemanticKnowledgeCache, constraints, and indexes.","calls":[],"actions":[{"id":"create-table_15","kind":"mapping","label":"AspNetRoles","line":15,"detail":"Creates AspNetRoles table with Id, Name, NormalizedName, ConcurrencyStamp and PK on Id (lines 15-27).","visibility":"detail-only","confidence":0.7},{"id":"create-table_29","kind":"mapping","label":"AspNetUsers","line":29,"detail":"Creates AspNetUsers with identity and custom fields (AITokenLimit, AITokensUsed, TenantId, CurrentPlan, etc.) and PK on Id (lines 29-56).","visibility":"detail-only","confidence":0.7},{"id":"create-table_58","kind":"mapping","label":"SemanticKnowledgeCache","line":58,"detail":"Creates SemanticKnowledgeCache with ContentHash (PK), JsonData, ModelId, PromptVersion, CreatedAt (lines 58-71).","visibility":"detail-only","confidence":0.7},{"id":"create-table_73","kind":"mapping","label":"AspNetRoleClaims","line":73,"detail":"Creates AspNetRoleClaims with auto-increment Id and FK to AspNetRoles.RoleId (lines 73-92).","visibility":"detail-only","confidence":0.7},{"id":"create-table_94","kind":"mapping","label":"AspNetUserClaims","line":94,"detail":"Creates AspNetUserClaims with auto-increment Id and FK to AspNetUsers.UserId (lines 94-113).","visibility":"detail-only","confidence":0.7},{"id":"create-table_115","kind":"mapping","label":"AspNetUserLogins","line":115,"detail":"Creates AspNetUserLogins with composite PK (LoginProvider, ProviderKey) and FK to AspNetUsers.UserId (lines 115-133).","visibility":"detail-only","confidence":0.7},{"id":"create-table_135","kind":"mapping","label":"AspNetUserRoles","line":135,"detail":"Creates AspNetUserRoles join table with composite PK (UserId, RoleId) and FKs to AspNetUsers and AspNetRoles (lines 135-157).","visibility":"detail-only","confidence":0.7},{"id":"create-table_159","kind":"mapping","label":"AspNetUserTokens","line":159,"detail":"Creates AspNetUserTokens with composite PK (UserId, LoginProvider, Name) and FK to AspNetUsers.UserId (lines 159-177).","visibility":"detail-only","confidence":0.7},{"id":"create-table_179","kind":"mapping","label":"Ebooks","line":179,"detail":"Creates Ebooks table with Id (PK), Title, Author, FilePath, CoverUrl, AddedDate, LastReadDate, UserId and FK to AspNetUsers.UserId (lines 179-201).","visibility":"detail-only","confidence":0.7},{"id":"create-index_203","kind":"mapping","label":"IX_AspNetRoleClaims_RoleId","line":203,"detail":"Creates index on AspNetRoleClaims.RoleId (line 203-206).","visibility":"detail-only","confidence":0.7},{"id":"create-index_208","kind":"mapping","label":"RoleNameIndex","line":208,"detail":"Creates unique index on AspNetRoles.NormalizedName (lines 208-212).","visibility":"detail-only","confidence":0.7},{"id":"create-index_214","kind":"mapping","label":"IX_AspNetUserClaims_UserId","line":214,"detail":"Creates index on AspNetUserClaims.UserId (lines 214-217).","visibility":"detail-only","confidence":0.7},{"id":"create-index_219","kind":"mapping","label":"IX_AspNetUserLogins_UserId","line":219,"detail":"Creates index on AspNetUserLogins.UserId (lines 219-222).","visibility":"detail-only","confidence":0.7},{"id":"create-index_224","kind":"mapping","label":"IX_AspNetUserRoles_RoleId","line":224,"detail":"Creates index on AspNetUserRoles.RoleId (lines 224-227).","visibility":"detail-only","confidence":0.7},{"id":"create-index_229","kind":"mapping","label":"EmailIndex","line":229,"detail":"Creates index on AspNetUsers.NormalizedEmail (lines 229-232).","visibility":"detail-only","confidence":0.7},{"id":"create-index_234","kind":"mapping","label":"UserNameIndex","line":234,"detail":"Creates unique index on AspNetUsers.NormalizedUserName (lines 234-238).","visibility":"detail-only","confidence":0.7},{"id":"create-index_240","kind":"mapping","label":"IX_Ebooks_UserId","line":240,"detail":"Creates index on Ebooks.UserId (lines 240-243).","visibility":"detail-only","confidence":0.7},{"id":"create-index_245","kind":"mapping","label":"IX_SemanticKnowledgeCache_ContentHash","line":245,"detail":"Creates unique index on SemanticKnowledgeCache.ContentHash (lines 245-249).","visibility":"detail-only","confidence":0.7}]},{"name":"Down","line":253,"endLine":281,"signature":"(migrationBuilder: MigrationBuilder) -> void","purpose":"Reverts the schema changes applied in Up by dropping indexes/tables in reverse order.","calls":[],"actions":[{"id":"drop-table_255","kind":"mapping","label":"AspNetRoleClaims","line":255,"detail":"Drops AspNetRoleClaims (line 255-256).","visibility":"detail-only","confidence":0.7},{"id":"drop-table_258","kind":"mapping","label":"AspNetUserClaims","line":258,"detail":"Drops AspNetUserClaims (line 258-259).","visibility":"detail-only","confidence":0.7},{"id":"drop-table_261","kind":"mapping","label":"AspNetUserLogins","line":261,"detail":"Drops AspNetUserLogins (line 261-262).","visibility":"detail-only","confidence":0.7},{"id":"drop-table_264","kind":"mapping","label":"AspNetUserRoles","line":264,"detail":"Drops AspNetUserRoles (line 264-265).","visibility":"detail-only","confidence":0.7},{"id":"drop-table_267","kind":"mapping","label":"AspNetUserTokens","line":267,"detail":"Drops AspNetUserTokens (line 267-268).","visibility":"detail-only","confidence":0.7},{"id":"drop-table_270","kind":"mapping","label":"Ebooks","line":270,"detail":"Drops Ebooks (line 270-271).","visibility":"detail-only","confidence":0.7},{"id":"drop-table_272","kind":"mapping","label":"SemanticKnowledgeCache","line":272,"detail":"Drops SemanticKnowledgeCache (line 272-274).","visibility":"detail-only","confidence":0.7},{"id":"drop-table_276","kind":"mapping","label":"AspNetRoles","line":276,"detail":"Drops AspNetRoles (line 276-278).","visibility":"detail-only","confidence":0.7},{"id":"drop-table_279","kind":"mapping","label":"AspNetUsers","line":279,"detail":"Drops AspNetUsers (line 279-280).","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"AspNetUsers","kind":"entity","line":30,"purpose":"Identity user table with additional tenant and AI token tracking fields.","fields":[{"name":"Id","type":"string","required":true,"line":33,"description":"Primary key"},{"name":"AITokenLimit","type":"int","required":true,"line":34,"description":"AI token quota limit"},{"name":"AITokensUsed","type":"int","required":true,"line":35,"description":"AI tokens consumed"},{"name":"TenantId","type":"Guid","required":true,"line":36,"description":"Tenant identifier"},{"name":"CurrentPlan","type":"string","required":true,"line":37,"description":"Plan name"},{"name":"UserName","type":"string","required":false,"line":38,"description":"UserName (max 256)"},{"name":"Email","type":"string","required":false,"line":40,"description":"Email (max 256)"},{"name":"EmailConfirmed","type":"bool","required":true,"line":42,"description":"Email confirmed flag"},{"name":"PasswordHash","type":"string","required":false,"line":43,"description":"Password hash"}]},{"name":"Ebooks","kind":"entity","line":179,"purpose":"Stores ebook metadata and file path linked to a user.","fields":[{"name":"Id","type":"Guid","required":true,"line":183,"description":"Primary key"},{"name":"Title","type":"string","required":true,"line":184,"description":"Book title (max 255)"},{"name":"Author","type":"string","required":true,"line":185,"description":"Author (max 255)"},{"name":"FilePath","type":"string","required":true,"line":186,"description":"Filesystem path or storage reference"},{"name":"CoverUrl","type":"string","required":false,"line":187,"description":"Cover image URL"},{"name":"AddedDate","type":"DateTime","required":true,"line":188,"description":"Date added"},{"name":"LastReadDate","type":"DateTime?","required":false,"line":189,"description":"Last read timestamp"},{"name":"UserId","type":"string","required":true,"line":190,"description":"FK to AspNetUsers.Id"}]},{"name":"SemanticKnowledgeCache","kind":"entity","line":58,"purpose":"Cache mapping content hash to model-specific semantic JSON data for knowledge/AI use.","fields":[{"name":"ContentHash","type":"string","required":true,"line":62,"description":"Primary key and unique content fingerprint (max 64)"},{"name":"JsonData","type":"string","required":true,"line":63,"description":"Stored semantic JSON"},{"name":"ModelId","type":"string","required":true,"line":64,"description":"Model identifier (max 50)"},{"name":"PromptVersion","type":"string","required":true,"line":65,"description":"Prompt schema/version (max 10)"},{"name":"CreatedAt","type":"DateTime","required":true,"line":66,"description":"Creation timestamp"}]},{"name":"AspNetRoles","kind":"entity","line":15,"purpose":"Identity roles table.","fields":[{"name":"Id","type":"string","required":true,"line":19,"description":"Primary key"},{"name":"Name","type":"string","required":false,"line":20,"description":"Role name (max 256)"},{"name":"NormalizedName","type":"string","required":false,"line":21,"description":"Normalized name (max 256)"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["EF Core Migration"],"domainConcepts":["User (Identity)","Role","Ebook","SemanticKnowledgeCache (AI/semantic caching)"],"keyDetails":"Migration implements Up to create identity and app tables (Ebooks, SemanticKnowledgeCache) with PKs, FKs to AspNetUsers, and multiple indexes; Down drops those tables in reverse order. No custom logic, retries, or external calls are present — it is schema DDL definition code.","orchestrationMethods":[],"typedContracts":[{"name":"AspNetUsers","kind":"entity","line":30,"fieldCount":9,"evidencePaths":["NexusReader.Data/Migrations/20260428184727_InitialPostgres.cs"]},{"name":"Ebooks","kind":"entity","line":179,"fieldCount":8,"evidencePaths":["NexusReader.Data/Migrations/20260428184727_InitialPostgres.cs"]},{"name":"SemanticKnowledgeCache","kind":"entity","line":58,"fieldCount":5,"evidencePaths":["NexusReader.Data/Migrations/20260428184727_InitialPostgres.cs"]},{"name":"AspNetRoles","kind":"entity","line":15,"fieldCount":3,"evidencePaths":["NexusReader.Data/Migrations/20260428184727_InitialPostgres.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"AspNetUsers","line":30,"summary":"entity with 9 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260428184727_InitialPostgres.cs"]},{"kind":"typed-contract","label":"Ebooks","line":179,"summary":"entity with 8 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260428184727_InitialPostgres.cs"]},{"kind":"typed-contract","label":"SemanticKnowledgeCache","line":58,"summary":"entity with 5 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260428184727_InitialPostgres.cs"]},{"kind":"typed-contract","label":"AspNetRoles","line":15,"summary":"entity with 3 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260428184727_InitialPostgres.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260428185239_IncreaseHashLength.Designer.cs.json b/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260428185239_IncreaseHashLength.Designer.cs.json new file mode 100644 index 0000000..43beda3 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260428185239_IncreaseHashLength.Designer.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Data/Migrations/20260428185239_IncreaseHashLength.Designer.cs","purpose":"EF Core migration designer for 'IncreaseHashLength' that defines the target model snapshot used by migrations (table schemas, columns, keys, indexes, relationships).","classification":{"role":"database-config","layer":"data","confidence":0.9,"evidence":["Class is annotated with [DbContext(typeof(AppDbContext))] and [Migration(...)]","Method BuildTargetModel(ModelBuilder) configures entities, keys, indexes and relationships"]},"className":"IncreaseHashLength","methods":[{"name":"BuildTargetModel","line":19,"endLine":375,"signature":"(modelBuilder: ModelBuilder) -> void","purpose":"Constructs the EF Core model snapshot for this migration: annotations, entity shapes, keys, indexes, relationships and table mappings.","calls":[],"actions":[{"id":"pragma_21","kind":"mapping","label":"Disable/restore obsolete warnings around snapshot","line":21,"detail":"#pragma warning disable 612, 618 ... #pragma warning restore 612, 618","visibility":"detail-only","confidence":0.7},{"id":"annotation_22","kind":"mapping","label":"Set model annotations","line":22,"detail":"modelBuilder.HasAnnotation(\"ProductVersion\", \"10.0.7\").HasAnnotation(\"Relational:MaxIdentifierLength\", 63)","visibility":"detail-only","confidence":0.7},{"id":"extension-call_26","kind":"mapping","label":"Use PostgreSQL identity by default columns","line":26,"detail":"NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder)","visibility":"detail-only","confidence":0.7},{"id":"entity-definition_28","kind":"mapping","label":"IdentityRole table shape","line":28,"detail":"Defines IdentityRole properties (Id, ConcurrencyStamp, Name, NormalizedName), PK, unique index on NormalizedName and ToTable(\"AspNetRoles\")","visibility":"detail-only","confidence":0.7},{"id":"entity-definition_54","kind":"mapping","label":"IdentityRoleClaim table shape","line":54,"detail":"Defines IdentityRoleClaim properties (Id with identity, ClaimType, ClaimValue, RoleId), PK, index on RoleId, ToTable(\"AspNetRoleClaims\")","visibility":"detail-only","confidence":0.7},{"id":"entity-definition_79","kind":"mapping","label":"IdentityUserClaim table shape","line":79,"detail":"Defines IdentityUserClaim properties (Id with identity, ClaimType, ClaimValue, UserId), PK, index on UserId, ToTable(\"AspNetUserClaims\")","visibility":"detail-only","confidence":0.7},{"id":"entity-definition_104","kind":"mapping","label":"IdentityUserLogin table shape","line":104,"detail":"Defines composite PK (LoginProvider, ProviderKey), ProviderDisplayName, UserId index, ToTable(\"AspNetUserLogins\")","visibility":"detail-only","confidence":0.7},{"id":"entity-definition_126","kind":"mapping","label":"IdentityUserRole table shape","line":126,"detail":"Defines composite PK (UserId, RoleId), index on RoleId, ToTable(\"AspNetUserRoles\")","visibility":"detail-only","confidence":0.7},{"id":"entity-definition_141","kind":"mapping","label":"IdentityUserToken table shape","line":141,"detail":"Defines composite PK (UserId, LoginProvider, Name), Value, ToTable(\"AspNetUserTokens\")","visibility":"detail-only","confidence":0.7},{"id":"entity-definition_160","kind":"mapping","label":"Ebook entity schema","line":160,"detail":"Defines Ebook columns (Id uuid PK with ValueGeneratedOnAdd, AddedDate, Author required maxlength 255, CoverUrl, FilePath required, LastReadDate nullable, Title required maxlength 255, UserId required), index on UserId and ToTable(\"Ebooks\")","visibility":"detail-only","confidence":0.7},{"id":"entity-definition_200","kind":"mapping","label":"NexusUser entity schema","line":200,"detail":"Defines NexusUser columns (Id, AITokenLimit, AITokensUsed, AccessFailedCount, ConcurrencyStamp, CurrentPlan required, Email maxlength 256, EmailConfirmed, Lockout fields, NormalizedEmail, NormalizedUserName, PasswordHash, PhoneNumber, SecurityStamp, TenantId uuid, TwoFactorEnabled, UserName maxlength 256), PK, indexes and ToTable(\"AspNetUsers\")","visibility":"detail-only","confidence":0.7},{"id":"entity-definition_277","kind":"mapping","label":"SemanticKnowledgeCache entity schema","line":277,"detail":"Defines SemanticKnowledgeCache columns (ContentHash maxlength 128 PK, CreatedAt, JsonData required, ModelId required maxlength 50, PromptVersion required maxlength 10), unique index on ContentHash, ToTable(\"SemanticKnowledgeCache\")","visibility":"detail-only","confidence":0.7},{"id":"relationship_308","kind":"mapping","label":"IdentityRoleClaim -> IdentityRole FK","line":308,"detail":"HasOne IdentityRole.WithMany().HasForeignKey(\"RoleId\").OnDelete(Cascade).IsRequired()","visibility":"detail-only","confidence":0.7},{"id":"relationship_317","kind":"mapping","label":"IdentityUserClaim -> NexusUser FK","line":317,"detail":"HasOne NexusUser.WithMany().HasForeignKey(\"UserId\").OnDelete(Cascade).IsRequired()","visibility":"detail-only","confidence":0.7},{"id":"relationship_326","kind":"mapping","label":"IdentityUserLogin -> NexusUser FK","line":326,"detail":"HasOne NexusUser.WithMany().HasForeignKey(\"UserId\").OnDelete(Cascade).IsRequired()","visibility":"detail-only","confidence":0.7},{"id":"relationship_335","kind":"mapping","label":"IdentityUserRole -> IdentityRole and NexusUser FKs","line":335,"detail":"HasOne IdentityRole.WithMany().HasForeignKey(\"RoleId\") and HasOne NexusUser.WithMany().HasForeignKey(\"UserId\") with Cascade delete","visibility":"detail-only","confidence":0.7},{"id":"relationship_350","kind":"mapping","label":"IdentityUserToken -> NexusUser FK","line":350,"detail":"HasOne NexusUser.WithMany().HasForeignKey(\"UserId\").OnDelete(Cascade).IsRequired()","visibility":"detail-only","confidence":0.7},{"id":"relationship_359","kind":"mapping","label":"Ebook -> NexusUser FK and navigation","line":359,"detail":"Ebook.HasOne(NexusUser, \"User\").WithMany(\"Ebooks\").HasForeignKey(\"UserId\").OnDelete(Cascade).IsRequired(); b.Navigation(\"User\")","visibility":"detail-only","confidence":0.7},{"id":"navigation_370","kind":"mapping","label":"NexusUser navigation to Ebooks","line":370,"detail":"b.Navigation(\"Ebooks\") to expose collection navigation","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"Ebook","kind":"entity","line":160,"purpose":"Represents an ebook uploaded/owned by a NexusUser (file path, metadata, last read date).","fields":[{"name":"Id","type":"Guid","required":true,"line":162,"description":"Primary key, ValueGeneratedOnAdd, stored as uuid"},{"name":"AddedDate","type":"DateTime","required":true,"line":166,"description":"When ebook was added"},{"name":"Author","type":"string","required":true,"line":169,"description":"Author name, max length 255"},{"name":"CoverUrl","type":"string","required":false,"line":174,"description":"Optional cover image URL"},{"name":"FilePath","type":"string","required":true,"line":177,"description":"Path to ebook file"},{"name":"LastReadDate","type":"DateTime?","required":false,"line":181,"description":"Nullable last read timestamp"},{"name":"Title","type":"string","required":true,"line":184,"description":"Title, max length 255"},{"name":"UserId","type":"string","required":true,"line":189,"description":"FK to owning NexusUser"}]},{"name":"NexusUser","kind":"entity","line":200,"purpose":"Application user with identity fields plus AI usage/quota and tenant information.","fields":[{"name":"Id","type":"string","required":true,"line":202,"description":"Primary key (string) used by Identity"},{"name":"AITokenLimit","type":"int","required":true,"line":205,"description":"AI token limit for user"},{"name":"AITokensUsed","type":"int","required":true,"line":208,"description":"AI tokens used"},{"name":"AccessFailedCount","type":"int","required":true,"line":211,"description":"Identity access failure count"},{"name":"ConcurrencyStamp","type":"string","required":false,"line":214,"description":"Concurrency token"},{"name":"CurrentPlan","type":"string","required":true,"line":218,"description":"Name of user's plan"},{"name":"Email","type":"string","required":false,"line":222,"description":"Email address (max 256)"},{"name":"EmailConfirmed","type":"bool","required":true,"line":226,"description":"Whether email is confirmed"},{"name":"LockoutEnabled","type":"bool","required":true,"line":229,"description":"Lockout enabled flag"},{"name":"LockoutEnd","type":"DateTimeOffset?","required":false,"line":232,"description":"Optional lockout end timestamp"},{"name":"NormalizedEmail","type":"string","required":false,"line":235,"description":"Normalized email for lookup (max 256)"},{"name":"NormalizedUserName","type":"string","required":false,"line":239,"description":"Normalized username for lookup (max 256)"},{"name":"PasswordHash","type":"string","required":false,"line":243,"description":"Password hash"},{"name":"PhoneNumber","type":"string","required":false,"line":246,"description":"Phone number"},{"name":"PhoneNumberConfirmed","type":"bool","required":true,"line":249,"description":"Phone confirmed flag"},{"name":"SecurityStamp","type":"string","required":false,"line":252,"description":"Security stamp"},{"name":"TenantId","type":"Guid","required":true,"line":255,"description":"Tenant identifier (uuid)"},{"name":"TwoFactorEnabled","type":"bool","required":true,"line":258,"description":"Two factor flag"},{"name":"UserName","type":"string","required":false,"line":261,"description":"Username (max 256)"}]},{"name":"SemanticKnowledgeCache","kind":"entity","line":277,"purpose":"Cache entry for semantic knowledge per content hash, model and prompt version with stored JSON data.","fields":[{"name":"ContentHash","type":"string","required":true,"line":279,"description":"Primary key and unique index, max length 128"},{"name":"CreatedAt","type":"DateTime","required":true,"line":283,"description":"Creation timestamp"},{"name":"JsonData","type":"string","required":true,"line":286,"description":"Stored JSON payload"},{"name":"ModelId","type":"string","required":true,"line":290,"description":"Model identifier (max length 50)"},{"name":"PromptVersion","type":"string","required":true,"line":295,"description":"Prompt version string (max length 10)"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Data/Persistence/AppDbContext.cs","NexusReader.Domain/Entities/Ebook.cs","NexusReader.Domain/Entities/NexusUser.cs","NexusReader.Domain/Entities/SemanticKnowledgeCache.cs"],"patterns":["EFCore Migration","ModelBuilder snapshot","ASP.NET Core Identity schema"],"domainConcepts":["Ebook","NexusUser","SemanticKnowledgeCache"],"keyDetails":"Auto-generated EF Core designer snapshot for migration 'IncreaseHashLength'. Changes surface as model column metadata (e.g., ContentHash maxlength 128) and standard Identity and domain entity mappings, keys, indexes and cascade delete relationships.","orchestrationMethods":[],"typedContracts":[{"name":"Ebook","kind":"entity","line":160,"fieldCount":8,"evidencePaths":["NexusReader.Data/Migrations/20260428185239_IncreaseHashLength.Designer.cs"]},{"name":"NexusUser","kind":"entity","line":200,"fieldCount":19,"evidencePaths":["NexusReader.Data/Migrations/20260428185239_IncreaseHashLength.Designer.cs"]},{"name":"SemanticKnowledgeCache","kind":"entity","line":277,"fieldCount":5,"evidencePaths":["NexusReader.Data/Migrations/20260428185239_IncreaseHashLength.Designer.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"Ebook","line":160,"summary":"entity with 8 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260428185239_IncreaseHashLength.Designer.cs"]},{"kind":"typed-contract","label":"NexusUser","line":200,"summary":"entity with 19 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260428185239_IncreaseHashLength.Designer.cs"]},{"kind":"typed-contract","label":"SemanticKnowledgeCache","line":277,"summary":"entity with 5 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260428185239_IncreaseHashLength.Designer.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260428185239_IncreaseHashLength.cs.json b/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260428185239_IncreaseHashLength.cs.json new file mode 100644 index 0000000..6bc62d4 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260428185239_IncreaseHashLength.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Data/Migrations/20260428185239_IncreaseHashLength.cs","purpose":"EF Core migration that changes column definitions: increases the ContentHash length from 64 to 128 and converts several timestamp columns from timestamptz to timestamp without time zone (and provides the reverse in Down).","classification":{"role":"database-config","layer":"data","confidence":0.9,"evidence":["Class inherits Microsoft.EntityFrameworkCore.Migrations.Migration","Namespace NexusReader.Data.Migrations and methods Up/Down alter DB columns via MigrationBuilder.AlterColumn"]},"className":"IncreaseHashLength","methods":[{"name":"Up","line":12,"endLine":48,"signature":"(migrationBuilder: MigrationBuilder) -> void","purpose":"Apply schema changes: alter timestamp column types to 'timestamp without time zone' and increase ContentHash column length to 128.","calls":[],"actions":[{"id":"schema-change_14","kind":"mapping","label":"Alter CreatedAt on SemanticKnowledgeCache to timestamp without time zone","line":14,"detail":"AlterColumn(name: \"CreatedAt\", table: \"SemanticKnowledgeCache\", type: \"timestamp without time zone\", nullable: false, oldType: \"timestamp with time zone\")","visibility":"detail-only","confidence":0.7},{"id":"schema-change_22","kind":"mapping","label":"Increase ContentHash length on SemanticKnowledgeCache to 128","line":22,"detail":"AlterColumn(name: \"ContentHash\", table: \"SemanticKnowledgeCache\", type: \"character varying(128)\", maxLength: 128, nullable: false, oldType: \"character varying(64)\", oldMaxLength: 64)","visibility":"detail-only","confidence":0.7},{"id":"schema-change_32","kind":"mapping","label":"Alter LastReadDate on Ebooks to timestamp without time zone (nullable)","line":32,"detail":"AlterColumn(name: \"LastReadDate\", table: \"Ebooks\", type: \"timestamp without time zone\", nullable: true, oldType: \"timestamp with time zone\", oldNullable: true)","visibility":"detail-only","confidence":0.7},{"id":"schema-change_41","kind":"mapping","label":"Alter AddedDate on Ebooks to timestamp without time zone","line":41,"detail":"AlterColumn(name: \"AddedDate\", table: \"Ebooks\", type: \"timestamp without time zone\", nullable: false, oldType: \"timestamp with time zone\")","visibility":"detail-only","confidence":0.7}]},{"name":"Down","line":51,"endLine":87,"signature":"(migrationBuilder: MigrationBuilder) -> void","purpose":"Revert schema changes applied in Up: restore timestamp with time zone types and reduce ContentHash length back to 64.","calls":[],"actions":[{"id":"schema-change_53","kind":"mapping","label":"Revert CreatedAt on SemanticKnowledgeCache to timestamp with time zone","line":53,"detail":"AlterColumn(name: \"CreatedAt\", table: \"SemanticKnowledgeCache\", type: \"timestamp with time zone\", nullable: false, oldType: \"timestamp without time zone\")","visibility":"detail-only","confidence":0.7},{"id":"schema-change_61","kind":"mapping","label":"Revert ContentHash length on SemanticKnowledgeCache to 64","line":61,"detail":"AlterColumn(name: \"ContentHash\", table: \"SemanticKnowledgeCache\", type: \"character varying(64)\", maxLength: 64, nullable: false, oldType: \"character varying(128)\", oldMaxLength: 128)","visibility":"detail-only","confidence":0.7},{"id":"schema-change_71","kind":"mapping","label":"Revert LastReadDate on Ebooks to timestamp with time zone (nullable)","line":71,"detail":"AlterColumn(name: \"LastReadDate\", table: \"Ebooks\", type: \"timestamp with time zone\", nullable: true, oldType: \"timestamp without time zone\", oldNullable: true)","visibility":"detail-only","confidence":0.7},{"id":"schema-change_80","kind":"mapping","label":"Revert AddedDate on Ebooks to timestamp with time zone","line":80,"detail":"AlterColumn(name: \"AddedDate\", table: \"Ebooks\", type: \"timestamp with time zone\", nullable: false, oldType: \"timestamp without time zone\")","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"IncreaseHashLength","kind":"model","line":9,"purpose":"EF Core Migration class representing a schema change that increases a hash column length and modifies timestamp column types.","fields":[{"name":"Up","type":"method","required":true,"line":12,"description":"Applies the schema changes"},{"name":"Down","type":"method","required":true,"line":51,"description":"Reverts the schema changes"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["EF Core Migration"],"domainConcepts":["SemanticKnowledgeCache","Ebooks","ContentHash","CreatedAt","LastReadDate","AddedDate"],"keyDetails":"Changes: ContentHash in SemanticKnowledgeCache expanded from varchar(64) to varchar(128); timestamp columns converted between 'timestamp with time zone' and 'timestamp without time zone' (Up/Down).","orchestrationMethods":[],"typedContracts":[{"name":"IncreaseHashLength","kind":"model","line":9,"fieldCount":2,"evidencePaths":["NexusReader.Data/Migrations/20260428185239_IncreaseHashLength.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"IncreaseHashLength","line":9,"summary":"model with 2 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260428185239_IncreaseHashLength.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260429080302_AddQuizResults.Designer.cs.json b/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260429080302_AddQuizResults.Designer.cs.json new file mode 100644 index 0000000..d2828b2 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260429080302_AddQuizResults.Designer.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Data/Migrations/20260429080302_AddQuizResults.Designer.cs","purpose":"EF Core migration designer that describes the target EF model for the AddQuizResults migration (database schema snapshot used by EF migrations).","classification":{"role":"database-config","layer":"data","confidence":0.9,"evidence":["File is in NexusReader.Data.Migrations and contains an EF Core Migration partial class","Contains BuildTargetModel(ModelBuilder) which configures entities, keys, indexes, and relationships"]},"className":"AddQuizResults","methods":[{"name":"BuildTargetModel","line":19,"endLine":418,"signature":"(modelBuilder: ModelBuilder) -> void","purpose":"Constructs the EF Core model snapshot for the migration: declares tables, columns, keys, indexes, annotations and relationships used by this migration.","calls":[],"actions":[{"id":"model-annotation_22","kind":"mapping","label":"Set product/version and max identifier length","line":22,"detail":"modelBuilder.HasAnnotation(\"ProductVersion\", \"10.0.7\").HasAnnotation(\"Relational:MaxIdentifierLength\", 63)","visibility":"detail-only","confidence":0.7},{"id":"provider-configuration_26","kind":"mapping","label":"Enable identity-by-default columns for Npgsql","line":26,"detail":"NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder)","visibility":"detail-only","confidence":0.7},{"id":"define-entity_28","kind":"mapping","label":"Define IdentityRole table schema (AspNetRoles)","line":28,"detail":"Defines properties Id, ConcurrencyStamp, Name, NormalizedName; sets key, unique index NormalizedName and table name","visibility":"detail-only","confidence":0.7},{"id":"define-entity_54","kind":"mapping","label":"Define IdentityRoleClaim table schema (AspNetRoleClaims)","line":54,"detail":"Defines Id (identity), ClaimType, ClaimValue, RoleId; sets key, index RoleId and table name","visibility":"detail-only","confidence":0.7},{"id":"define-entity_79","kind":"mapping","label":"Define IdentityUserClaim table schema (AspNetUserClaims)","line":79,"detail":"Defines Id, ClaimType, ClaimValue, UserId; sets key, index UserId","visibility":"detail-only","confidence":0.7},{"id":"define-entity_104","kind":"mapping","label":"Define IdentityUserLogin table schema (AspNetUserLogins)","line":104,"detail":"Defines composite key (LoginProvider, ProviderKey), ProviderDisplayName, UserId; index on UserId","visibility":"detail-only","confidence":0.7},{"id":"define-entity_126","kind":"mapping","label":"Define IdentityUserRole table schema (AspNetUserRoles)","line":126,"detail":"Defines composite key (UserId, RoleId), index RoleId","visibility":"detail-only","confidence":0.7},{"id":"define-entity_141","kind":"mapping","label":"Define IdentityUserToken table schema (AspNetUserTokens)","line":141,"detail":"Defines composite key (UserId, LoginProvider, Name) and Value","visibility":"detail-only","confidence":0.7},{"id":"define-entity_160","kind":"mapping","label":"Define Ebook entity/table (Ebooks)","line":160,"detail":"Defines Id (uuid, generated), AddedDate, Author, CoverUrl, FilePath, LastReadDate, Title, UserId; key Id; index on UserId","visibility":"detail-only","confidence":0.7},{"id":"define-entity_200","kind":"mapping","label":"Define NexusUser entity/table (AspNetUsers)","line":200,"detail":"Defines many identity/user columns (Id, AIToken fields, CurrentPlan, Email, security fields, TenantId, etc.); key Id; indexes on NormalizedEmail and NormalizedUserName","visibility":"detail-only","confidence":0.7},{"id":"define-entity_277","kind":"mapping","label":"Define QuizResult entity/table (QuizResults) — primary purpose of this migration","line":277,"detail":"Defines Id (uuid, generated), CompletedDate, Score, Topic (required), TotalQuestions, UserId (required); key Id; index on UserId; table QuizResults","visibility":"detail-only","confidence":0.7},{"id":"define-entity_307","kind":"mapping","label":"Define SemanticKnowledgeCache entity/table (SemanticKnowledgeCache)","line":307,"detail":"Defines ContentHash (PK, maxLength 128), CreatedAt, JsonData, ModelId, PromptVersion; unique index on ContentHash","visibility":"detail-only","confidence":0.7},{"id":"define-relationship_338","kind":"mapping","label":"Role claims -> Role (FK RoleId) cascade delete","line":338,"detail":"IdentityRoleClaim.RoleId -> IdentityRole.Id with cascade delete","visibility":"detail-only","confidence":0.7},{"id":"define-relationship_346","kind":"mapping","label":"User claims -> NexusUser (FK UserId) cascade delete","line":346,"detail":"IdentityUserClaim.UserId -> NexusUser.Id with cascade delete","visibility":"detail-only","confidence":0.7},{"id":"define-relationship_356","kind":"mapping","label":"User logins -> NexusUser (FK UserId) cascade delete","line":356,"detail":"IdentityUserLogin.UserId -> NexusUser.Id with cascade delete","visibility":"detail-only","confidence":0.7},{"id":"define-relationship_365","kind":"mapping","label":"User roles -> Role and NexusUser (FK RoleId, UserId) cascade delete","line":365,"detail":"IdentityUserRole.RoleId -> IdentityRole.Id and IdentityUserRole.UserId -> NexusUser.Id with cascade delete","visibility":"detail-only","confidence":0.7},{"id":"define-relationship_380","kind":"mapping","label":"User tokens -> NexusUser (FK UserId) cascade delete","line":380,"detail":"IdentityUserToken.UserId -> NexusUser.Id with cascade delete","visibility":"detail-only","confidence":0.7},{"id":"define-relationship_389","kind":"mapping","label":"Ebook.User -> NexusUser (FK UserId) cascade delete + navigation","line":389,"detail":"Ebook.UserId -> NexusUser.Id, WithMany('Ebooks'), navigation property 'User' configured","visibility":"detail-only","confidence":0.7},{"id":"define-relationship_400","kind":"mapping","label":"QuizResult.User -> NexusUser (FK UserId) cascade delete + navigation","line":400,"detail":"QuizResult.UserId -> NexusUser.Id, WithMany('QuizResults'), navigation property 'User' configured","visibility":"detail-only","confidence":0.7},{"id":"define-navigation_411","kind":"mapping","label":"NexusUser navigations for Ebooks and QuizResults","line":411,"detail":"Navigation properties 'Ebooks' and 'QuizResults' configured on NexusUser","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"AddQuizResults","kind":"model","line":16,"purpose":"Partial migration class representing the AddQuizResults EF migration (designer snapshot).","fields":[{"name":"BuildTargetModel","type":"method","required":true,"line":19,"description":"Method that builds the EF model snapshot for this migration"}]},{"name":"QuizResult","kind":"entity","line":277,"purpose":"Represents a user's completed quiz result stored in the QuizResults table.","fields":[{"name":"Id","type":"Guid (uuid)","required":true,"line":279,"description":"Primary key, value generated on add"},{"name":"CompletedDate","type":"DateTime","required":true,"line":283,"description":"When quiz was completed"},{"name":"Score","type":"int","required":true,"line":286,"description":"Score achieved"},{"name":"Topic","type":"string","required":true,"line":289,"description":"Quiz topic (required)"},{"name":"TotalQuestions","type":"int","required":true,"line":293,"description":"Number of questions in the quiz"},{"name":"UserId","type":"string","required":true,"line":296,"description":"FK to NexusUser (required), indexed"}]},{"name":"Ebook","kind":"entity","line":160,"purpose":"Represents an e-book record stored in the Ebooks table.","fields":[{"name":"Id","type":"Guid (uuid)","required":true,"line":162,"description":"Primary key, value generated on add"},{"name":"AddedDate","type":"DateTime","required":true,"line":166,"description":"When ebook was added"},{"name":"Author","type":"string","required":true,"line":169,"description":"Author name (max 255)"},{"name":"CoverUrl","type":"string","required":false,"line":174,"description":"Optional cover URL"},{"name":"FilePath","type":"string","required":true,"line":177,"description":"Path to file"},{"name":"LastReadDate","type":"DateTime?","required":false,"line":181,"description":"When last read (nullable)"},{"name":"Title","type":"string","required":true,"line":184,"description":"Title (max 255)"},{"name":"UserId","type":"string","required":true,"line":189,"description":"FK to NexusUser, indexed"}]},{"name":"NexusUser","kind":"entity","line":200,"purpose":"Application user entity mapped to AspNetUsers with various identity and app-specific fields.","fields":[{"name":"Id","type":"string","required":true,"line":202,"description":"Primary key"},{"name":"AITokenLimit","type":"int","required":true,"line":205,"description":"AI token limit for the user"},{"name":"AITokensUsed","type":"int","required":true,"line":208,"description":"AI tokens used"},{"name":"CurrentPlan","type":"string","required":true,"line":218,"description":"User plan identifier"},{"name":"Email","type":"string","required":false,"line":222,"description":"Email (max 256)"},{"name":"TenantId","type":"Guid","required":true,"line":255,"description":"Tenant identifier"},{"name":"Ebooks","type":"ICollection","required":false,"line":413,"description":"Navigation collection configured"},{"name":"QuizResults","type":"ICollection","required":false,"line":415,"description":"Navigation collection configured"}]},{"name":"SemanticKnowledgeCache","kind":"entity","line":307,"purpose":"Cache table for semantic knowledge artifacts keyed by content hash.","fields":[{"name":"ContentHash","type":"string","required":true,"line":309,"description":"Primary key, max length 128"},{"name":"CreatedAt","type":"DateTime","required":true,"line":313,"description":"Creation timestamp"},{"name":"JsonData","type":"string","required":true,"line":316,"description":"Stored JSON blob"},{"name":"ModelId","type":"string","required":true,"line":320,"description":"Model identifier (max 50)"},{"name":"PromptVersion","type":"string","required":true,"line":325,"description":"Prompt version (max 10)"}]},{"name":"IdentityRole / AspNetRoles (framework)","kind":"entity","line":28,"purpose":"ASP.NET Identity role table schema snapshot.","fields":[{"name":"Id","type":"string","required":true,"line":30,"description":"Primary key"},{"name":"Name","type":"string","required":false,"line":37,"description":"Role name (max 256)"},{"name":"NormalizedName","type":"string","required":false,"line":41,"description":"Normalized name (unique index)"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Data/Persistence/AppDbContext.cs","Npgsql.EntityFrameworkCore.PostgreSQL (provider extension)"],"patterns":["EFCore Migration","Entity Configuration (Fluent API)"],"domainConcepts":["QuizResult","Ebook","NexusUser","SemanticKnowledgeCache","ASP.NET Identity (roles, claims, tokens, logins)"],"keyDetails":"This designer snapshot declares the QuizResults table (Id, CompletedDate, Score, Topic, TotalQuestions, UserId) and its FK relationship to NexusUser; the file is an EF Core migration snapshot used by the AddQuizResults migration and configures identity-related tables, Ebooks, SemanticKnowledgeCache and navigations.","orchestrationMethods":[],"typedContracts":[{"name":"AddQuizResults","kind":"model","line":16,"fieldCount":1,"evidencePaths":["NexusReader.Data/Migrations/20260429080302_AddQuizResults.Designer.cs"]},{"name":"QuizResult","kind":"entity","line":277,"fieldCount":6,"evidencePaths":["NexusReader.Data/Migrations/20260429080302_AddQuizResults.Designer.cs"]},{"name":"Ebook","kind":"entity","line":160,"fieldCount":8,"evidencePaths":["NexusReader.Data/Migrations/20260429080302_AddQuizResults.Designer.cs"]},{"name":"NexusUser","kind":"entity","line":200,"fieldCount":8,"evidencePaths":["NexusReader.Data/Migrations/20260429080302_AddQuizResults.Designer.cs"]},{"name":"SemanticKnowledgeCache","kind":"entity","line":307,"fieldCount":5,"evidencePaths":["NexusReader.Data/Migrations/20260429080302_AddQuizResults.Designer.cs"]},{"name":"IdentityRole / AspNetRoles (framework)","kind":"entity","line":28,"fieldCount":3,"evidencePaths":["NexusReader.Data/Migrations/20260429080302_AddQuizResults.Designer.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"AddQuizResults","line":16,"summary":"model with 1 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260429080302_AddQuizResults.Designer.cs"]},{"kind":"typed-contract","label":"QuizResult","line":277,"summary":"entity with 6 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260429080302_AddQuizResults.Designer.cs"]},{"kind":"typed-contract","label":"Ebook","line":160,"summary":"entity with 8 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260429080302_AddQuizResults.Designer.cs"]},{"kind":"typed-contract","label":"NexusUser","line":200,"summary":"entity with 8 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260429080302_AddQuizResults.Designer.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260429080302_AddQuizResults.cs.json b/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260429080302_AddQuizResults.cs.json new file mode 100644 index 0000000..2a11330 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260429080302_AddQuizResults.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Data/Migrations/20260429080302_AddQuizResults.cs","purpose":"EF Core migration that adds a QuizResults table with columns, primary key, foreign key to AspNetUsers, and an index; and provides a Down method to drop the table.","classification":{"role":"database-config","layer":"data","confidence":0.9,"evidence":["Contains a Migration-derived class creating/dropping a database table","Namespace NexusReader.Data.Migrations and usage of MigrationBuilder.CreateTable/CreateIndex/DropTable"]},"className":"AddQuizResults","methods":[{"name":"Up","line":12,"endLine":40,"signature":"(migrationBuilder: MigrationBuilder) -> void","purpose":"Applies the migration: creates the QuizResults table with columns, primary key, foreign key to AspNetUsers (cascade) and an index on UserId.","calls":[],"actions":[{"id":"create-table_14","kind":"mapping","label":"Creates QuizResults table","line":14,"detail":"migrationBuilder.CreateTable(name: \"QuizResults\", columns: ...) defines columns Id, UserId, Topic, Score, TotalQuestions, CompletedDate","visibility":"detail-only","confidence":0.7},{"id":"column_18","kind":"mapping","label":"Id column","line":18,"detail":"Id: Guid, type uuid, nullable: false","visibility":"detail-only","confidence":0.7},{"id":"column_19","kind":"mapping","label":"UserId column","line":19,"detail":"UserId: string, type text, nullable: false","visibility":"detail-only","confidence":0.7},{"id":"column_20","kind":"mapping","label":"Topic column","line":20,"detail":"Topic: string, type text, nullable: false","visibility":"detail-only","confidence":0.7},{"id":"column_21","kind":"mapping","label":"Score column","line":21,"detail":"Score: int, type integer, nullable: false","visibility":"detail-only","confidence":0.7},{"id":"column_22","kind":"mapping","label":"TotalQuestions column","line":22,"detail":"TotalQuestions: int, type integer, nullable: false","visibility":"detail-only","confidence":0.7},{"id":"column_23","kind":"mapping","label":"CompletedDate column","line":23,"detail":"CompletedDate: DateTime, timestamp without time zone, nullable: false","visibility":"detail-only","confidence":0.7},{"id":"primary-key_27","kind":"mapping","label":"Primary key on Id","line":27,"detail":"table.PrimaryKey(\"PK_QuizResults\", x => x.Id)","visibility":"detail-only","confidence":0.7},{"id":"foreign-key_28","kind":"mapping","label":"FK to AspNetUsers on UserId (cascade)","line":28,"detail":"Foreign key references AspNetUsers(Id) with ReferentialAction.Cascade","visibility":"detail-only","confidence":0.7},{"id":"create-index_36","kind":"mapping","label":"Index on UserId","line":36,"detail":"migrationBuilder.CreateIndex(name: \"IX_QuizResults_UserId\", table: \"QuizResults\", column: \"UserId\")","visibility":"detail-only","confidence":0.7}]},{"name":"Down","line":43,"endLine":47,"signature":"(migrationBuilder: MigrationBuilder) -> void","purpose":"Reverts the migration by dropping the QuizResults table.","calls":[],"actions":[{"id":"drop-table_45","kind":"mapping","label":"Drops QuizResults table","line":45,"detail":"migrationBuilder.DropTable(name: \"QuizResults\")","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"QuizResults (table)","kind":"entity","line":14,"purpose":"Represents persisted quiz result records for users (table created by the migration).","fields":[{"name":"Id","type":"Guid","required":true,"line":18,"description":"Primary key identifier (uuid)"},{"name":"UserId","type":"string","required":true,"line":19,"description":"FK to AspNetUsers.Id (text), non-null"},{"name":"Topic","type":"string","required":true,"line":20,"description":"Quiz topic"},{"name":"Score","type":"int","required":true,"line":21,"description":"User score for the quiz"},{"name":"TotalQuestions","type":"int","required":true,"line":22,"description":"Total number of questions in the quiz"},{"name":"CompletedDate","type":"DateTime","required":true,"line":23,"description":"Timestamp when the quiz was completed"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["EF Core Migration"],"domainConcepts":["QuizResult","User (AspNetUsers)"],"keyDetails":"Adds QuizResults table with non-nullable columns, primary key on Id, foreign key to AspNetUsers.Id with cascade delete, and an index on UserId; Down drops the table.","orchestrationMethods":[],"typedContracts":[{"name":"QuizResults (table)","kind":"entity","line":14,"fieldCount":6,"evidencePaths":["NexusReader.Data/Migrations/20260429080302_AddQuizResults.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"QuizResults (table)","line":14,"summary":"entity with 6 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260429080302_AddQuizResults.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260503175906_FinalNormalizedSubscriptionArchitecture.Designer.cs.json b/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260503175906_FinalNormalizedSubscriptionArchitecture.Designer.cs.json new file mode 100644 index 0000000..2b886e4 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260503175906_FinalNormalizedSubscriptionArchitecture.Designer.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Data/Migrations/20260503175906_FinalNormalizedSubscriptionArchitecture.Designer.cs","purpose":"EF Core migration designer that builds the target EF model for the FinalNormalizedSubscriptionArchitecture migration; it's an auto-generated file that describes entity shapes, indexes, relationships, extensions and seed data for the AppDbContext.","classification":{"role":"database-config","layer":"data","confidence":0.9,"evidence":["[DbContext(typeof(AppDbContext))] and [Migration(...)] attributes","Contains BuildTargetModel(ModelBuilder) which configures entities, indexes, relationships and seed data","References NexusReader.Domain.Entities types and configures PostgreSQL vector extension"]},"className":"FinalNormalizedSubscriptionArchitecture","methods":[{"name":"BuildTargetModel","line":20,"endLine":650,"signature":"(modelBuilder: ModelBuilder) -> void","purpose":"Constructs the EF Core model for this migration: annotations, Postgres extensions, entity mappings, relationships, indexes and seed data.","calls":[],"actions":[{"id":"annotation_23","kind":"mapping","label":"Sets model annotations","line":23,"detail":"modelBuilder.HasAnnotation(\"ProductVersion\",\"10.0.7\").HasAnnotation(\"Relational:MaxIdentifierLength\",63)","visibility":"detail-only","confidence":0.7},{"id":"external-extension_27","kind":"mapping","label":"Registers Postgres vector extension and identity column behaviour","line":27,"detail":"NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, \"vector\"); NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);","visibility":"detail-only","confidence":0.7},{"id":"entity-configuration_30","kind":"mapping","label":"Configures Identity and domain entities (properties, keys, indexes, tables)","line":30,"detail":"Multiple modelBuilder.Entity(...) fluent configurations for IdentityRole, IdentityUser*, Ebook, KnowledgeUnit, KnowledgeUnitLink, NexusUser, QuizResult, SemanticKnowledgeCache, SubscriptionPlan, etc.","visibility":"detail-only","confidence":0.7},{"id":"index_49","kind":"mapping","label":"Creates indexes and unique constraints","line":49,"detail":"Many b.HasIndex(...) and unique/index database names (e.g., RoleNameIndex, UserNameIndex, EmailIndex, unique ContentHash)","visibility":"detail-only","confidence":0.7},{"id":"data-seed_498","kind":"mapping","label":"Seeds SubscriptionPlan rows","line":498,"detail":"b.HasData(...) inserts 4 subscription plan rows (Free, Basic, Pro, Enterprise) with Id, AITokenLimit, MonthlyPrice, PlanName, StripeProductId","visibility":"detail-only","confidence":0.7},{"id":"relationship_533","kind":"mapping","label":"Configures relationships and navigation properties","line":533,"detail":"b.HasOne(...).WithMany(...).HasForeignKey(...).OnDelete(...) for role claims, user claims, ebooks->user, knowledge unit links, user->subscription plan, quiz results->user","visibility":"detail-only","confidence":0.7},{"id":"navigation-registration_592","kind":"mapping","label":"Registers navigations","line":592,"detail":"b.Navigation(...) calls for User, IncomingLinks, OutgoingLinks, Ebooks, QuizResults, SubscriptionPlan","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"Microsoft.AspNetCore.Identity.IdentityRole","kind":"entity","line":30,"purpose":"ASP.NET Identity role mapping (Id, Name, NormalizedName, ConcurrencyStamp) for DB storage.","fields":[{"name":"Id","type":"string","required":true,"line":32,"description":"Primary key"},{"name":"ConcurrencyStamp","type":"string","required":false,"line":35,"description":"Concurrency token"},{"name":"Name","type":"string","required":false,"line":39,"description":"Role display name"},{"name":"NormalizedName","type":"string","required":false,"line":43,"description":"Normalized role name (indexed unique)"}]},{"name":"Microsoft.AspNetCore.Identity.IdentityRoleClaim","kind":"entity","line":56,"purpose":"Role claim entries for ASP.NET Identity.","fields":[{"name":"Id","type":"int","required":true,"line":58,"description":"PK, identity column"},{"name":"ClaimType","type":"string","required":false,"line":64,"description":"Claim type"},{"name":"ClaimValue","type":"string","required":false,"line":67,"description":"Claim value"},{"name":"RoleId","type":"string","required":true,"line":70,"description":"FK to IdentityRole"}]},{"name":"Microsoft.AspNetCore.Identity.IdentityUserClaim","kind":"entity","line":81,"purpose":"User claim entries for ASP.NET Identity.","fields":[{"name":"Id","type":"int","required":true,"line":83,"description":"PK, identity column"},{"name":"ClaimType","type":"string","required":false,"line":89,"description":"Claim type"},{"name":"ClaimValue","type":"string","required":false,"line":92,"description":"Claim value"},{"name":"UserId","type":"string","required":true,"line":95,"description":"FK to NexusUser"}]},{"name":"Microsoft.AspNetCore.Identity.IdentityUserLogin","kind":"entity","line":106,"purpose":"External login (provider) linkage for ASP.NET Identity users.","fields":[{"name":"LoginProvider","type":"string","required":true,"line":108,"description":"External provider id (part of PK)"},{"name":"ProviderKey","type":"string","required":true,"line":111,"description":"Provider key (part of PK)"},{"name":"ProviderDisplayName","type":"string","required":false,"line":114,"description":"Display name for provider"},{"name":"UserId","type":"string","required":true,"line":117,"description":"FK to NexusUser"}]},{"name":"Microsoft.AspNetCore.Identity.IdentityUserRole","kind":"entity","line":128,"purpose":"Many-to-many mapping between users and roles.","fields":[{"name":"UserId","type":"string","required":true,"line":130,"description":"FK to user (PK composite)"},{"name":"RoleId","type":"string","required":true,"line":133,"description":"FK to role (PK composite)"}]},{"name":"Microsoft.AspNetCore.Identity.IdentityUserToken","kind":"entity","line":143,"purpose":"Tokens associated with a user for authentication/refresh, etc.","fields":[{"name":"UserId","type":"string","required":true,"line":145,"description":"FK to user (composite PK)"},{"name":"LoginProvider","type":"string","required":true,"line":148,"description":"Provider key (composite PK)"},{"name":"Name","type":"string","required":true,"line":151,"description":"Token name (composite PK)"},{"name":"Value","type":"string","required":false,"line":154,"description":"Token value"}]},{"name":"NexusReader.Domain.Entities.Ebook","kind":"entity","line":162,"purpose":"Represents uploaded ebooks with metadata and ownership links.","fields":[{"name":"Id","type":"Guid","required":true,"line":164,"description":"PK"},{"name":"AddedDate","type":"DateTime","required":true,"line":168,"description":"When ebook was added"},{"name":"Author","type":"string","required":true,"line":171,"description":"Author name"},{"name":"CoverUrl","type":"string","required":false,"line":176,"description":"URL to cover image"},{"name":"FilePath","type":"string","required":true,"line":179,"description":"Storage path"},{"name":"LastReadDate","type":"DateTime?","required":false,"line":183,"description":"Last read timestamp"},{"name":"TenantId","type":"string","required":true,"line":186,"description":"Tenant scoping id"},{"name":"Title","type":"string","required":true,"line":191,"description":"Ebook title"},{"name":"UserId","type":"string","required":true,"line":196,"description":"FK to NexusUser (owner)"}]},{"name":"NexusReader.Domain.Entities.KnowledgeUnit","kind":"entity","line":208,"purpose":"A semantic knowledge unit with vector embedding and metadata.","fields":[{"name":"Id","type":"string","required":true,"line":211,"description":"PK (max length 128)"},{"name":"Content","type":"string","required":true,"line":215,"description":"Textual content"},{"name":"CreatedAt","type":"DateTime","required":true,"line":219,"description":"Creation timestamp"},{"name":"MetadataJson","type":"string","required":false,"line":222,"description":"Serialized metadata"},{"name":"SourceId","type":"string","required":true,"line":225,"description":"Source identifier"},{"name":"TenantId","type":"string","required":true,"line":230,"description":"Tenant scoping id"},{"name":"Type","type":"int","required":true,"line":235,"description":"Knowledge unit type enum"},{"name":"Vector","type":"Vector","required":false,"line":238,"description":"Embedding vector (vector(768))"},{"name":"Version","type":"string","required":true,"line":241,"description":"Version tag"}]},{"name":"NexusReader.Domain.Entities.KnowledgeUnitLink","kind":"entity","line":254,"purpose":"Directed relation between two KnowledgeUnit entities.","fields":[{"name":"Id","type":"int","required":true,"line":257,"description":"PK, identity"},{"name":"RelationType","type":"string","required":true,"line":263,"description":"Type of relation"},{"name":"SourceUnitId","type":"string","required":true,"line":268,"description":"FK to source KnowledgeUnit"},{"name":"TargetUnitId","type":"string","required":true,"line":273,"description":"FK to target KnowledgeUnit"}]},{"name":"NexusReader.Domain.Entities.NexusUser","kind":"entity","line":286,"purpose":"Application user entity augmented for app-specific fields (AI quotas, tenant, subscription plan).","fields":[{"name":"Id","type":"string","required":true,"line":289,"description":"PK"},{"name":"AITokenLimit","type":"int","required":true,"line":292,"description":"Monthly AI token limit"},{"name":"AITokensUsed","type":"int","required":true,"line":295,"description":"Tokens used"},{"name":"Email","type":"string","required":false,"line":309,"description":"User email"},{"name":"LastAiActionDate","type":"DateTime?","required":false,"line":316,"description":"Last AI action timestamp"},{"name":"LastReadAt","type":"DateTime?","required":false,"line":319,"description":"Last read timestamp across ebooks"},{"name":"SubscriptionPlanId","type":"int","required":true,"line":352,"description":"FK to SubscriptionPlan (default 1)"},{"name":"TenantId","type":"string","required":true,"line":357,"description":"Tenant scoping id"}]},{"name":"NexusReader.Domain.Entities.QuizResult","kind":"entity","line":385,"purpose":"Stores quiz scores and metadata for a user within a tenant.","fields":[{"name":"Id","type":"Guid","required":true,"line":387,"description":"PK"},{"name":"CompletedDate","type":"DateTime","required":true,"line":391,"description":"When quiz completed"},{"name":"Score","type":"int","required":true,"line":394,"description":"Quiz score"},{"name":"Topic","type":"string","required":true,"line":402,"description":"Quiz topic"},{"name":"TotalQuestions","type":"int","required":true,"line":406,"description":"Total questions in quiz"},{"name":"UserId","type":"string","required":true,"line":409,"description":"FK to NexusUser"}]},{"name":"NexusReader.Domain.Entities.SemanticKnowledgeCache","kind":"entity","line":422,"purpose":"Cache of semantic representations and serialized results keyed by content hash and tenant.","fields":[{"name":"ContentHash","type":"string","required":true,"line":424,"description":"PK, unique content hash"},{"name":"CreatedAt","type":"DateTime","required":true,"line":428,"description":"Cache entry creation time"},{"name":"JsonData","type":"string","required":true,"line":431,"description":"Serialized cached result"},{"name":"ModelId","type":"string","required":true,"line":435,"description":"Model identifier used to produce the vector"},{"name":"OriginalText","type":"string","required":true,"line":440,"description":"Original text used to derive the vector"},{"name":"PromptVersion","type":"string","required":true,"line":444,"description":"Prompt version used"},{"name":"TenantId","type":"string","required":true,"line":449,"description":"Tenant scoping id"},{"name":"Vector","type":"Vector","required":false,"line":454,"description":"Embedding vector (vector(1536))"}]},{"name":"NexusReader.Domain.Entities.SubscriptionPlan","kind":"entity","line":467,"purpose":"Subscription plan catalog storing pricing and AI token limits; seeded with default plans.","fields":[{"name":"Id","type":"int","required":true,"line":469,"description":"PK identity"},{"name":"AITokenLimit","type":"int","required":true,"line":475,"description":"Token allowance for plan"},{"name":"MonthlyPrice","type":"decimal","required":true,"line":478,"description":"Monthly price"},{"name":"PlanName","type":"string","required":true,"line":481,"description":"Unique plan name"},{"name":"StripeProductId","type":"string","required":true,"line":486,"description":"Stripe product id placeholder"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Data/Persistence/AppDbContext.cs","NexusReader.Domain/Entities/*"],"patterns":["EF Core Migration","Fluent API entity configuration","Data seeding"],"domainConcepts":["User (NexusUser)","Ebook","Knowledge Unit (vector embeddings)","Knowledge Unit Link (graph edges)","Subscription Plan","Semantic Knowledge Cache","Quiz Results","ASP.NET Identity"],"keyDetails":"Auto-generated EF Core migration designer that defines the database model including Postgres vector extension, entity properties, FK relationships, indexes, navigations and seeded subscription plans; not application runtime logic but critical for DB schema generation and migrations.","orchestrationMethods":[],"typedContracts":[{"name":"Microsoft.AspNetCore.Identity.IdentityRole","kind":"entity","line":30,"fieldCount":4,"evidencePaths":["NexusReader.Data/Migrations/20260503175906_FinalNormalizedSubscriptionArchitecture.Designer.cs"]},{"name":"Microsoft.AspNetCore.Identity.IdentityRoleClaim","kind":"entity","line":56,"fieldCount":4,"evidencePaths":["NexusReader.Data/Migrations/20260503175906_FinalNormalizedSubscriptionArchitecture.Designer.cs"]},{"name":"Microsoft.AspNetCore.Identity.IdentityUserClaim","kind":"entity","line":81,"fieldCount":4,"evidencePaths":["NexusReader.Data/Migrations/20260503175906_FinalNormalizedSubscriptionArchitecture.Designer.cs"]},{"name":"Microsoft.AspNetCore.Identity.IdentityUserLogin","kind":"entity","line":106,"fieldCount":4,"evidencePaths":["NexusReader.Data/Migrations/20260503175906_FinalNormalizedSubscriptionArchitecture.Designer.cs"]},{"name":"Microsoft.AspNetCore.Identity.IdentityUserRole","kind":"entity","line":128,"fieldCount":2,"evidencePaths":["NexusReader.Data/Migrations/20260503175906_FinalNormalizedSubscriptionArchitecture.Designer.cs"]},{"name":"Microsoft.AspNetCore.Identity.IdentityUserToken","kind":"entity","line":143,"fieldCount":4,"evidencePaths":["NexusReader.Data/Migrations/20260503175906_FinalNormalizedSubscriptionArchitecture.Designer.cs"]},{"name":"NexusReader.Domain.Entities.Ebook","kind":"entity","line":162,"fieldCount":9,"evidencePaths":["NexusReader.Data/Migrations/20260503175906_FinalNormalizedSubscriptionArchitecture.Designer.cs"]},{"name":"NexusReader.Domain.Entities.KnowledgeUnit","kind":"entity","line":208,"fieldCount":9,"evidencePaths":["NexusReader.Data/Migrations/20260503175906_FinalNormalizedSubscriptionArchitecture.Designer.cs"]},{"name":"NexusReader.Domain.Entities.KnowledgeUnitLink","kind":"entity","line":254,"fieldCount":4,"evidencePaths":["NexusReader.Data/Migrations/20260503175906_FinalNormalizedSubscriptionArchitecture.Designer.cs"]},{"name":"NexusReader.Domain.Entities.NexusUser","kind":"entity","line":286,"fieldCount":8,"evidencePaths":["NexusReader.Data/Migrations/20260503175906_FinalNormalizedSubscriptionArchitecture.Designer.cs"]},{"name":"NexusReader.Domain.Entities.QuizResult","kind":"entity","line":385,"fieldCount":6,"evidencePaths":["NexusReader.Data/Migrations/20260503175906_FinalNormalizedSubscriptionArchitecture.Designer.cs"]},{"name":"NexusReader.Domain.Entities.SemanticKnowledgeCache","kind":"entity","line":422,"fieldCount":8,"evidencePaths":["NexusReader.Data/Migrations/20260503175906_FinalNormalizedSubscriptionArchitecture.Designer.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"Microsoft.AspNetCore.Identity.IdentityRole","line":30,"summary":"entity with 4 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260503175906_FinalNormalizedSubscriptionArchitecture.Designer.cs"]},{"kind":"typed-contract","label":"Microsoft.AspNetCore.Identity.IdentityRoleClaim","line":56,"summary":"entity with 4 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260503175906_FinalNormalizedSubscriptionArchitecture.Designer.cs"]},{"kind":"typed-contract","label":"Microsoft.AspNetCore.Identity.IdentityUserClaim","line":81,"summary":"entity with 4 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260503175906_FinalNormalizedSubscriptionArchitecture.Designer.cs"]},{"kind":"typed-contract","label":"Microsoft.AspNetCore.Identity.IdentityUserLogin","line":106,"summary":"entity with 4 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260503175906_FinalNormalizedSubscriptionArchitecture.Designer.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260503175906_FinalNormalizedSubscriptionArchitecture.cs.json b/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260503175906_FinalNormalizedSubscriptionArchitecture.cs.json new file mode 100644 index 0000000..92df0c8 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260503175906_FinalNormalizedSubscriptionArchitecture.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Data/Migrations/20260503175906_FinalNormalizedSubscriptionArchitecture.cs","purpose":"EF Core migration that updates DB schema for a normalized subscription and knowledge-unit architecture: alters columns, adds tenant fields and vectors, creates KnowledgeUnits/KnowledgeUnitLinks/SubscriptionPlans tables, seeds subscription plans, and adds indexes and foreign keys.","classification":{"role":"database-config","layer":"data","confidence":0.9,"evidence":["Class inherits Microsoft.EntityFrameworkCore.Migrations.Migration (line 13)","Up method creates tables, alters columns, inserts seed data and adds foreign keys/indexes (lines 16-268)"]},"className":"FinalNormalizedSubscriptionArchitecture","methods":[{"name":"Up","line":16,"endLine":268,"signature":"(migrationBuilder: MigrationBuilder) -> void","purpose":"Apply schema changes: drop/alter/add columns, create new tables (KnowledgeUnits, SubscriptionPlans, KnowledgeUnitLinks), seed subscription plans, create indexes, and add FK from AspNetUsers to SubscriptionPlans.","calls":[],"actions":[{"id":"schema-change_18","kind":"mapping","label":"Drop column CurrentPlan from AspNetUsers","line":18,"detail":"migrationBuilder.DropColumn(name: \"CurrentPlan\", table: \"AspNetUsers\")","visibility":"detail-only","confidence":0.7},{"id":"database-extension_22","kind":"mapping","label":"Enable pgvector extension annotation","line":22,"detail":"migrationBuilder.AlterDatabase().Annotation(\"Npgsql:PostgresExtension:vector\", \",,\")","visibility":"detail-only","confidence":0.7},{"id":"alter-column_25","kind":"mapping","label":"Alter CreatedAt in SemanticKnowledgeCache to timestamptz","line":25,"detail":"AlterColumn type -> \"timestamp with time zone\" (lines 25-31)","visibility":"detail-only","confidence":0.7},{"id":"add-column_33","kind":"mapping","label":"Add OriginalText to SemanticKnowledgeCache","line":33,"detail":"AddColumn(name: \"OriginalText\", table: \"SemanticKnowledgeCache\", type: \"text\", nullable: false, defaultValue: \"\")","visibility":"detail-only","confidence":0.7},{"id":"add-column_40","kind":"mapping","label":"Add TenantId to SemanticKnowledgeCache","line":40,"detail":"AddColumn(name: \"TenantId\", table: \"SemanticKnowledgeCache\", maxLength:128, nullable:false)","visibility":"detail-only","confidence":0.7},{"id":"add-column_48","kind":"mapping","label":"Add Vector (pgvector) to SemanticKnowledgeCache","line":48,"detail":"AddColumn(name: \"Vector\", table: \"SemanticKnowledgeCache\", type: \"vector(1536)\", nullable: true)","visibility":"detail-only","confidence":0.7},{"id":"alter-column_54","kind":"mapping","label":"Alter CompletedDate in QuizResults to timestamptz","line":54,"detail":"AlterColumn type -> \"timestamp with time zone\" (lines 54-60)","visibility":"detail-only","confidence":0.7},{"id":"add-column_62","kind":"mapping","label":"Add TenantId to QuizResults","line":62,"detail":"AddColumn(name: \"TenantId\", table: \"QuizResults\", maxLength:128, nullable:false)","visibility":"detail-only","confidence":0.7},{"id":"alter-column_70","kind":"mapping","label":"Alter LastReadDate and AddedDate in Ebooks to timestamptz","line":70,"detail":"AlterColumn for LastReadDate and AddedDate to \"timestamp with time zone\" (lines 70-85)","visibility":"detail-only","confidence":0.7},{"id":"add-column_87","kind":"mapping","label":"Add TenantId to Ebooks","line":87,"detail":"AddColumn(name: \"TenantId\", table: \"Ebooks\", maxLength:128, nullable:false)","visibility":"detail-only","confidence":0.7},{"id":"alter-column_95","kind":"mapping","label":"Change AspNetUsers.TenantId type from Guid(uuid) to string(128)","line":95,"detail":"AlterColumn(name: \"TenantId\", table: \"AspNetUsers\", type: \"character varying(128)\")","visibility":"detail-only","confidence":0.7},{"id":"add-column_104","kind":"mapping","label":"Add DisplayName, LastAiActionDate, LastReadAt, LastReadPageId, SubscriptionPlanId to AspNetUsers","line":104,"detail":"Multiple AddColumn calls to extend AspNetUsers with profile/usage/subscription fields (lines 104-135)","visibility":"detail-only","confidence":0.7},{"id":"create-table_137","kind":"mapping","label":"Create KnowledgeUnits table","line":137,"detail":"Creates KnowledgeUnits with Id, SourceId, Version, Type, Content, MetadataJson, TenantId, Vector (vector(768)), CreatedAt and PK on Id (lines 137-154)","visibility":"detail-only","confidence":0.7},{"id":"create-table_156","kind":"mapping","label":"Create SubscriptionPlans table","line":156,"detail":"Creates SubscriptionPlans with Id (identity), PlanName, AITokenLimit, MonthlyPrice, StripeProductId and PK (lines 156-170)","visibility":"detail-only","confidence":0.7},{"id":"create-table_172","kind":"mapping","label":"Create KnowledgeUnitLinks table with FKs","line":172,"detail":"Creates KnowledgeUnitLinks (Id, SourceUnitId, TargetUnitId, RelationType), PK and two FK constraints referencing KnowledgeUnits with Cascade delete (lines 172-197)","visibility":"detail-only","confidence":0.7},{"id":"data-seed_199","kind":"mapping","label":"Seed SubscriptionPlans data","line":199,"detail":"migrationBuilder.InsertData into SubscriptionPlans for Free, Basic, Pro, Enterprise (lines 199-208)","visibility":"detail-only","confidence":0.7},{"id":"create-index_210","kind":"mapping","label":"Create tenant and FK indexes","line":210,"detail":"Creates indexes on SemanticKnowledgeCache.TenantId, QuizResults.TenantId, Ebooks.TenantId, AspNetUsers.SubscriptionPlanId, AspNetUsers.TenantId and indexes for KnowledgeUnits and KnowledgeUnitLinks (lines 210-259)","visibility":"detail-only","confidence":0.7},{"id":"add-foreign-key_261","kind":"mapping","label":"Add FK AspNetUsers.SubscriptionPlanId -> SubscriptionPlans.Id","line":261,"detail":"migrationBuilder.AddForeignKey with ReferentialAction.Restrict (lines 261-267)","visibility":"detail-only","confidence":0.7}]},{"name":"Down","line":271,"endLine":397,"signature":"(migrationBuilder: MigrationBuilder) -> void","purpose":"Revert the Up changes: remove foreign key, drop created tables and indexes, drop added columns, revert column types and re-add the old CurrentPlan column.","calls":[],"actions":[{"id":"drop-foreign-key_273","kind":"mapping","label":"Drop FK AspNetUsers -> SubscriptionPlans","line":273,"detail":"migrationBuilder.DropForeignKey(name: \"FK_AspNetUsers_SubscriptionPlans_SubscriptionPlanId\")","visibility":"detail-only","confidence":0.7},{"id":"drop-table_277","kind":"mapping","label":"Drop KnowledgeUnitLinks, SubscriptionPlans, KnowledgeUnits","line":277,"detail":"migrationBuilder.DropTable calls for KnowledgeUnitLinks, SubscriptionPlans, KnowledgeUnits (lines 277-284)","visibility":"detail-only","confidence":0.7},{"id":"drop-index_286","kind":"mapping","label":"Drop tenant and FK indexes","line":286,"detail":"migrationBuilder.DropIndex for SemanticKnowledgeCache.TenantId, QuizResults.TenantId, Ebooks.TenantId, AspNetUsers.SubscriptionPlanId, AspNetUsers.TenantId (lines 286-304)","visibility":"detail-only","confidence":0.7},{"id":"drop-column_306","kind":"mapping","label":"Drop columns added in Up (OriginalText, TenantId, Vector, DisplayName, LastAiActionDate, LastReadAt, LastReadPageId, SubscriptionPlanId)","line":306,"detail":"Multiple DropColumn calls removing added columns from SemanticKnowledgeCache, QuizResults, Ebooks, AspNetUsers (lines 306-344)","visibility":"detail-only","confidence":0.7},{"id":"database-extension_346","kind":"mapping","label":"Remove pgvector database annotation","line":346,"detail":"migrationBuilder.AlterDatabase().OldAnnotation(\"Npgsql:PostgresExtension:vector\", \",,\")","visibility":"detail-only","confidence":0.7},{"id":"alter-column_349","kind":"mapping","label":"Revert datetime column types to timestamp without time zone","line":349,"detail":"AlterColumn calls reverting CreatedAt, CompletedDate, LastReadDate, AddedDate types back to \"timestamp without time zone\" (lines 349-380)","visibility":"detail-only","confidence":0.7},{"id":"alter-column_382","kind":"mapping","label":"Revert AspNetUsers.TenantId to Guid/uuid","line":382,"detail":"AlterColumn(name: \"TenantId\", table: \"AspNetUsers\", type: \"uuid\") (lines 382-389)","visibility":"detail-only","confidence":0.7},{"id":"add-column_391","kind":"mapping","label":"Re-add CurrentPlan column to AspNetUsers","line":391,"detail":"AddColumn(name: \"CurrentPlan\", table: \"AspNetUsers\", type: \"text\", nullable: false, defaultValue: \"\")","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"KnowledgeUnits","kind":"entity","line":137,"purpose":"Table storing normalized knowledge units with content, metadata, tenant scoping, vector embedding and creation timestamp.","fields":[{"name":"Id","type":"string (character varying(128))","required":true,"line":141,"description":"Primary key"},{"name":"SourceId","type":"string (character varying(128))","required":true,"line":142,"description":"Original source identifier"},{"name":"Version","type":"string (character varying(50))","required":true,"line":143,"description":"Source/version marker"},{"name":"Type","type":"int","required":true,"line":144,"description":"Enumerated type discriminator"},{"name":"Content","type":"string (text)","required":true,"line":145,"description":"Unit content"},{"name":"MetadataJson","type":"string (text)","required":false,"line":146,"description":"Optional metadata as JSON"},{"name":"TenantId","type":"string (character varying(128))","required":true,"line":147,"description":"Tenant scoping id"},{"name":"Vector","type":"Vector (vector(768))","required":false,"line":148,"description":"Embedding vector (pgvector)"},{"name":"CreatedAt","type":"DateTime (timestamptz)","required":true,"line":149,"description":"Creation timestamp"}]},{"name":"SubscriptionPlans","kind":"entity","line":156,"purpose":"Plan catalog table describing available subscription tiers, token limits, pricing and Stripe product mapping.","fields":[{"name":"Id","type":"int (identity)","required":true,"line":160,"description":"Primary key/identity"},{"name":"PlanName","type":"string (character varying(50))","required":true,"line":162,"description":"Unique plan name"},{"name":"AITokenLimit","type":"int","required":true,"line":163,"description":"AI token limit for plan"},{"name":"MonthlyPrice","type":"decimal","required":true,"line":164,"description":"Recurring price"},{"name":"StripeProductId","type":"string (character varying(50))","required":true,"line":165,"description":"Stripe product identifier"}]},{"name":"KnowledgeUnitLinks","kind":"entity","line":172,"purpose":"Table representing directed relationships between KnowledgeUnits with a relation type.","fields":[{"name":"Id","type":"int (identity)","required":true,"line":176,"description":"Primary key"},{"name":"SourceUnitId","type":"string (character varying(128))","required":true,"line":178,"description":"FK to KnowledgeUnits.Id (source)"},{"name":"TargetUnitId","type":"string (character varying(128))","required":true,"line":179,"description":"FK to KnowledgeUnits.Id (target)"},{"name":"RelationType","type":"string (character varying(50))","required":true,"line":180,"description":"Type of relation"}]},{"name":"FinalNormalizedSubscriptionArchitecture","kind":"model","line":13,"purpose":"Migration class that encapsulates Up/Down schema change operations.","fields":[]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["Npgsql.EntityFrameworkCore.PostgreSQL","Pgvector"],"patterns":["Migration","Schema Migration","Data Seeding"],"domainConcepts":["SubscriptionPlan","KnowledgeUnit","Tenant","Embedding Vector"],"keyDetails":"Adds tenant scoping and vector support (pgvector) to knowledge tables, normalizes knowledge storage with link table, introduces SubscriptionPlans with seeded tiers, and links users to plans via SubscriptionPlanId FK.","orchestrationMethods":[],"typedContracts":[{"name":"KnowledgeUnits","kind":"entity","line":137,"fieldCount":9,"evidencePaths":["NexusReader.Data/Migrations/20260503175906_FinalNormalizedSubscriptionArchitecture.cs"]},{"name":"SubscriptionPlans","kind":"entity","line":156,"fieldCount":5,"evidencePaths":["NexusReader.Data/Migrations/20260503175906_FinalNormalizedSubscriptionArchitecture.cs"]},{"name":"KnowledgeUnitLinks","kind":"entity","line":172,"fieldCount":4,"evidencePaths":["NexusReader.Data/Migrations/20260503175906_FinalNormalizedSubscriptionArchitecture.cs"]},{"name":"FinalNormalizedSubscriptionArchitecture","kind":"model","line":13,"fieldCount":0,"evidencePaths":["NexusReader.Data/Migrations/20260503175906_FinalNormalizedSubscriptionArchitecture.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"KnowledgeUnits","line":137,"summary":"entity with 9 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260503175906_FinalNormalizedSubscriptionArchitecture.cs"]},{"kind":"typed-contract","label":"SubscriptionPlans","line":156,"summary":"entity with 5 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260503175906_FinalNormalizedSubscriptionArchitecture.cs"]},{"kind":"typed-contract","label":"KnowledgeUnitLinks","line":172,"summary":"entity with 4 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260503175906_FinalNormalizedSubscriptionArchitecture.cs"]},{"kind":"typed-contract","label":"FinalNormalizedSubscriptionArchitecture","line":13,"summary":"model with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260503175906_FinalNormalizedSubscriptionArchitecture.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260506184227_UpdateSubscriptionPlanIsUnlimitedTokens.Designer.cs.json b/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260506184227_UpdateSubscriptionPlanIsUnlimitedTokens.Designer.cs.json new file mode 100644 index 0000000..51b5265 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260506184227_UpdateSubscriptionPlanIsUnlimitedTokens.Designer.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Data/Migrations/20260506184227_UpdateSubscriptionPlanIsUnlimitedTokens.Designer.cs","purpose":"EF Core migration designer that reconstructs the target EF model for the migration \"20260506184227_UpdateSubscriptionPlanIsUnlimitedTokens\"; it configures entities, relationships, indexes and seeds SubscriptionPlan data.","classification":{"role":"database-config","layer":"data","confidence":0.9,"evidence":["DTO/view-model naming pattern","Class annotated with [DbContext(typeof(AppDbContext))] and [Migration(...)]","Contains BuildTargetModel(ModelBuilder) which defines entities, relationships, indexes and HasData seed"]},"className":"UpdateSubscriptionPlanIsUnlimitedTokens","methods":[{"name":"BuildTargetModel","line":20,"endLine":657,"signature":"(modelBuilder: ModelBuilder) -> void","purpose":"Rebuilds the EF Core model for the migration: adds annotations, DB extensions, defines entity mappings, relationships, indexes and seeds data (notably SubscriptionPlan entries).","calls":[],"actions":[{"id":"index_23","kind":"mapping","label":"Define indexes and unique constraints","line":23,"detail":"Multiple HasIndex(...) and .IsUnique() calls across entity configs (e.g. RoleNameIndex, UserNameIndex, SubscriptionPlan.PlanName unique) visible inline with entity definitions","visibility":"detail-only","confidence":0.7},{"id":"annotation_23","kind":"mapping","label":"Set model-level annotations","line":23,"detail":"modelBuilder.HasAnnotation(\"ProductVersion\", \"10.0.7\").HasAnnotation(\"Relational:MaxIdentifierLength\", 63)","visibility":"detail-only","confidence":0.7},{"id":"external-call_27","kind":"external-call","label":"Enable Postgres vector extension","line":27,"detail":"NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, \"vector\")","visibility":"detail-only","confidence":0.7},{"id":"external-call_28","kind":"external-call","label":"Configure identity column behavior (Postgres)","line":28,"detail":"NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder)","visibility":"detail-only","confidence":0.7},{"id":"entity-configuration_30","kind":"mapping","label":"Define entity mappings for domain and identity entities","line":30,"detail":"Multiple modelBuilder.Entity(...) fluent configurations for Identity roles/users and domain entities (Ebook, KnowledgeUnit, KnowledgeUnitLink, NexusUser, QuizResult, SemanticKnowledgeCache, SubscriptionPlan, etc.) spanning lines 30..500+","visibility":"detail-only","confidence":0.7},{"id":"data-seed_501","kind":"mapping","label":"Seed SubscriptionPlan lookup rows","line":501,"detail":"b.HasData(...) seeds 4 SubscriptionPlan records (Free, Basic, Pro, Enterprise) including Enterprise with IsUnlimitedTokens = true and very large AITokenLimit","visibility":"detail-only","confidence":0.7},{"id":"relationship_540","kind":"mapping","label":"Configure relationships and foreign keys","line":540,"detail":"Multiple b.HasOne(...).WithMany(...).HasForeignKey(...).OnDelete(...) declarations configuring FK relations and navigation properties for Identity and domain entities (lines 540..630)","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"SubscriptionPlan","kind":"entity","line":467,"purpose":"Represents subscription tier metadata (token limits, pricing, stripe product id) and is seeded with default plans.","fields":[{"name":"Id","type":"int","required":true,"line":469,"description":"Primary key, identity"},{"name":"AITokenLimit","type":"int","required":true,"line":475,"description":"Token allotment for plan"},{"name":"IsUnlimitedTokens","type":"bool","required":true,"line":478,"description":"Flag to mark unlimited token plans"},{"name":"MonthlyPrice","type":"decimal","required":true,"line":481,"description":"Monthly price"},{"name":"PlanName","type":"string","required":true,"line":484,"description":"Human-readable plan name (unique)"},{"name":"StripeProductId","type":"string","required":true,"line":489,"description":"External Stripe product id"}]},{"name":"NexusUser","kind":"entity","line":287,"purpose":"Application user entity extended from Identity that includes AI token accounting and subscription association.","fields":[{"name":"Id","type":"string","required":true,"line":289,"description":"Identity primary key"},{"name":"AITokenLimit","type":"int","required":true,"line":292,"description":"User-specific AI token allotment (from plan/default)"},{"name":"AITokensUsed","type":"int","required":true,"line":295,"description":"Count of AI tokens consumed"},{"name":"SubscriptionPlanId","type":"int","required":true,"line":352,"description":"FK to SubscriptionPlan; default value 1"},{"name":"TenantId","type":"string","required":true,"line":356,"description":"Tenant identifier for multi-tenancy"},{"name":"LastAiActionDate","type":"DateTime?","required":false,"line":316,"description":"Timestamp of last AI activity"}]},{"name":"Ebook","kind":"entity","line":162,"purpose":"Represents an uploaded ebook linked to a NexusUser and tenant context.","fields":[{"name":"Id","type":"Guid","required":true,"line":164,"description":"Primary key"},{"name":"AddedDate","type":"DateTime","required":true,"line":168,"description":"When ebook was added"},{"name":"Author","type":"string","required":true,"line":171,"description":"Author name"},{"name":"FilePath","type":"string","required":true,"line":179,"description":"Stored file path"},{"name":"TenantId","type":"string","required":true,"line":186,"description":"Tenant id"},{"name":"UserId","type":"string","required":true,"line":196,"description":"Owner user id (FK)"}]},{"name":"KnowledgeUnit","kind":"entity","line":209,"purpose":"Semantic document/chunk with vector embedding and metadata used for retrieval and similarity search.","fields":[{"name":"Id","type":"string","required":true,"line":211,"description":"Entity id (max length 128)"},{"name":"Content","type":"string","required":true,"line":215,"description":"Text content"},{"name":"CreatedAt","type":"DateTime","required":true,"line":219,"description":"Creation timestamp"},{"name":"SourceId","type":"string","required":true,"line":225,"description":"Source identifier"},{"name":"TenantId","type":"string","required":true,"line":230,"description":"Tenant id"},{"name":"Vector","type":"Vector","required":false,"line":238,"description":"PgVector embedding (vector(768))"},{"name":"Version","type":"string","required":true,"line":241,"description":"Version of content/pipeline"}]},{"name":"KnowledgeUnitLink","kind":"entity","line":255,"purpose":"Represents directed relation between knowledge units (source -> target) with a relation type.","fields":[{"name":"Id","type":"int","required":true,"line":257,"description":"Primary key, identity"},{"name":"RelationType","type":"string","required":true,"line":263,"description":"Type/label of relation"},{"name":"SourceUnitId","type":"string","required":true,"line":268,"description":"FK to source KnowledgeUnit"},{"name":"TargetUnitId","type":"string","required":true,"line":273,"description":"FK to target KnowledgeUnit"}]},{"name":"SemanticKnowledgeCache","kind":"entity","line":422,"purpose":"Cache of semantic retrieval results with vector, original text and JSON data keyed by content hash.","fields":[{"name":"ContentHash","type":"string","required":true,"line":424,"description":"Primary key / unique hash"},{"name":"CreatedAt","type":"DateTime","required":true,"line":428,"description":"When cache entry was created"},{"name":"JsonData","type":"string","required":true,"line":431,"description":"Serialized cached results"},{"name":"ModelId","type":"string","required":true,"line":435,"description":"Model identifier used to generate vector"},{"name":"Vector","type":"Vector","required":false,"line":454,"description":"PgVector embedding (vector(1536))"}]},{"name":"QuizResult","kind":"entity","line":385,"purpose":"Stores results of quizzes taken by users (tenant-scoped).","fields":[{"name":"Id","type":"Guid","required":true,"line":387,"description":"Primary key"},{"name":"CompletedDate","type":"DateTime","required":true,"line":391,"description":"Completion timestamp"},{"name":"Score","type":"int","required":true,"line":394,"description":"Numeric score"},{"name":"TenantId","type":"string","required":true,"line":397,"description":"Tenant id"},{"name":"UserId","type":"string","required":true,"line":409,"description":"User FK"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Data/Persistence/AppDbContext.cs","NexusReader.Domain/Entities/SubscriptionPlan.cs","NexusReader.Domain/Entities/NexusUser.cs","NexusReader.Domain/Entities/Ebook.cs","NexusReader.Domain/Entities/KnowledgeUnit.cs","NexusReader.Domain/Entities/KnowledgeUnitLink.cs","NexusReader.Domain/Entities/SemanticKnowledgeCache.cs","NexusReader.Domain/Entities/QuizResult.cs"],"patterns":["EF Core Migration","Data Seeding","Fluent Model Configuration"],"domainConcepts":["SubscriptionPlan","NexusUser","AIToken accounting","KnowledgeUnit (vector embeddings)","SemanticKnowledgeCache"],"keyDetails":"This migration's designer seeds four SubscriptionPlan rows (Free, Basic, Pro, Enterprise) and marks Enterprise as IsUnlimitedTokens=true; it also configures Postgres vector extension and sets up entity mappings, FKs and indexes for domain and identity models.","orchestrationMethods":[{"name":"BuildTargetModel","line":20,"confidence":0.69,"reason":"Contains 2 architectural actions relevant to business execution.","actionKinds":["mapping","external-call"],"evidencePaths":["NexusReader.Data/Migrations/20260506184227_UpdateSubscriptionPlanIsUnlimitedTokens.Designer.cs"]}],"typedContracts":[{"name":"SubscriptionPlan","kind":"entity","line":467,"fieldCount":6,"evidencePaths":["NexusReader.Data/Migrations/20260506184227_UpdateSubscriptionPlanIsUnlimitedTokens.Designer.cs"]},{"name":"NexusUser","kind":"entity","line":287,"fieldCount":6,"evidencePaths":["NexusReader.Data/Migrations/20260506184227_UpdateSubscriptionPlanIsUnlimitedTokens.Designer.cs"]},{"name":"Ebook","kind":"entity","line":162,"fieldCount":6,"evidencePaths":["NexusReader.Data/Migrations/20260506184227_UpdateSubscriptionPlanIsUnlimitedTokens.Designer.cs"]},{"name":"KnowledgeUnit","kind":"entity","line":209,"fieldCount":7,"evidencePaths":["NexusReader.Data/Migrations/20260506184227_UpdateSubscriptionPlanIsUnlimitedTokens.Designer.cs"]},{"name":"KnowledgeUnitLink","kind":"entity","line":255,"fieldCount":4,"evidencePaths":["NexusReader.Data/Migrations/20260506184227_UpdateSubscriptionPlanIsUnlimitedTokens.Designer.cs"]},{"name":"SemanticKnowledgeCache","kind":"entity","line":422,"fieldCount":5,"evidencePaths":["NexusReader.Data/Migrations/20260506184227_UpdateSubscriptionPlanIsUnlimitedTokens.Designer.cs"]},{"name":"QuizResult","kind":"entity","line":385,"fieldCount":5,"evidencePaths":["NexusReader.Data/Migrations/20260506184227_UpdateSubscriptionPlanIsUnlimitedTokens.Designer.cs"]}],"persistenceInteractions":[],"externalInteractions":[{"methodName":"BuildTargetModel","line":27,"kind":"external-call","detail":"NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, \"vector\")","evidencePaths":["NexusReader.Data/Migrations/20260506184227_UpdateSubscriptionPlanIsUnlimitedTokens.Designer.cs"]},{"methodName":"BuildTargetModel","line":28,"kind":"external-call","detail":"NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder)","evidencePaths":["NexusReader.Data/Migrations/20260506184227_UpdateSubscriptionPlanIsUnlimitedTokens.Designer.cs"]}],"evidenceAnchors":[{"kind":"orchestration-method","label":"BuildTargetModel","line":20,"summary":"Contains 2 architectural actions relevant to business execution.","confidence":0.69,"evidencePaths":["NexusReader.Data/Migrations/20260506184227_UpdateSubscriptionPlanIsUnlimitedTokens.Designer.cs"]},{"kind":"typed-contract","label":"SubscriptionPlan","line":467,"summary":"entity with 6 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260506184227_UpdateSubscriptionPlanIsUnlimitedTokens.Designer.cs"]},{"kind":"typed-contract","label":"NexusUser","line":287,"summary":"entity with 6 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260506184227_UpdateSubscriptionPlanIsUnlimitedTokens.Designer.cs"]},{"kind":"typed-contract","label":"Ebook","line":162,"summary":"entity with 6 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260506184227_UpdateSubscriptionPlanIsUnlimitedTokens.Designer.cs"]},{"kind":"typed-contract","label":"KnowledgeUnit","line":209,"summary":"entity with 7 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260506184227_UpdateSubscriptionPlanIsUnlimitedTokens.Designer.cs"]},{"kind":"external-call","label":"BuildTargetModel","line":27,"summary":"NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, \"vector\")","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260506184227_UpdateSubscriptionPlanIsUnlimitedTokens.Designer.cs"]},{"kind":"external-call","label":"BuildTargetModel","line":28,"summary":"NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder)","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260506184227_UpdateSubscriptionPlanIsUnlimitedTokens.Designer.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260506184227_UpdateSubscriptionPlanIsUnlimitedTokens.cs.json b/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260506184227_UpdateSubscriptionPlanIsUnlimitedTokens.cs.json new file mode 100644 index 0000000..e0902f6 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260506184227_UpdateSubscriptionPlanIsUnlimitedTokens.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Data/Migrations/20260506184227_UpdateSubscriptionPlanIsUnlimitedTokens.cs","purpose":"EF Core migration that adds an IsUnlimitedTokens boolean column to the SubscriptionPlans table and updates seed data for existing subscription plan rows; provides a Down migration to revert these schema and data changes.","classification":{"role":"database-config","layer":"data","confidence":0.9,"evidence":["DTO/view-model naming pattern","Namespace NexusReader.Data.Migrations and class inherits Migration","Calls migrationBuilder.AddColumn, UpdateData, DropColumn to change schema and seed data"]},"className":"UpdateSubscriptionPlanIsUnlimitedTokens","methods":[{"name":"Up","line":11,"endLine":47,"signature":"(migrationBuilder: MigrationBuilder) -> void","purpose":"Apply schema change by adding IsUnlimitedTokens column to SubscriptionPlans and update seed data for several subscription plan rows.","calls":[{"targetFile":"unknown","targetMethod":"AddColumn","callLine":13,"paramSummary":"adds boolean column 'IsUnlimitedTokens' to table 'SubscriptionPlans' with defaultValue: false"},{"targetFile":"unknown","targetMethod":"UpdateData","callLine":20,"paramSummary":"updates SubscriptionPlans row Id=1 setting AITokenLimit=5000, IsUnlimitedTokens=false, StripeProductId='prod_Free789'"},{"targetFile":"unknown","targetMethod":"UpdateData","callLine":27,"paramSummary":"updates SubscriptionPlans row Id=2 setting IsUnlimitedTokens=false"},{"targetFile":"unknown","targetMethod":"UpdateData","callLine":34,"paramSummary":"updates SubscriptionPlans row Id=3 setting IsUnlimitedTokens=false"},{"targetFile":"unknown","targetMethod":"UpdateData","callLine":41,"paramSummary":"updates SubscriptionPlans row Id=4 setting AITokenLimit=1000000000, IsUnlimitedTokens=true"}],"actions":[{"id":"schema-change_13","kind":"mapping","label":"Add column IsUnlimitedTokens","line":13,"detail":"migrationBuilder.AddColumn(name: 'IsUnlimitedTokens', table: 'SubscriptionPlans', type: 'boolean', nullable: false, defaultValue: false)","visibility":"detail-only","confidence":0.7},{"id":"data-update_20","kind":"mapping","label":"Seed update for plan Id=1","line":20,"detail":"UpdateData sets AITokenLimit, IsUnlimitedTokens, StripeProductId","visibility":"detail-only","confidence":0.7},{"id":"data-update_27","kind":"mapping","label":"Seed update for plan Id=2","line":27,"detail":"UpdateData sets IsUnlimitedTokens","visibility":"detail-only","confidence":0.7},{"id":"data-update_34","kind":"mapping","label":"Seed update for plan Id=3","line":34,"detail":"UpdateData sets IsUnlimitedTokens","visibility":"detail-only","confidence":0.7},{"id":"data-update_41","kind":"mapping","label":"Seed update for plan Id=4 (unlimited)","line":41,"detail":"UpdateData sets AITokenLimit to large value and IsUnlimitedTokens=true","visibility":"detail-only","confidence":0.7}]},{"name":"Down","line":50,"endLine":69,"signature":"(migrationBuilder: MigrationBuilder) -> void","purpose":"Revert the Up migration: drop the IsUnlimitedTokens column and restore previous seed values for specified subscription plan rows.","calls":[{"targetFile":"unknown","targetMethod":"DropColumn","callLine":52,"paramSummary":"drops column 'IsUnlimitedTokens' from table 'SubscriptionPlans'"},{"targetFile":"unknown","targetMethod":"UpdateData","callLine":56,"paramSummary":"updates SubscriptionPlans row Id=1 setting AITokenLimit=1000, StripeProductId=''"},{"targetFile":"unknown","targetMethod":"UpdateData","callLine":63,"paramSummary":"updates SubscriptionPlans row Id=4 setting AITokenLimit=500000"}],"actions":[{"id":"schema-change_52","kind":"mapping","label":"Drop column IsUnlimitedTokens","line":52,"detail":"migrationBuilder.DropColumn(name: 'IsUnlimitedTokens', table: 'SubscriptionPlans')","visibility":"detail-only","confidence":0.7},{"id":"data-update_56","kind":"mapping","label":"Restore seed for plan Id=1","line":56,"detail":"UpdateData restores AITokenLimit and StripeProductId","visibility":"detail-only","confidence":0.7},{"id":"data-update_63","kind":"mapping","label":"Restore seed for plan Id=4","line":63,"detail":"UpdateData restores AITokenLimit","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"UpdateSubscriptionPlanIsUnlimitedTokens","kind":"model","line":8,"purpose":"EF Core migration class that encapsulates schema changes and seed data updates to support an IsUnlimitedTokens flag on SubscriptionPlans.","fields":[]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["EF Core Migration","Data Seeding"],"domainConcepts":["SubscriptionPlan","AITokenLimit","IsUnlimitedTokens","StripeProductId"],"keyDetails":"Adds IsUnlimitedTokens boolean to SubscriptionPlans with default false; updates seed rows (Id 1..4) to set token limits and stripe product id; Down removes the column and restores previous seed values.","orchestrationMethods":[{"name":"Up","line":11,"confidence":0.85,"reason":"Coordinates 5 downstream calls with 0 architectural actions.","actionKinds":["mapping"],"evidencePaths":["NexusReader.Data/Migrations/20260506184227_UpdateSubscriptionPlanIsUnlimitedTokens.cs","unknown","unknown","unknown","unknown","unknown"]},{"name":"Down","line":50,"confidence":0.69,"reason":"Coordinates 3 downstream calls with 0 architectural actions.","actionKinds":["mapping"],"evidencePaths":["NexusReader.Data/Migrations/20260506184227_UpdateSubscriptionPlanIsUnlimitedTokens.cs","unknown","unknown","unknown"]}],"typedContracts":[{"name":"UpdateSubscriptionPlanIsUnlimitedTokens","kind":"model","line":8,"fieldCount":0,"evidencePaths":["NexusReader.Data/Migrations/20260506184227_UpdateSubscriptionPlanIsUnlimitedTokens.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"orchestration-method","label":"Up","line":11,"summary":"Coordinates 5 downstream calls with 0 architectural actions.","confidence":0.85,"evidencePaths":["NexusReader.Data/Migrations/20260506184227_UpdateSubscriptionPlanIsUnlimitedTokens.cs","unknown","unknown","unknown","unknown","unknown"]},{"kind":"orchestration-method","label":"Down","line":50,"summary":"Coordinates 3 downstream calls with 0 architectural actions.","confidence":0.69,"evidencePaths":["NexusReader.Data/Migrations/20260506184227_UpdateSubscriptionPlanIsUnlimitedTokens.cs","unknown","unknown","unknown"]},{"kind":"typed-contract","label":"UpdateSubscriptionPlanIsUnlimitedTokens","line":8,"summary":"model with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260506184227_UpdateSubscriptionPlanIsUnlimitedTokens.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260510151022_NormalizeAuthor.Designer.cs.json b/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260510151022_NormalizeAuthor.Designer.cs.json new file mode 100644 index 0000000..ab8f35f --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260510151022_NormalizeAuthor.Designer.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Data/Migrations/20260510151022_NormalizeAuthor.Designer.cs","purpose":"EF Core migration designer file that describes the target EF model for the NormalizeAuthor migration (DB schema, relationships, indexes, and seed data).","classification":{"role":"database-config","layer":"data","confidence":0.9,"evidence":["[Migration(\"20260510151022_NormalizeAuthor\")] attribute present","Override of BuildTargetModel(ModelBuilder) that composes the EF Core model","HasData(...) is used to seed SubscriptionPlans and PostgreSQL vector extension configured"]},"className":"NormalizeAuthor","methods":[{"name":"BuildTargetModel","line":20,"endLine":688,"signature":"(modelBuilder: ModelBuilder) -> void","purpose":"Constructs the EF Core model metadata for the migration: entity schemas, columns, indexes, relationships, navigation properties, provider-specific config and seed data.","calls":[],"actions":[{"id":"annotation_23","kind":"mapping","label":"Adds product/version and identifier length annotations","line":23,"detail":"modelBuilder.HasAnnotation(\"ProductVersion\", \"10.0.7\").HasAnnotation(\"Relational:MaxIdentifierLength\", 63)","visibility":"detail-only","confidence":0.7},{"id":"enable-extension_27","kind":"mapping","label":"Enables Postgres vector extension","line":27,"detail":"NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, \"vector\")","visibility":"detail-only","confidence":0.7},{"id":"provider-config_28","kind":"mapping","label":"Sets identity/serial column strategy for Postgres","line":28,"detail":"NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder)","visibility":"detail-only","confidence":0.7},{"id":"define-entity_30","kind":"mapping","label":"Defines AspNet Identity tables (Role, RoleClaim, UserClaim, UserLogin, UserRole, UserToken)","line":30,"detail":"Multiple modelBuilder.Entity(...) blocks define identity tables, keys, indexes and columns","visibility":"detail-only","confidence":0.7},{"id":"index_47","kind":"mapping","label":"Creates indexes and unique constraints","line":47,"detail":"Multiple HasIndex(...).IsUnique() or HasDatabaseName(...) calls across entities (example: RoleNameIndex, UserNameIndex, EmailIndex, indices on TenantId, UserId, etc.)","visibility":"detail-only","confidence":0.7},{"id":"define-entity_162","kind":"mapping","label":"Defines Author entity (Id, Name)","line":162,"detail":"Author has integer Id (identity) and required Name with max length 255; mapped to Authors table","visibility":"detail-only","confidence":0.7},{"id":"define-entity_180","kind":"mapping","label":"Defines Ebook entity with indexes and foreign keys","line":180,"detail":"Ebook has Guid Id, AuthorId, UserId, TenantId, Title, FilePath and indexes on AuthorId, TenantId, UserId","visibility":"detail-only","confidence":0.7},{"id":"define-entity_227","kind":"mapping","label":"Defines KnowledgeUnit with vector column","line":227,"detail":"KnowledgeUnit has Id, Content, CreatedAt, Vector (vector(768)), Version and indexes on SourceId and TenantId","visibility":"detail-only","confidence":0.7},{"id":"define-entity_273","kind":"mapping","label":"Defines KnowledgeUnitLink entity and indices","line":273,"detail":"Link entity with SourceUnitId/TargetUnitId relations and indices","visibility":"detail-only","confidence":0.7},{"id":"define-entity_305","kind":"mapping","label":"Defines NexusUser (AspNetUsers) with subscription FK","line":305,"detail":"NexusUser includes SubscriptionPlanId (default 1), TenantId and multiple identity fields and indexes","visibility":"detail-only","confidence":0.7},{"id":"define-entity_403","kind":"mapping","label":"Defines QuizResult and SemanticKnowledgeCache entities","line":403,"detail":"QuizResult mapped to QuizResults; SemanticKnowledgeCache mapped with unique ContentHash and vector(1536)","visibility":"detail-only","confidence":0.7},{"id":"define-entity_485","kind":"mapping","label":"Defines SubscriptionPlan entity and seeds default plans","line":485,"detail":"SubscriptionPlans table schema declared and HasData(...) inserts Free, Basic, Pro, Enterprise rows","visibility":"detail-only","confidence":0.7},{"id":"data-seed_519","kind":"mapping","label":"Seeds SubscriptionPlan rows","line":519,"detail":"b.HasData(new { Id = 1, ...}, new { Id = 2, ...}, new { Id = 3, ...}, new { Id = 4, ... }) — inserts 4 plans with token limits and StripeProductId placeholders","visibility":"detail-only","confidence":0.7},{"id":"relationship_558","kind":"mapping","label":"Configures FK constraints and navigation properties","line":558,"detail":"HasOne/WithMany config for role claims, user claims, logins, roles, tokens, Ebook->Author/User, KnowledgeUnitLink->Source/Target, NexusUser->SubscriptionPlan, QuizResult->User","visibility":"detail-only","confidence":0.7},{"id":"navigation-setup_669","kind":"mapping","label":"Configures navigations for entity collections","line":669,"detail":"Calls to b.Navigation(...) for Ebooks, IncomingLinks, OutgoingLinks, QuizResults, etc.","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"NormalizeAuthor","kind":"model","line":17,"purpose":"Partial migration class that contains the EF Core target model builder for the NormalizeAuthor migration.","fields":[]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Data/Persistence/AppDbContext.cs","NexusReader.Domain/Entities/*"],"patterns":["EF Core Migration","Data Seeding","Relational Mapping"],"domainConcepts":["Author","Ebook","KnowledgeUnit","KnowledgeUnitLink","NexusUser","QuizResult","SemanticKnowledgeCache","SubscriptionPlan","AspNet Identity (roles/users/claims)"],"keyDetails":"This designer migration configures PostgreSQL vector extension and vector columns (768/1536), sets Postgres identity behavior, defines schema for domain entities and identity tables, and seeds four SubscriptionPlan rows (Free, Basic, Pro, Enterprise).","orchestrationMethods":[],"typedContracts":[{"name":"NormalizeAuthor","kind":"model","line":17,"fieldCount":0,"evidencePaths":["NexusReader.Data/Migrations/20260510151022_NormalizeAuthor.Designer.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"NormalizeAuthor","line":17,"summary":"model with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260510151022_NormalizeAuthor.Designer.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260510151022_NormalizeAuthor.cs.json b/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260510151022_NormalizeAuthor.cs.json new file mode 100644 index 0000000..7e39eb1 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260510151022_NormalizeAuthor.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Data/Migrations/20260510151022_NormalizeAuthor.cs","purpose":"An EF Core migration that normalizes the Author on Ebooks by removing the string column and introducing an Authors table with a foreign key relation.","classification":{"role":"database-config","layer":"data","confidence":0.8,"evidence":["class inherits Microsoft.EntityFrameworkCore.Migrations.Migration","namespace NexusReader.Data.Migrations","methods Up and Down modify tables, columns, indexes and foreign keys"]},"className":"NormalizeAuthor","methods":[{"name":"Up","line":12,"endLine":50,"signature":"(migrationBuilder: MigrationBuilder) -> void","purpose":"Apply schema changes to normalize authors: remove Author string from Ebooks, add AuthorId, create Authors table, index, and foreign key.","calls":[],"actions":[{"id":"schema-change_14","kind":"mapping","label":"Drop column Ebooks.Author","line":14,"detail":"migrationBuilder.DropColumn(name: \"Author\", table: \"Ebooks\")","visibility":"detail-only","confidence":0.7},{"id":"schema-change_18","kind":"mapping","label":"Add column Ebooks.AuthorId (int, not nullable, default 0)","line":18,"detail":"migrationBuilder.AddColumn(name: \"AuthorId\", table: \"Ebooks\", type: \"integer\", nullable: false, defaultValue: 0)","visibility":"detail-only","confidence":0.7},{"id":"schema-change_25","kind":"mapping","label":"Create Authors table with Id and Name","line":25,"detail":"migrationBuilder.CreateTable(name: \"Authors\", columns: Id int identity, Name varchar(255) not null, primary key Id)","visibility":"detail-only","confidence":0.7},{"id":"schema-change_38","kind":"mapping","label":"Create index on Ebooks.AuthorId","line":38,"detail":"migrationBuilder.CreateIndex(name: \"IX_Ebooks_AuthorId\", table: \"Ebooks\", column: \"AuthorId\")","visibility":"detail-only","confidence":0.7},{"id":"schema-change_43","kind":"mapping","label":"Add foreign key Ebooks.AuthorId -> Authors.Id (Restrict on delete)","line":43,"detail":"migrationBuilder.AddForeignKey(name: \"FK_Ebooks_Authors_AuthorId\", table: \"Ebooks\", column: \"AuthorId\", principalTable: \"Authors\", principalColumn: \"Id\", onDelete: ReferentialAction.Restrict)","visibility":"detail-only","confidence":0.7}]},{"name":"Down","line":53,"endLine":77,"signature":"(migrationBuilder: MigrationBuilder) -> void","purpose":"Revert the normalization: remove foreign key, drop Authors table and index, remove AuthorId column, and restore Author string column on Ebooks.","calls":[],"actions":[{"id":"schema-change_55","kind":"mapping","label":"Drop foreign key FK_Ebooks_Authors_AuthorId","line":55,"detail":"migrationBuilder.DropForeignKey(name: \"FK_Ebooks_Authors_AuthorId\", table: \"Ebooks\")","visibility":"detail-only","confidence":0.7},{"id":"schema-change_59","kind":"mapping","label":"Drop Authors table","line":59,"detail":"migrationBuilder.DropTable(name: \"Authors\")","visibility":"detail-only","confidence":0.7},{"id":"schema-change_62","kind":"mapping","label":"Drop index IX_Ebooks_AuthorId","line":62,"detail":"migrationBuilder.DropIndex(name: \"IX_Ebooks_AuthorId\", table: \"Ebooks\")","visibility":"detail-only","confidence":0.7},{"id":"schema-change_66","kind":"mapping","label":"Drop column Ebooks.AuthorId","line":66,"detail":"migrationBuilder.DropColumn(name: \"AuthorId\", table: \"Ebooks\")","visibility":"detail-only","confidence":0.7},{"id":"schema-change_70","kind":"mapping","label":"Add column Ebooks.Author (varchar(255), not null, default \"\")","line":70,"detail":"migrationBuilder.AddColumn(name: \"Author\", table: \"Ebooks\", type: \"character varying(255)\", maxLength: 255, nullable: false, defaultValue: \"\")","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"Author (table)","kind":"entity","line":25,"purpose":"Represents the Authors table introduced by the migration (Id identity PK, Name varchar(255)).","fields":[{"name":"Id","type":"int","required":true,"line":29,"description":"Primary key, identity column"},{"name":"Name","type":"string","required":true,"line":31,"description":"Author name, varchar(255)"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["Microsoft.EntityFrameworkCore.Migrations (framework)","Npgsql.EntityFrameworkCore.PostgreSQL.Metadata (framework)"],"patterns":["EF Core Migration","Schema Migration"],"domainConcepts":["Author","Ebook"],"keyDetails":"Implements a migration that normalizes the Author string into a separate Authors table and a foreign key from Ebooks.AuthorId; Down reverses these changes.","orchestrationMethods":[],"typedContracts":[{"name":"Author (table)","kind":"entity","line":25,"fieldCount":2,"evidencePaths":["NexusReader.Data/Migrations/20260510151022_NormalizeAuthor.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"Author (table)","line":25,"summary":"entity with 2 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260510151022_NormalizeAuthor.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260510161155_AddEbookProgressAndChapter.Designer.cs.json b/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260510161155_AddEbookProgressAndChapter.Designer.cs.json new file mode 100644 index 0000000..ae300f2 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260510161155_AddEbookProgressAndChapter.Designer.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Data/Migrations/20260510161155_AddEbookProgressAndChapter.Designer.cs","purpose":"EF Core auto-generated migration designer that builds the target EF Core model for the migration AddEbookProgressAndChapter; defines tables, columns, indexes, relationships, extension usage and seed data required by this migration.","classification":{"role":"database-config","layer":"data","confidence":0.85,"evidence":["[DbContext(typeof(AppDbContext))] attribute at line 15","[Migration(\"20260510161155_AddEbookProgressAndChapter\")] attribute at line 16","Method BuildTargetModel(ModelBuilder) at line 20 configures modelBuilder entities and relationships"]},"className":"AddEbookProgressAndChapter","methods":[{"name":"BuildTargetModel","line":20,"endLine":695,"signature":"(modelBuilder: ModelBuilder) -> void (override)","purpose":"Constructs the EF Core model for this migration: annotations, extensions, entity mappings, keys, indexes, relationships and seed data.","calls":[],"actions":[{"id":"annotation_23","kind":"mapping","label":"Sets product and identifier annotations","line":23,"detail":"modelBuilder.HasAnnotation(\"ProductVersion\", \"10.0.7\").HasAnnotation(\"Relational:MaxIdentifierLength\", 63)","visibility":"detail-only","confidence":0.7},{"id":"database-extension_27","kind":"mapping","label":"Enables Postgres vector extension","line":27,"detail":"NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, \"vector\")","visibility":"detail-only","confidence":0.7},{"id":"database-config_28","kind":"mapping","label":"Configures identity columns strategy","line":28,"detail":"NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder)","visibility":"detail-only","confidence":0.7},{"id":"entity-configuration_30","kind":"mapping","label":"Configures Identity and ASP.NET Identity tables","line":30,"detail":"Multiple modelBuilder.Entity(...) calls for IdentityRole, IdentityUser etc.","visibility":"detail-only","confidence":0.7},{"id":"table-index_47","kind":"mapping","label":"Defines indexes and unique constraints","line":47,"detail":"Multiple b.HasIndex(...).IsUnique() and HasDatabaseName(...) calls across entity configs","visibility":"detail-only","confidence":0.7},{"id":"entity-configuration_162","kind":"mapping","label":"Configures NexusReader domain entities (Author, Ebook, KnowledgeUnit, etc.)","line":162,"detail":"Fluent API column, key, index, table mapping for domain entities spanning lines 162..563","visibility":"detail-only","confidence":0.7},{"id":"seed_526","kind":"mapping","label":"Seeds SubscriptionPlan rows","line":526,"detail":"b.HasData(...) with Free, Basic, Pro, Enterprise entries","visibility":"detail-only","confidence":0.7},{"id":"relationship_565","kind":"mapping","label":"Adds FK relations and navigations","line":565,"detail":"modelBuilder.Entity(...).HasOne(...).WithMany(...).HasForeignKey(...).OnDelete(...) calls define FKs and navigations (e.g., Ebook->Author, Ebook->User, KnowledgeUnitLink relations, NexusUser->SubscriptionPlan, QuizResult->User)","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"Author","kind":"entity","line":162,"purpose":"Author table mapping for domain Author entity.","fields":[{"name":"Id","type":"int","required":true,"line":164,"description":"Primary key, identity column"},{"name":"Name","type":"string","required":true,"line":170,"description":"Author name, max length 255"}]},{"name":"Ebook","kind":"entity","line":180,"purpose":"Ebook table mapping storing ebook metadata, progress and ownership.","fields":[{"name":"Id","type":"Guid","required":true,"line":182,"description":"Primary key (uuid)"},{"name":"AddedDate","type":"DateTime","required":true,"line":186,"description":"When ebook was added"},{"name":"AuthorId","type":"int","required":true,"line":189,"description":"FK to Author"},{"name":"CoverUrl","type":"string","required":false,"line":192,"description":"Cover image URL"},{"name":"FilePath","type":"string","required":true,"line":195,"description":"Stored file path"},{"name":"LastChapter","type":"string","required":false,"line":199,"description":"Last read chapter title (max 255)"},{"name":"LastReadDate","type":"DateTime?","required":false,"line":203,"description":"Nullable last read timestamp"},{"name":"Progress","type":"double","required":true,"line":206,"description":"Reading progress percentage/ratio"},{"name":"TenantId","type":"string","required":true,"line":209,"description":"Tenant identifier (max 128)"},{"name":"Title","type":"string","required":true,"line":214,"description":"Ebook title (max 255)"},{"name":"UserId","type":"string","required":true,"line":219,"description":"FK to NexusUser (owner)"}]},{"name":"KnowledgeUnit","kind":"entity","line":234,"purpose":"Stores extracted knowledge units with vector embeddings and metadata.","fields":[{"name":"Id","type":"string","required":true,"line":236,"description":"Primary key (max 128)"},{"name":"Content","type":"string","required":true,"line":240,"description":"Text payload"},{"name":"CreatedAt","type":"DateTime","required":true,"line":244,"description":"Creation timestamp"},{"name":"MetadataJson","type":"string","required":false,"line":247,"description":"Optional JSON metadata"},{"name":"SourceId","type":"string","required":true,"line":250,"description":"Source identifier (max 128)"},{"name":"TenantId","type":"string","required":true,"line":255,"description":"Tenant identifier (max 128)"},{"name":"Type","type":"int","required":true,"line":260,"description":"Unit type enum/int"},{"name":"Vector","type":"Vector","required":false,"line":263,"description":"Embedding vector column (vector(768))"},{"name":"Version","type":"string","required":true,"line":266,"description":"Version string (max 50)"}]},{"name":"KnowledgeUnitLink","kind":"entity","line":280,"purpose":"Represents directed relations between KnowledgeUnits.","fields":[{"name":"Id","type":"int","required":true,"line":282,"description":"Primary key identity"},{"name":"RelationType","type":"string","required":true,"line":288,"description":"Relation type (max 50)"},{"name":"SourceUnitId","type":"string","required":true,"line":293,"description":"FK to source KnowledgeUnit (max 128)"},{"name":"TargetUnitId","type":"string","required":true,"line":298,"description":"FK to target KnowledgeUnit (max 128)"}]},{"name":"NexusUser","kind":"entity","line":312,"purpose":"Application user mapping (extends IdentityUser) with tenant and AI usage tracking.","fields":[{"name":"Id","type":"string","required":true,"line":314,"description":"User id (text)"},{"name":"AITokenLimit","type":"int","required":true,"line":317,"description":"AI token limit for user"},{"name":"AITokensUsed","type":"int","required":true,"line":320,"description":"AI tokens consumed"},{"name":"LastAiActionDate","type":"DateTime?","required":false,"line":341,"description":"When last AI action occurred"},{"name":"LastReadAt","type":"DateTime?","required":false,"line":344,"description":"Last read timestamp"},{"name":"LastReadPageId","type":"string","required":false,"line":347,"description":"Last read page identifier (max 255)"},{"name":"SubscriptionPlanId","type":"int","required":true,"line":377,"description":"FK to subscription plan with default value 1"},{"name":"TenantId","type":"string","required":true,"line":382,"description":"Tenant identifier (max 128)"}]},{"name":"QuizResult","kind":"entity","line":410,"purpose":"Represents user's quiz results tied to tenant and user.","fields":[{"name":"Id","type":"Guid","required":true,"line":412,"description":"Primary key (uuid)"},{"name":"CompletedDate","type":"DateTime","required":true,"line":416,"description":"When quiz completed"},{"name":"Score","type":"int","required":true,"line":419,"description":"Quiz score"},{"name":"TenantId","type":"string","required":true,"line":422,"description":"Tenant id (max 128)"},{"name":"Topic","type":"string","required":true,"line":427,"description":"Quiz topic"},{"name":"TotalQuestions","type":"int","required":true,"line":431,"description":"Total number of questions"},{"name":"UserId","type":"string","required":true,"line":434,"description":"FK to NexusUser"}]},{"name":"SemanticKnowledgeCache","kind":"entity","line":447,"purpose":"Cache of semantic knowledge embeddings and JSON data keyed by content hash and model id.","fields":[{"name":"ContentHash","type":"string","required":true,"line":449,"description":"Primary key/content hash (max 128)"},{"name":"CreatedAt","type":"DateTime","required":true,"line":453,"description":"Creation timestamp"},{"name":"JsonData","type":"string","required":true,"line":456,"description":"Serialized result JSON"},{"name":"ModelId","type":"string","required":true,"line":460,"description":"Model identifier (max 50)"},{"name":"OriginalText","type":"string","required":true,"line":465,"description":"Original input text"},{"name":"PromptVersion","type":"string","required":true,"line":469,"description":"Prompt version string (max 10)"},{"name":"TenantId","type":"string","required":true,"line":474,"description":"Tenant identifier (max 128)"},{"name":"Vector","type":"Vector","required":false,"line":479,"description":"Embedding vector column (vector(1536))"}]},{"name":"SubscriptionPlan","kind":"entity","line":492,"purpose":"Subscription plans with AI token limits and pricing; also seeded with default plans.","fields":[{"name":"Id","type":"int","required":true,"line":494,"description":"Primary key identity"},{"name":"AITokenLimit","type":"int","required":true,"line":500,"description":"Token limit for plan"},{"name":"IsUnlimitedTokens","type":"bool","required":true,"line":503,"description":"Flag for unlimited tokens"},{"name":"MonthlyPrice","type":"decimal","required":true,"line":506,"description":"Plan monthly price"},{"name":"PlanName","type":"string","required":true,"line":509,"description":"Plan name (max 50), unique"},{"name":"StripeProductId","type":"string","required":true,"line":514,"description":"Stripe product id (max 50)"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Data/Persistence/AppDbContext.cs"],"patterns":["EF Core Migration","Fluent API","Data Seeding"],"domainConcepts":["Ebook","Author","KnowledgeUnit","KnowledgeUnitLink","NexusUser","QuizResult","SemanticKnowledgeCache","SubscriptionPlan"],"keyDetails":"Auto-generated EF Core migration designer that configures Postgres vector extension and vector columns, sets identity defaults, maps domain entities to tables with keys/indexes/foreign keys, and seeds SubscriptionPlan rows (Free, Basic, Pro, Enterprise). The BuildTargetModel method (lines 20..695) contains all model configuration.","orchestrationMethods":[],"typedContracts":[{"name":"Author","kind":"entity","line":162,"fieldCount":2,"evidencePaths":["NexusReader.Data/Migrations/20260510161155_AddEbookProgressAndChapter.Designer.cs"]},{"name":"Ebook","kind":"entity","line":180,"fieldCount":11,"evidencePaths":["NexusReader.Data/Migrations/20260510161155_AddEbookProgressAndChapter.Designer.cs"]},{"name":"KnowledgeUnit","kind":"entity","line":234,"fieldCount":9,"evidencePaths":["NexusReader.Data/Migrations/20260510161155_AddEbookProgressAndChapter.Designer.cs"]},{"name":"KnowledgeUnitLink","kind":"entity","line":280,"fieldCount":4,"evidencePaths":["NexusReader.Data/Migrations/20260510161155_AddEbookProgressAndChapter.Designer.cs"]},{"name":"NexusUser","kind":"entity","line":312,"fieldCount":8,"evidencePaths":["NexusReader.Data/Migrations/20260510161155_AddEbookProgressAndChapter.Designer.cs"]},{"name":"QuizResult","kind":"entity","line":410,"fieldCount":7,"evidencePaths":["NexusReader.Data/Migrations/20260510161155_AddEbookProgressAndChapter.Designer.cs"]},{"name":"SemanticKnowledgeCache","kind":"entity","line":447,"fieldCount":8,"evidencePaths":["NexusReader.Data/Migrations/20260510161155_AddEbookProgressAndChapter.Designer.cs"]},{"name":"SubscriptionPlan","kind":"entity","line":492,"fieldCount":6,"evidencePaths":["NexusReader.Data/Migrations/20260510161155_AddEbookProgressAndChapter.Designer.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"Author","line":162,"summary":"entity with 2 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260510161155_AddEbookProgressAndChapter.Designer.cs"]},{"kind":"typed-contract","label":"Ebook","line":180,"summary":"entity with 11 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260510161155_AddEbookProgressAndChapter.Designer.cs"]},{"kind":"typed-contract","label":"KnowledgeUnit","line":234,"summary":"entity with 9 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260510161155_AddEbookProgressAndChapter.Designer.cs"]},{"kind":"typed-contract","label":"KnowledgeUnitLink","line":280,"summary":"entity with 4 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260510161155_AddEbookProgressAndChapter.Designer.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260510161155_AddEbookProgressAndChapter.cs.json b/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260510161155_AddEbookProgressAndChapter.cs.json new file mode 100644 index 0000000..264c691 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260510161155_AddEbookProgressAndChapter.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Data/Migrations/20260510161155_AddEbookProgressAndChapter.cs","purpose":"EF Core migration that modifies the Ebooks table to add a nullable LastChapter column and a non-null Progress column with default 0.0; provides Up and Down schema change paths.","classification":{"role":"database-config","layer":"data","confidence":0.9,"evidence":["Class inherits Microsoft.EntityFrameworkCore.Migrations.Migration","Defines Up and Down methods that add/drop columns on the Ebooks table","Located under NexusReader.Data.Migrations namespace"]},"className":"AddEbookProgressAndChapter","methods":[{"name":"Up","line":11,"endLine":26,"signature":"(migrationBuilder: MigrationBuilder) -> void","purpose":"Applies schema changes: adds LastChapter (string, nullable, maxLength 255) and Progress (double, non-null, default 0.0) columns to the Ebooks table.","calls":[],"actions":[{"id":"schema-change_13","kind":"mapping","label":"Add LastChapter column","line":13,"detail":"migrationBuilder.AddColumn(name: \"LastChapter\", table: \"Ebooks\", type: \"character varying(255)\", maxLength: 255, nullable: true)","visibility":"detail-only","confidence":0.7},{"id":"schema-change_20","kind":"mapping","label":"Add Progress column","line":20,"detail":"migrationBuilder.AddColumn(name: \"Progress\", table: \"Ebooks\", type: \"double precision\", nullable: false, defaultValue: 0.0)","visibility":"detail-only","confidence":0.7},{"id":"return_26","kind":"return","label":"Complete migration Up","line":26,"detail":"Method exits after applying AddColumn calls","visibility":"detail-only","confidence":0.7}]},{"name":"Down","line":29,"endLine":38,"signature":"(migrationBuilder: MigrationBuilder) -> void","purpose":"Reverts the Up migration: drops LastChapter and Progress columns from the Ebooks table.","calls":[],"actions":[{"id":"schema-change_31","kind":"mapping","label":"Drop LastChapter column","line":31,"detail":"migrationBuilder.DropColumn(name: \"LastChapter\", table: \"Ebooks\")","visibility":"detail-only","confidence":0.7},{"id":"schema-change_35","kind":"mapping","label":"Drop Progress column","line":35,"detail":"migrationBuilder.DropColumn(name: \"Progress\", table: \"Ebooks\")","visibility":"detail-only","confidence":0.7},{"id":"return_38","kind":"return","label":"Complete migration Down","line":38,"detail":"Method exits after DropColumn calls","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"AddEbookProgressAndChapter","kind":"model","line":8,"purpose":"Represents an EF Core migration that alters the Ebooks table to track last-read chapter and reading progress.","fields":[]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["EF Core Migration","Database Migration"],"domainConcepts":["Ebook","Chapter","Progress"],"keyDetails":"Adds LastChapter (varchar(255), nullable) and Progress (double, not nullable, default 0.0) to Ebooks; provides Down to remove them.","orchestrationMethods":[],"typedContracts":[{"name":"AddEbookProgressAndChapter","kind":"model","line":8,"fieldCount":0,"evidencePaths":["NexusReader.Data/Migrations/20260510161155_AddEbookProgressAndChapter.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"AddEbookProgressAndChapter","line":8,"summary":"model with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260510161155_AddEbookProgressAndChapter.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260510171941_AddEbookLastChapterIndex.Designer.cs.json b/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260510171941_AddEbookLastChapterIndex.Designer.cs.json new file mode 100644 index 0000000..eaef1de --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260510171941_AddEbookLastChapterIndex.Designer.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Data/Migrations/20260510171941_AddEbookLastChapterIndex.Designer.cs","purpose":"EF Core migration designer for the AddEbookLastChapterIndex migration; declares the target EF model (entities, properties, indexes, relations, and seed data) used to generate the database schema for this migration.","classification":{"role":"database-config","layer":"data","confidence":0.9,"evidence":["Class annotated with [DbContext(typeof(AppDbContext))] and [Migration(...)] (lines 15-16)","Contains BuildTargetModel(ModelBuilder) that declares entities, relationships and seed data (line 20+)"]},"className":"AddEbookLastChapterIndex","methods":[{"name":"BuildTargetModel","line":20,"endLine":698,"signature":"(modelBuilder: ModelBuilder) -> void","purpose":"Constructs the EF Core model for the AddEbookLastChapterIndex migration: annotations, postgres extensions, entity mappings, indices, relationships and seed data.","calls":[],"actions":[{"id":"annotation_23","kind":"mapping","label":"Sets product version and max identifier length","line":23,"detail":"modelBuilder.HasAnnotation(\"ProductVersion\", \"10.0.7\").HasAnnotation(\"Relational:MaxIdentifierLength\", 63)","visibility":"detail-only","confidence":0.7},{"id":"external-extension-enable_27","kind":"mapping","label":"Enables Postgres vector extension","line":27,"detail":"NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, \"vector\")","visibility":"detail-only","confidence":0.7},{"id":"schema-config_28","kind":"mapping","label":"Configures identity/identity-column defaults for Postgres","line":28,"detail":"NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder)","visibility":"detail-only","confidence":0.7},{"id":"entity-declare_30","kind":"mapping","label":"Declares IdentityRole mapping","line":30,"detail":"Defines AspNetRoles table, properties, key and unique index on NormalizedName","visibility":"detail-only","confidence":0.7},{"id":"entity-declare_56","kind":"mapping","label":"Declares Identity-related mappings (claims, logins, tokens, roles)","line":56,"detail":"Defines AspNetRoleClaims, AspNetUserClaims, AspNetUserLogins, AspNetUserRoles, AspNetUserTokens with keys and FK indices","visibility":"detail-only","confidence":0.7},{"id":"entity-declare_162","kind":"mapping","label":"Declares Author entity mapping","line":162,"detail":"Authors table with Id (identity) and required Name","visibility":"detail-only","confidence":0.7},{"id":"entity-declare_180","kind":"mapping","label":"Declares Ebook entity mapping","line":180,"detail":"Ebooks table with Guid Id, FilePath, Title, LastChapter, LastChapterIndex, TenantId, relationships to Author and NexusUser and indexes on AuthorId, TenantId, UserId","visibility":"detail-only","confidence":0.7},{"id":"entity-declare_237","kind":"mapping","label":"Declares KnowledgeUnit entity mapping","line":237,"detail":"KnowledgeUnits table with Id, Content, Vector, TenantId, SourceId, Version and indices on SourceId and TenantId","visibility":"detail-only","confidence":0.7},{"id":"entity-declare_283","kind":"mapping","label":"Declares KnowledgeUnitLink entity mapping","line":283,"detail":"KnowledgeUnitLinks table with identity Id, RelationType, SourceUnitId, TargetUnitId and indices","visibility":"detail-only","confidence":0.7},{"id":"entity-declare_315","kind":"mapping","label":"Declares NexusUser (AspNetUsers) mapping","line":315,"detail":"AspNetUsers with many identity and domain fields, SubscriptionPlanId FK, TenantId and indices, navigation properties","visibility":"detail-only","confidence":0.7},{"id":"entity-declare_413","kind":"mapping","label":"Declares QuizResult entity mapping","line":413,"detail":"QuizResults table with Id, CompletedDate, Score, Topic, TenantId and UserId index","visibility":"detail-only","confidence":0.7},{"id":"entity-declare_450","kind":"mapping","label":"Declares SemanticKnowledgeCache entity mapping","line":450,"detail":"SemanticKnowledgeCache with ContentHash PK, Vector, JsonData, ModelId, PromptVersion and TenantId index","visibility":"detail-only","confidence":0.7},{"id":"entity-declare_495","kind":"mapping","label":"Declares SubscriptionPlan mapping and seed data","line":495,"detail":"SubscriptionPlans table with Id, PlanName, StripeProductId, token limits and HasData seed for Free/Basic/Pro/Enterprise (lines 529-565)","visibility":"detail-only","confidence":0.7},{"id":"data-seed_529","kind":"mapping","label":"Seeds SubscriptionPlan rows","line":529,"detail":"Inserts four plan rows: Free, Basic, Pro, Enterprise with token limits and StripeProductId values","visibility":"detail-only","confidence":0.7},{"id":"relationship_568","kind":"mapping","label":"Maps relationships and foreign keys","line":568,"detail":"Configures HasOne relationships and FK constraints for role claims, user claims, user logins, user roles, user tokens, Ebook->Author, Ebook->User, KnowledgeUnitLink->KnowledgeUnit (source/target), NexusUser->SubscriptionPlan, QuizResult->User","visibility":"detail-only","confidence":0.7},{"id":"navigation-config_633","kind":"mapping","label":"Configures entity navigations","line":633,"detail":"Adds Navigation properties for Author.Ebooks, NexusUser.Ebooks, QuizResults, KnowledgeUnit links","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"Author","kind":"entity","line":162,"purpose":"Represents a book author and maps to Authors table.","fields":[{"name":"Id","type":"int","required":true,"line":164,"description":"Primary key, identity"},{"name":"Name","type":"string","required":true,"line":170,"description":"Author name, max length 255"}]},{"name":"Ebook","kind":"entity","line":180,"purpose":"Represents user-owned ebook metadata and reading progress.","fields":[{"name":"Id","type":"Guid","required":true,"line":182,"description":"Primary key (uuid)"},{"name":"FilePath","type":"string","required":true,"line":195,"description":"Storage filepath"},{"name":"Title","type":"string","required":true,"line":217,"description":"Book title, max length 255"},{"name":"LastChapter","type":"string","required":false,"line":199,"description":"Name of last read chapter, max length 255"},{"name":"LastChapterIndex","type":"int","required":false,"line":203,"description":"Index of last read chapter"},{"name":"TenantId","type":"string","required":true,"line":212,"description":"Tenant identifier, max length 128"},{"name":"UserId","type":"string","required":true,"line":222,"description":"Owning user id (FK to AspNetUsers)"}]},{"name":"KnowledgeUnit","kind":"entity","line":237,"purpose":"Represents a unit of indexed knowledge including embedding vector.","fields":[{"name":"Id","type":"string","required":true,"line":239,"description":"Primary key, max length 128"},{"name":"Content","type":"string","required":true,"line":243,"description":"Textual content"},{"name":"Vector","type":"Vector","required":false,"line":266,"description":"Embedding vector column (vector(768))"},{"name":"TenantId","type":"string","required":true,"line":258,"description":"Tenant identifier"},{"name":"SourceId","type":"string","required":true,"line":253,"description":"Source identifier of the unit"}]},{"name":"KnowledgeUnitLink","kind":"entity","line":283,"purpose":"Represents directional links/relations between knowledge units.","fields":[{"name":"Id","type":"int","required":true,"line":285,"description":"Primary key, identity"},{"name":"RelationType","type":"string","required":true,"line":291,"description":"Type of relation, max length 50"},{"name":"SourceUnitId","type":"string","required":true,"line":296,"description":"FK to source KnowledgeUnit"},{"name":"TargetUnitId","type":"string","required":true,"line":301,"description":"FK to target KnowledgeUnit"}]},{"name":"NexusUser","kind":"entity","line":315,"purpose":"Application user (extends Identity) with domain-specific fields like tenant, token usage and subscription.","fields":[{"name":"Id","type":"string","required":true,"line":317,"description":"Primary key (identity user id)"},{"name":"TenantId","type":"string","required":true,"line":385,"description":"Tenant id, max length 128"},{"name":"SubscriptionPlanId","type":"int","required":true,"line":380,"description":"FK to SubscriptionPlan with default value 1"},{"name":"LastReadPageId","type":"string","required":false,"line":350,"description":"Last read page identifier"}]},{"name":"QuizResult","kind":"entity","line":413,"purpose":"Stores results of user quizzes.","fields":[{"name":"Id","type":"Guid","required":true,"line":415,"description":"Primary key (uuid)"},{"name":"CompletedDate","type":"DateTime","required":true,"line":419,"description":"Completion timestamp"},{"name":"Score","type":"int","required":true,"line":422,"description":"Quiz score"},{"name":"TenantId","type":"string","required":true,"line":424,"description":"Tenant id"},{"name":"UserId","type":"string","required":true,"line":437,"description":"Owning user id (FK)"}]},{"name":"SemanticKnowledgeCache","kind":"entity","line":450,"purpose":"Cache of semantic embeddings and JSON data keyed by content hash.","fields":[{"name":"ContentHash","type":"string","required":true,"line":452,"description":"Primary key, max length 128"},{"name":"Vector","type":"Vector","required":false,"line":482,"description":"Embedding vector (vector(1536))"},{"name":"JsonData","type":"string","required":true,"line":459,"description":"Cached JSON payload"},{"name":"TenantId","type":"string","required":true,"line":477,"description":"Tenant id"}]},{"name":"SubscriptionPlan","kind":"entity","line":495,"purpose":"Subscription plan metadata including token limits and Stripe product id; seeded with initial plans.","fields":[{"name":"Id","type":"int","required":true,"line":497,"description":"Primary key, identity"},{"name":"PlanName","type":"string","required":true,"line":512,"description":"Plan name, max length 50"},{"name":"AITokenLimit","type":"int","required":true,"line":503,"description":"Token limit for AI usage"},{"name":"IsUnlimitedTokens","type":"bool","required":true,"line":506,"description":"Whether tokens are unlimited"},{"name":"StripeProductId","type":"string","required":true,"line":517,"description":"Stripe product identifier"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Data/Persistence/AppDbContext.cs","NexusReader.Domain/Entities/Author.cs","NexusReader.Domain/Entities/Ebook.cs","NexusReader.Domain/Entities/KnowledgeUnit.cs","NexusReader.Domain/Entities/KnowledgeUnitLink.cs","NexusReader.Domain/Entities/NexusUser.cs","NexusReader.Domain/Entities/QuizResult.cs","NexusReader.Domain/Entities/SemanticKnowledgeCache.cs","NexusReader.Domain/Entities/SubscriptionPlan.cs"],"patterns":["EF Core Migrations","ORM Mapping","Data Seeding"],"domainConcepts":["Ebook","Author","KnowledgeUnit","KnowledgeUnitLink","NexusUser","SubscriptionPlan","QuizResult","SemanticKnowledgeCache"],"keyDetails":"Migration designer configures Postgres vector extension and identity column behavior, maps domain entities, FKs and indices, and seeds SubscriptionPlan with four default plans (Free/Basic/Pro/Enterprise).","orchestrationMethods":[],"typedContracts":[{"name":"Author","kind":"entity","line":162,"fieldCount":2,"evidencePaths":["NexusReader.Data/Migrations/20260510171941_AddEbookLastChapterIndex.Designer.cs"]},{"name":"Ebook","kind":"entity","line":180,"fieldCount":7,"evidencePaths":["NexusReader.Data/Migrations/20260510171941_AddEbookLastChapterIndex.Designer.cs"]},{"name":"KnowledgeUnit","kind":"entity","line":237,"fieldCount":5,"evidencePaths":["NexusReader.Data/Migrations/20260510171941_AddEbookLastChapterIndex.Designer.cs"]},{"name":"KnowledgeUnitLink","kind":"entity","line":283,"fieldCount":4,"evidencePaths":["NexusReader.Data/Migrations/20260510171941_AddEbookLastChapterIndex.Designer.cs"]},{"name":"NexusUser","kind":"entity","line":315,"fieldCount":4,"evidencePaths":["NexusReader.Data/Migrations/20260510171941_AddEbookLastChapterIndex.Designer.cs"]},{"name":"QuizResult","kind":"entity","line":413,"fieldCount":5,"evidencePaths":["NexusReader.Data/Migrations/20260510171941_AddEbookLastChapterIndex.Designer.cs"]},{"name":"SemanticKnowledgeCache","kind":"entity","line":450,"fieldCount":4,"evidencePaths":["NexusReader.Data/Migrations/20260510171941_AddEbookLastChapterIndex.Designer.cs"]},{"name":"SubscriptionPlan","kind":"entity","line":495,"fieldCount":5,"evidencePaths":["NexusReader.Data/Migrations/20260510171941_AddEbookLastChapterIndex.Designer.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"Author","line":162,"summary":"entity with 2 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260510171941_AddEbookLastChapterIndex.Designer.cs"]},{"kind":"typed-contract","label":"Ebook","line":180,"summary":"entity with 7 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260510171941_AddEbookLastChapterIndex.Designer.cs"]},{"kind":"typed-contract","label":"KnowledgeUnit","line":237,"summary":"entity with 5 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260510171941_AddEbookLastChapterIndex.Designer.cs"]},{"kind":"typed-contract","label":"KnowledgeUnitLink","line":283,"summary":"entity with 4 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260510171941_AddEbookLastChapterIndex.Designer.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260510171941_AddEbookLastChapterIndex.cs.json b/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260510171941_AddEbookLastChapterIndex.cs.json new file mode 100644 index 0000000..aa49285 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260510171941_AddEbookLastChapterIndex.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Data/Migrations/20260510171941_AddEbookLastChapterIndex.cs","purpose":"EF Core migration that adds a new non-nullable integer column LastChapterIndex (default 0) to the Ebooks table and provides the reverse operation.","classification":{"role":"database-config","layer":"data","confidence":0.9,"evidence":["Class derives from Microsoft.EntityFrameworkCore.Migrations.Migration","Implements Up and Down methods that modify the database schema (AddColumn / DropColumn on Ebooks)"]},"className":"AddEbookLastChapterIndex","methods":[{"name":"Up","line":11,"endLine":19,"signature":"(migrationBuilder: MigrationBuilder) -> void","purpose":"Apply the migration: add LastChapterIndex integer column to the Ebooks table with default 0 and non-nullable constraint.","calls":[],"actions":[{"id":"schema-change_13","kind":"mapping","label":"AddColumn LastChapterIndex to Ebooks","line":13,"detail":"migrationBuilder.AddColumn(name: \"LastChapterIndex\", table: \"Ebooks\", type: \"integer\", nullable: false, defaultValue: 0)","visibility":"detail-only","confidence":0.7},{"id":"persistence-migration_13","kind":"mapping","label":"Writes schema change to migration history when applied","line":13,"detail":"Adds a non-null integer column with default value to existing table","visibility":"detail-only","confidence":0.7}]},{"name":"Down","line":22,"endLine":26,"signature":"(migrationBuilder: MigrationBuilder) -> void","purpose":"Revert the migration: remove the LastChapterIndex column from the Ebooks table.","calls":[],"actions":[{"id":"schema-change_24","kind":"mapping","label":"DropColumn LastChapterIndex from Ebooks","line":24,"detail":"migrationBuilder.DropColumn(name: \"LastChapterIndex\", table: \"Ebooks\")","visibility":"detail-only","confidence":0.7},{"id":"persistence-migration_24","kind":"mapping","label":"Removes schema change from database","line":24,"detail":"Drops the column added in Up","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"AddEbookLastChapterIndex","kind":"model","line":8,"purpose":"EF Core migration class that encapsulates the schema change to add LastChapterIndex to Ebooks.","fields":[{"name":"Up(migrationBuilder)","type":"method","required":true,"line":11,"description":"Applies schema change (adds column)"},{"name":"Down(migrationBuilder)","type":"method","required":true,"line":22,"description":"Reverts schema change (drops column)"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["Migration"],"domainConcepts":["Ebook","Chapter index"],"keyDetails":"Adds a non-nullable integer column LastChapterIndex (default 0) to the Ebooks table; Down removes it. File is a standard EF Core migration with no branching, loops, retries, or external project method calls.","orchestrationMethods":[],"typedContracts":[{"name":"AddEbookLastChapterIndex","kind":"model","line":8,"fieldCount":2,"evidencePaths":["NexusReader.Data/Migrations/20260510171941_AddEbookLastChapterIndex.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"AddEbookLastChapterIndex","line":8,"summary":"model with 2 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260510171941_AddEbookLastChapterIndex.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Data__Migrations__AppDbContextModelSnapshot.cs.json b/src/.documentation/cache/summaries/NexusReader.Data__Migrations__AppDbContextModelSnapshot.cs.json new file mode 100644 index 0000000..02d98ba --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Data__Migrations__AppDbContextModelSnapshot.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Data/Migrations/AppDbContextModelSnapshot.cs","purpose":"EF Core Migrations ModelSnapshot that records the current EF model for AppDbContext (auto-generated); used by migrations to compare model changes, configure Postgres vector extension and seed initial subscription plans.","classification":{"role":"database-config","layer":"data","confidence":0.8,"evidence":["[DbContext(typeof(AppDbContext))] attribute on class","BuildModel(ModelBuilder) override configures entities, relationships, indices and seed data","Registers Postgres extension 'vector' and identity column behavior"]},"className":"AppDbContextModelSnapshot","methods":[{"name":"BuildModel","line":17,"endLine":709,"signature":"(modelBuilder: ModelBuilder) -> void","purpose":"Constructs the EF Core model snapshot: annotations, Postgres extension, entity schemas, relationships, indices and seed data.","calls":[{"targetFile":"unknown","targetMethod":"NpgsqlModelBuilderExtensions.HasPostgresExtension","callLine":24,"paramSummary":"modelBuilder, extension name 'vector'"},{"targetFile":"unknown","targetMethod":"NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns","callLine":25,"paramSummary":"modelBuilder"},{"targetFile":"unknown","targetMethod":"NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn","callLine":59,"paramSummary":"Property('Id') on IdentityRoleClaim and other identity id properties"},{"targetFile":"unknown","targetMethod":"EntityTypeBuilder.HasData","callLine":530,"paramSummary":"seed objects for SubscriptionPlans (4 records)"}],"actions":[{"id":"annotation_20","kind":"mapping","label":"Sets model annotations","line":20,"detail":"HasAnnotation ProductVersion and Relational:MaxIdentifierLength","visibility":"detail-only","confidence":0.7},{"id":"external-extension_24","kind":"mapping","label":"Registers Postgres vector extension","line":24,"detail":"NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, \"vector\")","visibility":"detail-only","confidence":0.7},{"id":"external-configuration_25","kind":"mapping","label":"Configures identity default identity columns","line":25,"detail":"UseIdentityByDefaultColumns(modelBuilder) and UseIdentityByDefaultColumn on properties","visibility":"detail-only","confidence":0.7},{"id":"entity-definition_27","kind":"mapping","label":"Defines multiple entities and their properties","line":27,"detail":"Entity definitions for Identity tables and domain entities (Author, Ebook, KnowledgeUnit, KnowledgeUnitLink, NexusUser, QuizResult, SemanticKnowledgeCache, SubscriptionPlan, etc.)","visibility":"detail-only","confidence":0.7},{"id":"indexing_46","kind":"mapping","label":"Adds indices and unique constraints","line":46,"detail":"Numerous HasIndex and IsUnique calls for identity and domain entities","visibility":"detail-only","confidence":0.7},{"id":"type-mapping_267","kind":"mapping","label":"Maps Pgvector Vector columns","line":267,"detail":"Properties of type Vector mapped to vector(768/1536) columns","visibility":"detail-only","confidence":0.7},{"id":"seed_530","kind":"mapping","label":"Seeds SubscriptionPlan data","line":530,"detail":"HasData with 4 subscription records (Free, Basic, Pro, Enterprise)","visibility":"detail-only","confidence":0.7},{"id":"foreign-key_571","kind":"mapping","label":"Configures relationships and delete behaviors","line":571,"detail":"HasOne/WithMany/HasForeignKey with OnDelete behaviors (Cascade, Restrict) for relations like Ebook->Author/User, KnowledgeUnit->Ebook, KnowledgeUnitLink source/target","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"Author","kind":"entity","line":159,"purpose":"Represents a book author and navigation to their ebooks.","fields":[{"name":"Id","type":"int","required":true,"line":161,"description":"Primary key, identity"},{"name":"Name","type":"string","required":true,"line":167,"description":"Author name, max length 255"}]},{"name":"Ebook","kind":"entity","line":177,"purpose":"Represents an uploaded ebook with metadata, progress and owner.","fields":[{"name":"Id","type":"Guid","required":true,"line":179,"description":"Primary key, uuid"},{"name":"AuthorId","type":"int","required":true,"line":186,"description":"FK to Author"},{"name":"FilePath","type":"string","required":true,"line":195,"description":"Stored file path"},{"name":"TenantId","type":"string","required":true,"line":215,"description":"Tenant segregation id"},{"name":"UserId","type":"string","required":true,"line":225,"description":"Owning user id"}]},{"name":"KnowledgeUnit","kind":"entity","line":240,"purpose":"Stores extracted semantic chunks with vector embeddings for retrieval.","fields":[{"name":"Id","type":"string","required":true,"line":242,"description":"Primary key (string, max 128)"},{"name":"Content","type":"string","required":true,"line":246,"description":"Textual content"},{"name":"EbookId","type":"Guid?","required":false,"line":253,"description":"Optional FK to Ebook"},{"name":"Vector","type":"Vector","required":false,"line":267,"description":"Pgvector embedding mapped to vector(768)"},{"name":"TenantId","type":"string","required":true,"line":259,"description":"Tenant id"}]},{"name":"KnowledgeUnitLink","kind":"entity","line":284,"purpose":"Represents directed relations between knowledge units.","fields":[{"name":"Id","type":"int","required":true,"line":286,"description":"Primary key, identity"},{"name":"SourceUnitId","type":"string","required":true,"line":297,"description":"FK to source KnowledgeUnit (max 128)"},{"name":"TargetUnitId","type":"string","required":true,"line":302,"description":"FK to target KnowledgeUnit (max 128)"},{"name":"RelationType","type":"string","required":true,"line":292,"description":"Relation kind (max 50)"}]},{"name":"NexusUser","kind":"entity","line":316,"purpose":"Application user extended for tenant and AI token tracking.","fields":[{"name":"Id","type":"string","required":true,"line":318,"description":"Identity user id"},{"name":"AITokenLimit","type":"int","required":true,"line":321,"description":"Per-user AI token limit"},{"name":"AITokensUsed","type":"int","required":true,"line":324,"description":"Tokens consumed"},{"name":"SubscriptionPlanId","type":"int","required":true,"line":381,"description":"FK to SubscriptionPlan with default value"},{"name":"TenantId","type":"string","required":true,"line":386,"description":"Tenant id (max 128)"}]},{"name":"QuizResult","kind":"entity","line":414,"purpose":"Stores results for user quizzes.","fields":[{"name":"Id","type":"Guid","required":true,"line":416,"description":"Primary key"},{"name":"UserId","type":"string","required":true,"line":438,"description":"FK to NexusUser"},{"name":"Score","type":"int","required":true,"line":423,"description":"Numeric score"}]},{"name":"SemanticKnowledgeCache","kind":"entity","line":451,"purpose":"Cache for AI semantic responses with associated embeddings and prompt/version metadata.","fields":[{"name":"ContentHash","type":"string","required":true,"line":453,"description":"Primary key and unique content hash (max 128)"},{"name":"JsonData","type":"string","required":true,"line":460,"description":"Serialized response data"},{"name":"ModelId","type":"string","required":true,"line":464,"description":"Model identifier (max 50)"},{"name":"Vector","type":"Vector","required":false,"line":483,"description":"Embedding vector mapped to vector(1536)"}]},{"name":"SubscriptionPlan","kind":"entity","line":496,"purpose":"Defines subscription tiers, token limits and pricing; seeded with initial plans.","fields":[{"name":"Id","type":"int","required":true,"line":498,"description":"Primary key, identity"},{"name":"PlanName","type":"string","required":true,"line":513,"description":"Unique plan name (max 50)"},{"name":"AITokenLimit","type":"int","required":true,"line":504,"description":"Token allocation for plan"},{"name":"IsUnlimitedTokens","type":"bool","required":true,"line":507,"description":"Flag for unlimited tokens"},{"name":"MonthlyPrice","type":"decimal","required":true,"line":510,"description":"Pricing numeric"},{"name":"StripeProductId","type":"string","required":true,"line":518,"description":"Stripe product identifier (max 50)"}]},{"name":"IdentityRole","kind":"entity","line":27,"purpose":"ASP.NET Core Identity role table shape referenced by migrations.","fields":[{"name":"Id","type":"string","required":true,"line":29,"description":"Role id"},{"name":"NormalizedName","type":"string","required":false,"line":40,"description":"Normalized role name with unique index"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Data/Persistence/AppDbContext.cs","external: Npgsql.EntityFrameworkCore.PostgreSQL","external: Pgvector"],"patterns":["Entity Framework Core ModelSnapshot","Data Seeding"],"domainConcepts":["Ebook","Author","KnowledgeUnit","KnowledgeUnitLink","NexusUser","SemanticKnowledgeCache","SubscriptionPlan","QuizResult"],"keyDetails":"Auto-generated EF Core model snapshot for AppDbContext. Registers Postgres 'vector' extension and maps Pgvector.Vector columns (768/1536 dims). Seeds SubscriptionPlan table with four initial plans. Configures Identity tables and many FK relationships with cascade/restrict delete behaviors.","orchestrationMethods":[{"name":"BuildModel","line":17,"confidence":0.77,"reason":"Coordinates 4 downstream calls with 0 architectural actions.","actionKinds":["mapping"],"evidencePaths":["NexusReader.Data/Migrations/AppDbContextModelSnapshot.cs","unknown","unknown","unknown","unknown"]}],"typedContracts":[{"name":"Author","kind":"entity","line":159,"fieldCount":2,"evidencePaths":["NexusReader.Data/Migrations/AppDbContextModelSnapshot.cs"]},{"name":"Ebook","kind":"entity","line":177,"fieldCount":5,"evidencePaths":["NexusReader.Data/Migrations/AppDbContextModelSnapshot.cs"]},{"name":"KnowledgeUnit","kind":"entity","line":240,"fieldCount":5,"evidencePaths":["NexusReader.Data/Migrations/AppDbContextModelSnapshot.cs"]},{"name":"KnowledgeUnitLink","kind":"entity","line":284,"fieldCount":4,"evidencePaths":["NexusReader.Data/Migrations/AppDbContextModelSnapshot.cs"]},{"name":"NexusUser","kind":"entity","line":316,"fieldCount":5,"evidencePaths":["NexusReader.Data/Migrations/AppDbContextModelSnapshot.cs"]},{"name":"QuizResult","kind":"entity","line":414,"fieldCount":3,"evidencePaths":["NexusReader.Data/Migrations/AppDbContextModelSnapshot.cs"]},{"name":"SemanticKnowledgeCache","kind":"entity","line":451,"fieldCount":4,"evidencePaths":["NexusReader.Data/Migrations/AppDbContextModelSnapshot.cs"]},{"name":"SubscriptionPlan","kind":"entity","line":496,"fieldCount":6,"evidencePaths":["NexusReader.Data/Migrations/AppDbContextModelSnapshot.cs"]},{"name":"IdentityRole","kind":"entity","line":27,"fieldCount":2,"evidencePaths":["NexusReader.Data/Migrations/AppDbContextModelSnapshot.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"orchestration-method","label":"BuildModel","line":17,"summary":"Coordinates 4 downstream calls with 0 architectural actions.","confidence":0.77,"evidencePaths":["NexusReader.Data/Migrations/AppDbContextModelSnapshot.cs","unknown","unknown","unknown","unknown"]},{"kind":"typed-contract","label":"Author","line":159,"summary":"entity with 2 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/AppDbContextModelSnapshot.cs"]},{"kind":"typed-contract","label":"Ebook","line":177,"summary":"entity with 5 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/AppDbContextModelSnapshot.cs"]},{"kind":"typed-contract","label":"KnowledgeUnit","line":240,"summary":"entity with 5 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/AppDbContextModelSnapshot.cs"]},{"kind":"typed-contract","label":"KnowledgeUnitLink","line":284,"summary":"entity with 4 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/AppDbContextModelSnapshot.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Data__NexusReader.Data.csproj.json b/src/.documentation/cache/summaries/NexusReader.Data__NexusReader.Data.csproj.json new file mode 100644 index 0000000..06bc5ba --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Data__NexusReader.Data.csproj.json @@ -0,0 +1 @@ +{"path":"NexusReader.Data/NexusReader.Data.csproj","purpose":"Defines the Data project build configuration and NuGet/Project dependencies for the NexusReader data layer (Entity Framework Core persistence, DB providers, and vector support).","classification":{"role":"database-config","layer":"data","confidence":0.9,"evidence":["References EF Core and provider packages (Microsoft.EntityFrameworkCore, Sqlite, Npgsql) at lines 11-13","Includes Pgvector.EntityFrameworkCore for vector storage at line 21","ProjectReference to NexusReader.Domain indicates this is the persistence/data implementation at line 25"]},"className":"","methods":[],"types":[],"serviceRegistrations":[],"startupActions":[],"dependencies":["Package: Microsoft.AspNetCore.Identity.EntityFrameworkCore (line 10)","Package: Microsoft.EntityFrameworkCore (line 11)","Package: Microsoft.EntityFrameworkCore.Sqlite (line 12)","Package: Npgsql.EntityFrameworkCore.PostgreSQL (line 13)","Package: Microsoft.Extensions.Configuration.FileExtensions (line 14)","Package: Microsoft.Extensions.Configuration.Json (line 15)","Package: Microsoft.Extensions.Configuration.EnvironmentVariables (line 16)","Package: Microsoft.EntityFrameworkCore.Design (line 17)","Package: Pgvector.EntityFrameworkCore (line 21)","Project: ../NexusReader.Domain/NexusReader.Domain.csproj (line 25)"],"patterns":["EF Core (ORM)","Repository/Repository-like data layer","Provider-based DB configuration (SQLite, PostgreSQL)"],"domainConcepts":["Persistence","Database providers (SQLite, PostgreSQL)","Vector embeddings storage (pgvector)","Configuration (JSON/env file support)"],"keyDetails":"TargetFramework net10.0, Nullable enabled, ImplicitUsings enabled. EF Core design package included with PrivateAssets=all (dev-time tooling). Supports SQLite and Postgres providers and Pgvector for vector data; references Domain project for domain types.","orchestrationMethods":[],"typedContracts":[],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Data__Persistence__AppDbContext.cs.json b/src/.documentation/cache/summaries/NexusReader.Data__Persistence__AppDbContext.cs.json new file mode 100644 index 0000000..d929743 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Data__Persistence__AppDbContext.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Data/Persistence/AppDbContext.cs","purpose":"EF Core DbContext for NexusReader that configures entity mappings, indexes, relationships, Postgres-specific vector settings, and seeds deterministic subscription plans used by the application.","classification":{"role":"database-config","layer":"data","confidence":0.9,"evidence":["Class inherits IdentityDbContext (line 7)","Defines DbSet properties for domain entities (lines 20-26)","Overrides OnModelCreating to configure entities, indexes, relations and seed data (lines 28-128)"]},"className":"AppDbContext","methods":[{"name":"AppDbContext","line":9,"endLine":11,"signature":"(options: DbContextOptions) -> AppDbContext","purpose":"Constructor that forwards DbContextOptions to the base IdentityDbContext.","calls":[],"actions":[{"id":"constructor_9","kind":"mapping","label":"Passes options to base DbContext","line":9,"detail":"base(options)","visibility":"detail-only","confidence":0.7}]},{"name":"OnConfiguring","line":13,"endLine":18,"signature":"(optionsBuilder: DbContextOptionsBuilder) -> void","purpose":"Configures DbContext runtime warnings; suppresses pending model changes warning to avoid runtime exceptions in some environments.","calls":[],"actions":[{"id":"call-framework_15","kind":"mapping","label":"Calls base OnConfiguring","line":15,"detail":"base.OnConfiguring(optionsBuilder)","visibility":"detail-only","confidence":0.7},{"id":"configuration_17","kind":"mapping","label":"Suppress EF Core PendingModelChangesWarning","line":17,"detail":"optionsBuilder.ConfigureWarnings(w => w.Ignore(RelationalEventId.PendingModelChangesWarning))","visibility":"detail-only","confidence":0.7}]},{"name":"SemanticKnowledgeCache (DbSet property)","line":20,"endLine":20,"signature":"() -> DbSet","purpose":"Exposes the SemanticKnowledgeCache DbSet used for persistence of cached semantic embeddings.","calls":[],"actions":[{"id":"expose-dbset_20","kind":"mapping","label":"Provides DbSet for SemanticKnowledgeCache","line":20,"detail":"public DbSet SemanticKnowledgeCache => Set()","visibility":"detail-only","confidence":0.7}]},{"name":"KnowledgeUnits (DbSet property)","line":21,"endLine":21,"signature":"() -> DbSet","purpose":"Exposes the KnowledgeUnit DbSet.","calls":[],"actions":[{"id":"expose-dbset_21","kind":"mapping","label":"Provides DbSet for KnowledgeUnit","line":21,"detail":"public DbSet KnowledgeUnits => Set()","visibility":"detail-only","confidence":0.7}]},{"name":"KnowledgeUnitLinks (DbSet property)","line":22,"endLine":22,"signature":"() -> DbSet","purpose":"Exposes the KnowledgeUnitLink DbSet.","calls":[],"actions":[{"id":"expose-dbset_22","kind":"mapping","label":"Provides DbSet for KnowledgeUnitLink","line":22,"detail":"public DbSet KnowledgeUnitLinks => Set()","visibility":"detail-only","confidence":0.7}]},{"name":"Ebooks (DbSet property)","line":23,"endLine":23,"signature":"() -> DbSet","purpose":"Exposes the Ebook DbSet.","calls":[],"actions":[{"id":"expose-dbset_23","kind":"mapping","label":"Provides DbSet for Ebook","line":23,"detail":"public DbSet Ebooks => Set()","visibility":"detail-only","confidence":0.7}]},{"name":"QuizResults (DbSet property)","line":24,"endLine":24,"signature":"() -> DbSet","purpose":"Exposes the QuizResult DbSet.","calls":[],"actions":[{"id":"expose-dbset_24","kind":"mapping","label":"Provides DbSet for QuizResult","line":24,"detail":"public DbSet QuizResults => Set()","visibility":"detail-only","confidence":0.7}]},{"name":"SubscriptionPlans (DbSet property)","line":25,"endLine":25,"signature":"() -> DbSet","purpose":"Exposes the SubscriptionPlan DbSet used for plan definitions and seeding.","calls":[],"actions":[{"id":"expose-dbset_25","kind":"mapping","label":"Provides DbSet for SubscriptionPlan","line":25,"detail":"public DbSet SubscriptionPlans => Set()","visibility":"detail-only","confidence":0.7}]},{"name":"Authors (DbSet property)","line":26,"endLine":26,"signature":"() -> DbSet","purpose":"Exposes the Author DbSet.","calls":[],"actions":[{"id":"expose-dbset_26","kind":"mapping","label":"Provides DbSet for Author","line":26,"detail":"public DbSet Authors => Set()","visibility":"detail-only","confidence":0.7}]},{"name":"OnModelCreating","line":28,"endLine":128,"signature":"(modelBuilder: ModelBuilder) -> void","purpose":"Configures EF Core model: entity properties, indexes, relationships, Postgres-specific vector column/index, cascade behaviors, and seeds subscription plans.","calls":[{"targetFile":"unknown","targetMethod":"SubscriptionPlan.FreeName (static property)","callLine":123,"paramSummary":"Used as PlanName for seeded SubscriptionPlan Id=1"},{"targetFile":"unknown","targetMethod":"SubscriptionPlan.BasicName (static property)","callLine":124,"paramSummary":"Used as PlanName for seeded SubscriptionPlan Id=2"},{"targetFile":"unknown","targetMethod":"SubscriptionPlan.ProName (static property)","callLine":125,"paramSummary":"Used as PlanName for seeded SubscriptionPlan Id=3"},{"targetFile":"unknown","targetMethod":"SubscriptionPlan.EnterpriseName (static property)","callLine":126,"paramSummary":"Used as PlanName for seeded SubscriptionPlan Id=4"}],"actions":[{"id":"call-framework_30","kind":"mapping","label":"Calls base OnModelCreating","line":30,"detail":"base.OnModelCreating(modelBuilder)","visibility":"detail-only","confidence":0.7},{"id":"entity-config_32","kind":"mapping","label":"Configure NexusUser properties, index and subscription FK with Restrict on delete and default subscription id","line":32,"detail":"Sets LastReadPageId length, LastReadAt nullable, TenantId index, FK to SubscriptionPlan (Restrict), and SubscriptionPlanId default value = 1","visibility":"detail-only","confidence":0.7},{"id":"entity-config_48","kind":"mapping","label":"Ensure unique SubscriptionPlan.PlanName","line":48,"detail":"modelBuilder.Entity().HasIndex(p => p.PlanName).IsUnique()","visibility":"detail-only","confidence":0.7},{"id":"entity-config_53","kind":"mapping","label":"SemanticKnowledgeCache key, indexes and conditional Postgres vector configuration","line":53,"detail":"Sets ContentHash as key and unique index, TenantId index, and if Database.IsNpgsql() configures Embedding as vector(768) with hnsw cosine index; otherwise ignores Embedding property","visibility":"detail-only","confidence":0.7},{"id":"branch_58","kind":"branch","label":"Database provider branch for vector handling","line":58,"detail":"If Postgres: entity.Property(...).HasColumnType(\"vector(768)\") and HasIndex(...).HasMethod(\"hnsw\").HasOperators(\"vector_cosine_ops\"); else entity.Ignore(e => e.Embedding)","conditionSummary":"Database.IsNpgsql()","outcomeLabels":["postgres-configures-vector-and-hnsw-index","non-postgres-ignores-embedding"],"visibility":"detail-only","confidence":0.7},{"id":"onmodelcreating_branch_58_0","kind":"branch","label":"Evaluates branch condition","line":58,"detail":"if (Database.IsNpgsql())","conditionSummary":"Database.IsNpgsql()","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"onmodelcreating_fallback_64_1","kind":"fallback","label":"Falls back to alternate path","line":64,"detail":"else","outcomeLabels":["fallback"],"visibility":"primary-visible","confidence":0.84},{"id":"entity-config_70","kind":"mapping","label":"KnowledgeUnit key, indexes and Ebook FK cascade delete","line":70,"detail":"HasKey Id, TenantId and EbookId indexes, FK to Ebook with Cascade delete","visibility":"detail-only","confidence":0.7},{"id":"entity-config_82","kind":"mapping","label":"KnowledgeUnitLink bidirectional relations with cascade delete","line":82,"detail":"SourceUnit -> OutgoingLinks and TargetUnit -> IncomingLinks with FKs and Cascade on delete","visibility":"detail-only","confidence":0.7},{"id":"entity-config_96","kind":"mapping","label":"Ebook relations to User (cascade) and Author (restrict), and TenantId index","line":96,"detail":"User FK Cascade delete; Author FK Restrict; TenantId index","visibility":"detail-only","confidence":0.7},{"id":"entity-config_111","kind":"mapping","label":"QuizResult relation to User (cascade) and TenantId index","line":111,"detail":"User FK Cascade delete; TenantId index","visibility":"detail-only","confidence":0.7},{"id":"data-seed_121","kind":"mapping","label":"Seed SubscriptionPlan entries with deterministic IDs and product IDs","line":121,"detail":"Adds four SubscriptionPlan entries (Ids 1..4) with PlanName from SubscriptionPlan.*Name and token/price/StripeProductId values","visibility":"detail-only","confidence":0.7}]}],"types":[],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Domain.Entities"],"patterns":["EF Core DbContext","Data Seeding","Conditional Provider Configuration"],"domainConcepts":["NexusUser","SubscriptionPlan","SemanticKnowledgeCache","KnowledgeUnit","KnowledgeUnitLink","Ebook","QuizResult","Author"],"keyDetails":"Main data-context configuring entity schemas, indexes, cascade delete behaviors, conditional Postgres vector column/index for embeddings (HNSW cosine), and deterministic seed data for subscription plans (IDs 1..4).","orchestrationMethods":[{"name":"OnModelCreating","line":28,"confidence":0.98,"reason":"Coordinates 4 downstream calls with 3 architectural actions.","actionKinds":["mapping","branch","fallback"],"evidencePaths":["NexusReader.Data/Persistence/AppDbContext.cs","unknown","unknown","unknown","unknown"]}],"typedContracts":[],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"orchestration-method","label":"OnModelCreating","line":28,"summary":"Coordinates 4 downstream calls with 3 architectural actions.","confidence":0.98,"evidencePaths":["NexusReader.Data/Persistence/AppDbContext.cs","unknown","unknown","unknown","unknown"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Data__Persistence__AppDbContextFactory.cs.json b/src/.documentation/cache/summaries/NexusReader.Data__Persistence__AppDbContextFactory.cs.json new file mode 100644 index 0000000..a22c2f1 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Data__Persistence__AppDbContextFactory.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Data/Persistence/AppDbContextFactory.cs","purpose":"Design-time factory that constructs AppDbContext for EF Core tooling by locating configuration (preferably from the Web project) and configuring a Postgres connection with pgvector support.","classification":{"role":"bootstrap","layer":"data","confidence":0.75,"evidence":["Implements IDesignTimeDbContextFactory (line 8) — used by EF tooling at design time","Builds Configuration from a Web project appsettings files and environment variables (lines 25-30)","Constructs DbContextOptions and returns new AppDbContext (lines 32-44)"]},"className":"AppDbContextFactory","methods":[{"name":"CreateDbContext","line":10,"endLine":44,"signature":"(args: string[]) -> AppDbContext","purpose":"Creates and configures an AppDbContext for design-time operations: locates solution/web project, loads configuration, determines connection string (with a default fallback), enables pgvector, and returns the context.","calls":[{"targetFile":"NexusReader.Data/Persistence/AppDbContext.cs","targetMethod":"AppDbContext::.ctor","callLine":43,"paramSummary":"optionsBuilder.Options (DbContextOptions)"}],"actions":[{"id":"interface-implementation_8","kind":"mapping","label":"IDesignTimeDbContextFactory implementation","line":8,"detail":"Class implements IDesignTimeDbContextFactory to supply a context at design time","visibility":"detail-only","confidence":0.7},{"id":"env-read_12","kind":"mapping","label":"Reads ASPNETCORE_ENVIRONMENT","line":12,"detail":"Environment.GetEnvironmentVariable(\"ASPNETCORE_ENVIRONMENT\") with default 'Development'","visibility":"detail-only","confidence":0.7},{"id":"loop_15","kind":"loop","label":"Search for solution root","line":15,"detail":"while loop walking parent directories until NexusReader.slnx is found (lines 15-19)","visibility":"detail-only","confidence":0.7},{"id":"createdbcontext_loop_16_0","kind":"loop","label":"Repeats work over a collection or condition","line":16,"detail":"while (currentDir != null && !File.Exists(Path.Combine(currentDir.FullName, \"NexusReader.slnx\")))","conditionSummary":"currentDir != null && !File.Exists(Path.Combine(currentDir.FullName, \"NexusReader.slnx\"))","loopTargetLine":16,"loopExitSummary":"Leaves the loop when the condition no longer holds.","visibility":"primary-visible","confidence":0.86},{"id":"branch_21","kind":"branch","label":"Choose basePath for configuration","line":21,"detail":"Sets basePath to Web project when solution root found, otherwise uses current directory (lines 21-23)","conditionSummary":"currentDir != null","outcomeLabels":["use Web project path (src/NexusReader.Web)","use current working directory"],"visibility":"detail-only","confidence":0.7},{"id":"config-build_25","kind":"mapping","label":"Build configuration from files and environment","line":25,"detail":"ConfigurationBuilder sets base path, adds appsettings.json and appsettings.{env}.json (optional), adds environment variables, then Build() (lines 25-30)","visibility":"detail-only","confidence":0.7},{"id":"read_33","kind":"mapping","label":"Read connection string","line":33,"detail":"configuration.GetConnectionString(\"PostgresConnection\")","visibility":"detail-only","confidence":0.7},{"id":"createdbcontext_branch_35_1","kind":"branch","label":"Evaluates branch condition","line":35,"detail":"if (string.IsNullOrEmpty(connectionString))","conditionSummary":"string.IsNullOrEmpty(connectionString)","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"guard-clause_35","kind":"guard-clause","label":"Fallback to default Postgres connection","line":35,"detail":"Assigns a hard-coded Postgres connection string for design-time if none is found (lines 35-39)","conditionSummary":"string.IsNullOrEmpty(connectionString)","outcomeLabels":["use configured Postgres connection","use local default Host=localhost;Database=nexus_reader;Username=postgres;Password=postgres"],"visibility":"detail-only","confidence":0.7},{"id":"setup_41","kind":"mapping","label":"Configure DbContextOptions with Npgsql and pgvector","line":41,"detail":"optionsBuilder.UseNpgsql(connectionString, x => x.UseVector()) — enables Postgres provider and pgvector extensions","visibility":"detail-only","confidence":0.7},{"id":"return_43","kind":"return","label":"Return configured AppDbContext","line":43,"detail":"new AppDbContext(optionsBuilder.Options)","visibility":"detail-only","confidence":0.7},{"id":"createdbcontext_return_43_2","kind":"return","label":"Returns result","line":43,"detail":"return new AppDbContext(optionsBuilder.Options);","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"AppDbContextFactory","kind":"model","line":8,"purpose":"Provides a design-time EF Core DbContext factory to construct AppDbContext with configuration and provider setup.","fields":[]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Data/Persistence/AppDbContext.cs"],"patterns":["Factory","EF Core design-time factory"],"domainConcepts":[],"keyDetails":"Design-time only factory: locates Web project appsettings when possible, falls back to a local default Postgres connection, and enables pgvector via UseVector().","orchestrationMethods":[{"name":"CreateDbContext","line":10,"confidence":0.98,"reason":"Contains 4 architectural actions relevant to business execution.","actionKinds":["mapping","loop","branch","guard-clause","return"],"evidencePaths":["NexusReader.Data/Persistence/AppDbContextFactory.cs","NexusReader.Data/Persistence/AppDbContext.cs"]}],"typedContracts":[{"name":"AppDbContextFactory","kind":"model","line":8,"fieldCount":0,"evidencePaths":["NexusReader.Data/Persistence/AppDbContextFactory.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"orchestration-method","label":"CreateDbContext","line":10,"summary":"Contains 4 architectural actions relevant to business execution.","confidence":0.98,"evidencePaths":["NexusReader.Data/Persistence/AppDbContextFactory.cs","NexusReader.Data/Persistence/AppDbContext.cs"]},{"kind":"typed-contract","label":"AppDbContextFactory","line":8,"summary":"model with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Persistence/AppDbContextFactory.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Data__Persistence__DbInitializer.cs.json b/src/.documentation/cache/summaries/NexusReader.Data__Persistence__DbInitializer.cs.json new file mode 100644 index 0000000..91b41d0 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Data__Persistence__DbInitializer.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Data/Persistence/DbInitializer.cs","purpose":"Provides a one-time database seeding utility that creates default subscription plans, roles, an admin user, and sample domain data (author, ebook) when invoked (typically at app startup).","classification":{"role":"startup","layer":"data","confidence":0.9,"evidence":["Static DbInitializer class with SeedAsync(IServiceProvider) used to populate DB","Uses IServiceProvider.CreateScope and AppDbContext/IDbContextFactory to write initial data"]},"className":"DbInitializer","methods":[{"name":"SeedAsync","line":14,"endLine":118,"signature":"(serviceProvider: IServiceProvider) -> Task","purpose":"Creates required seed data (subscription plans, roles, admin user, sample author and ebook) in the database in an idempotent manner.","calls":[{"targetFile":"unknown","targetMethod":"CreateScope","callLine":16,"paramSummary":"no args; creates DI scope from IServiceProvider"},{"targetFile":"unknown","targetMethod":"GetRequiredService","callLine":17,"paramSummary":"IPasswordHasher requested from scope.ServiceProvider"},{"targetFile":"unknown","targetMethod":"GetRequiredService","callLine":18,"paramSummary":"IDbContextFactory requested from scope.ServiceProvider"},{"targetFile":"unknown","targetMethod":"CreateDbContextAsync","callLine":19,"paramSummary":"creates AppDbContext via factory (async)"},{"targetFile":"unknown","targetMethod":"SubscriptionPlans.Any","callLine":26,"paramSummary":"checks whether any subscription plans exist"},{"targetFile":"unknown","targetMethod":"SubscriptionPlans.AddRange","callLine":28,"paramSummary":"adds list of SubscriptionPlan instances (Free, Pro, Enterprise)"},{"targetFile":"unknown","targetMethod":"SaveChangesAsync","callLine":34,"paramSummary":"persists added subscription plans"},{"targetFile":"unknown","targetMethod":"Roles.Any","callLine":42,"paramSummary":"checks for existence of a role by name"},{"targetFile":"unknown","targetMethod":"Roles.Add","callLine":45,"paramSummary":"adds IdentityRole for missing role name"},{"targetFile":"unknown","targetMethod":"SaveChangesAsync","callLine":49,"paramSummary":"persists added roles"},{"targetFile":"unknown","targetMethod":"Users.FirstOrDefaultAsync","callLine":54,"paramSummary":"lookup user by NormalizedEmail"},{"targetFile":"unknown","targetMethod":"HashPassword","callLine":71,"paramSummary":"computes password hash for new NexusUser with literal password 'Admin123!'"},{"targetFile":"unknown","targetMethod":"Users.Add","callLine":73,"paramSummary":"adds created NexusUser entity"},{"targetFile":"unknown","targetMethod":"SaveChangesAsync","callLine":74,"paramSummary":"persists created user"},{"targetFile":"unknown","targetMethod":"Roles.FirstAsync","callLine":76,"paramSummary":"fetches Admin role to link to user"},{"targetFile":"unknown","targetMethod":"UserRoles.Add","callLine":77,"paramSummary":"creates IdentityUserRole linking admin user and admin role"},{"targetFile":"unknown","targetMethod":"SaveChangesAsync","callLine":78,"paramSummary":"persists user-role link"},{"targetFile":"unknown","targetMethod":"Authors.FirstOrDefaultAsync","callLine":83,"paramSummary":"checks for sample author by name"},{"targetFile":"unknown","targetMethod":"Authors.Add","callLine":87,"paramSummary":"adds sample Author entity"},{"targetFile":"unknown","targetMethod":"SaveChangesAsync","callLine":88,"paramSummary":"persists author"},{"targetFile":"unknown","targetMethod":"Ebooks.Any","callLine":92,"paramSummary":"checks whether admin has any ebooks"},{"targetFile":"unknown","targetMethod":"Ebooks.Add","callLine":94,"paramSummary":"adds sample Ebook entity for admin user"},{"targetFile":"unknown","targetMethod":"SaveChangesAsync","callLine":105,"paramSummary":"persists ebook"},{"targetFile":"unknown","targetMethod":"Console.WriteLine","callLine":23,"paramSummary":"log start message"},{"targetFile":"unknown","targetMethod":"Console.WriteLine","callLine":35,"paramSummary":"log subscription plans seeded"},{"targetFile":"unknown","targetMethod":"Console.WriteLine","callLine":46,"paramSummary":"logs created role name"},{"targetFile":"unknown","targetMethod":"Console.WriteLine","callLine":80,"paramSummary":"logs successful admin creation"},{"targetFile":"unknown","targetMethod":"Console.WriteLine","callLine":106,"paramSummary":"logs sample book seeded"},{"targetFile":"unknown","targetMethod":"Console.WriteLine","callLine":111,"paramSummary":"logs admin exists"},{"targetFile":"unknown","targetMethod":"Console.WriteLine","callLine":116,"paramSummary":"logs seeding error message in catch"}],"actions":[{"id":"resource-scope_16","kind":"mapping","label":"Creates DI scope","line":16,"detail":"using var scope = serviceProvider.CreateScope()","visibility":"detail-only","confidence":0.7},{"id":"resource-create_19","kind":"mapping","label":"Creates AppDbContext","line":19,"detail":"await dbContextFactory.CreateDbContextAsync()","visibility":"detail-only","confidence":0.7},{"id":"error-handling_21","kind":"mapping","label":"Overall try/catch","line":21,"detail":"catch (Exception ex) logs critical error message to Console","visibility":"detail-only","confidence":0.7},{"id":"log_23","kind":"log","label":"Start seeding","line":23,"detail":"Console.WriteLine(\"[Seeder] Starting database seeding...\")","visibility":"detail-only","confidence":0.7},{"id":"seedasync_branch_26_0","kind":"branch","label":"Evaluates branch condition","line":26,"detail":"if (!dbContext.SubscriptionPlans.Any())","conditionSummary":"!dbContext.SubscriptionPlans.Any()","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"guard-clause_26","kind":"guard-clause","label":"Seed subscription plans if none exist","line":26,"detail":"Adds three SubscriptionPlan entities and SaveChangesAsync","conditionSummary":"!dbContext.SubscriptionPlans.Any()","outcomeLabels":["seed","skip"],"visibility":"detail-only","confidence":0.7},{"id":"loop_40","kind":"loop","label":"Ensure roles exist","line":40,"detail":"foreach roleName in {\"Admin\",\"User\"} checks Roles.Any and adds missing roles","visibility":"detail-only","confidence":0.7},{"id":"seedasync_loop_40_1","kind":"loop","label":"Repeats work over a collection or condition","line":40,"detail":"foreach (var roleName in roleNames)","conditionSummary":"var roleName in roleNames","loopTargetLine":40,"loopExitSummary":"Leaves the loop when the condition no longer holds.","visibility":"primary-visible","confidence":0.86},{"id":"seedasync_branch_43_2","kind":"branch","label":"Evaluates branch condition","line":43,"detail":"if (!roleExist)","conditionSummary":"!roleExist","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"persistence-write_45","kind":"mapping","label":"Adds roles, users, userroles, authors, ebooks","line":45,"detail":"Calls Add/AddRange and SaveChangesAsync at multiple points (34,49,74,78,88,105)","visibility":"detail-only","confidence":0.7},{"id":"seedasync_repository-write_45_3","kind":"repository-write","label":"Writes repository or persistence state","line":45,"detail":"dbContext.Roles.Add(new IdentityRole { Name = roleName, NormalizedName = roleName.ToUpper() });","visibility":"secondary-visible","confidence":0.88},{"id":"branch_56","kind":"branch","label":"Admin user creation path","line":56,"detail":"Creates NexusUser, hashes password, assigns Enterprise plan, persists and links Admin role; seeds sample author and ebook under admin","conditionSummary":"adminUser == null","outcomeLabels":["create-admin","already-exists"],"visibility":"detail-only","confidence":0.7},{"id":"seedasync_branch_56_4","kind":"branch","label":"Evaluates branch condition","line":56,"detail":"if (adminUser == null)","conditionSummary":"adminUser == null","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"seedasync_repository-write_73_5","kind":"repository-write","label":"Writes repository or persistence state","line":73,"detail":"dbContext.Users.Add(adminUser);","visibility":"secondary-visible","confidence":0.88},{"id":"seedasync_repository-write_77_6","kind":"repository-write","label":"Writes repository or persistence state","line":77,"detail":"dbContext.UserRoles.Add(new IdentityUserRole { UserId = adminUser.Id, RoleId = adminRole.Id });","visibility":"secondary-visible","confidence":0.88},{"id":"guard-clause_83","kind":"guard-clause","label":"Seed sample author if missing","line":83,"detail":"Adds Author and SaveChangesAsync","conditionSummary":"author == null","outcomeLabels":["seed-author","skip"],"visibility":"detail-only","confidence":0.7},{"id":"seedasync_branch_84_7","kind":"branch","label":"Evaluates branch condition","line":84,"detail":"if (author == null)","conditionSummary":"author == null","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"seedasync_repository-write_87_8","kind":"repository-write","label":"Writes repository or persistence state","line":87,"detail":"dbContext.Authors.Add(author);","visibility":"secondary-visible","confidence":0.88},{"id":"seedasync_branch_92_9","kind":"branch","label":"Evaluates branch condition","line":92,"detail":"if (!dbContext.Ebooks.Any(e => e.UserId == adminUser.Id))","conditionSummary":"!dbContext.Ebooks.Any(e => e.UserId == adminUser.Id)","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"guard-clause_92","kind":"guard-clause","label":"Seed sample ebook for admin","line":92,"detail":"Adds Ebook and SaveChangesAsync","conditionSummary":"!dbContext.Ebooks.Any(e => e.UserId == adminUser.Id)","outcomeLabels":["seed-ebook","skip"],"visibility":"detail-only","confidence":0.7},{"id":"seedasync_repository-write_94_10","kind":"repository-write","label":"Writes repository or persistence state","line":94,"detail":"dbContext.Ebooks.Add(new Ebook","visibility":"secondary-visible","confidence":0.88},{"id":"seedasync_fallback_109_11","kind":"fallback","label":"Falls back to alternate path","line":109,"detail":"else","outcomeLabels":["fallback"],"visibility":"primary-visible","confidence":0.84}]}],"types":[{"name":"DbInitializer","kind":"model","line":12,"purpose":"Static helper class that exposes SeedAsync to bootstrap initial database contents.","fields":[]}],"serviceRegistrations":[],"startupActions":[{"name":"SeedAsync","line":14,"kind":"middleware","targetCalls":[{"targetFile":"unknown","targetMethod":"CreateDbContextAsync","callLine":19,"paramSummary":"creates AppDbContext for seeding"}]}],"dependencies":["unknown (AppDbContext)","unknown (NexusUser)","unknown (SubscriptionPlan)","unknown (Author)","unknown (Ebook)","Microsoft.AspNetCore.Identity (framework)","Microsoft.Extensions.DependencyInjection (framework)","Microsoft.EntityFrameworkCore (framework)"],"patterns":["Seeder","Idempotent data seeding"],"domainConcepts":["SubscriptionPlan","NexusUser (Admin)","Role","Author","Ebook"],"keyDetails":"Idempotent seeding guarded by existence checks, uses DI scope and DbContext factory, hashes admin password with injected IPasswordHasher, wrapped in try/catch and logs to Console.","orchestrationMethods":[{"name":"SeedAsync","line":14,"confidence":0.98,"reason":"Coordinates 30 downstream calls with 14 architectural actions.","actionKinds":["mapping","log","branch","guard-clause","loop","repository-write","fallback"],"evidencePaths":["NexusReader.Data/Persistence/DbInitializer.cs","unknown","unknown","unknown","unknown","unknown"]}],"typedContracts":[{"name":"DbInitializer","kind":"model","line":12,"fieldCount":0,"evidencePaths":["NexusReader.Data/Persistence/DbInitializer.cs"]}],"persistenceInteractions":[{"methodName":"SeedAsync","line":45,"kind":"persistence-write","detail":"dbContext.Roles.Add(new IdentityRole { Name = roleName, NormalizedName = roleName.ToUpper() });","evidencePaths":["NexusReader.Data/Persistence/DbInitializer.cs"]},{"methodName":"SeedAsync","line":73,"kind":"persistence-write","detail":"dbContext.Users.Add(adminUser);","evidencePaths":["NexusReader.Data/Persistence/DbInitializer.cs"]},{"methodName":"SeedAsync","line":77,"kind":"persistence-write","detail":"dbContext.UserRoles.Add(new IdentityUserRole { UserId = adminUser.Id, RoleId = adminRole.Id });","evidencePaths":["NexusReader.Data/Persistence/DbInitializer.cs"]},{"methodName":"SeedAsync","line":87,"kind":"persistence-write","detail":"dbContext.Authors.Add(author);","evidencePaths":["NexusReader.Data/Persistence/DbInitializer.cs"]},{"methodName":"SeedAsync","line":94,"kind":"persistence-write","detail":"dbContext.Ebooks.Add(new Ebook","evidencePaths":["NexusReader.Data/Persistence/DbInitializer.cs"]}],"externalInteractions":[],"evidenceAnchors":[{"kind":"orchestration-method","label":"SeedAsync","line":14,"summary":"Coordinates 30 downstream calls with 14 architectural actions.","confidence":0.98,"evidencePaths":["NexusReader.Data/Persistence/DbInitializer.cs","unknown","unknown","unknown","unknown","unknown"]},{"kind":"typed-contract","label":"DbInitializer","line":12,"summary":"model with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Persistence/DbInitializer.cs"]},{"kind":"persistence","label":"SeedAsync","line":45,"summary":"dbContext.Roles.Add(new IdentityRole { Name = roleName, NormalizedName = roleName.ToUpper() });","confidence":0.82,"evidencePaths":["NexusReader.Data/Persistence/DbInitializer.cs"]},{"kind":"persistence","label":"SeedAsync","line":73,"summary":"dbContext.Users.Add(adminUser);","confidence":0.82,"evidencePaths":["NexusReader.Data/Persistence/DbInitializer.cs"]},{"kind":"persistence","label":"SeedAsync","line":77,"summary":"dbContext.UserRoles.Add(new IdentityUserRole { UserId = adminUser.Id, RoleId = adminRole.Id });","confidence":0.82,"evidencePaths":["NexusReader.Data/Persistence/DbInitializer.cs"]},{"kind":"startup","label":"SeedAsync","line":14,"summary":"middleware startup action","confidence":0.78,"evidencePaths":["NexusReader.Data/Persistence/DbInitializer.cs","unknown"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Data__Persistence__Migrations__20260513181743_AddEbookReadyFlag.Designer.cs.json b/src/.documentation/cache/summaries/NexusReader.Data__Persistence__Migrations__20260513181743_AddEbookReadyFlag.Designer.cs.json new file mode 100644 index 0000000..a03556f --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Data__Persistence__Migrations__20260513181743_AddEbookReadyFlag.Designer.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Data/Persistence/Migrations/20260513181743_AddEbookReadyFlag.Designer.cs","purpose":"EF Core migration designer that defines the target EF model for the migration AddEbookReadyFlag; it describes schema (tables, columns, keys, indexes, relationships) and includes seed data for subscription plans.","classification":{"role":"database-config","layer":"data","confidence":0.85,"evidence":["Class annotated with [Migration(\"20260513181743_AddEbookReadyFlag\")] (line 16)","Contains BuildTargetModel(ModelBuilder) which constructs EF entity mappings (line 20)","Calls modelBuilder.Entity(...) repeatedly to define tables, keys, indexes, relationships and seed data (multiple lines)"]},"className":"AddEbookReadyFlag","methods":[{"name":"BuildTargetModel","line":20,"endLine":701,"signature":"(modelBuilder: ModelBuilder) -> void","purpose":"Builds the EF Core model for this migration: defines entities, properties, keys, indexes, relationships, Postgres extensions, identity configuration, and seed data.","calls":[{"targetFile":"unknown","targetMethod":"HasAnnotation","callLine":23,"paramSummary":"product/version and relational identifier length"},{"targetFile":"unknown","targetMethod":"HasPostgresExtension","callLine":27,"paramSummary":"enables 'vector' Postgres extension"},{"targetFile":"unknown","targetMethod":"UseIdentityByDefaultColumns","callLine":28,"paramSummary":"configures identity default columns for Postgres"},{"targetFile":"unknown","targetMethod":"Entity","callLine":30,"paramSummary":"registers entity by CLR or store type name and config lambda"},{"targetFile":"unknown","targetMethod":"UseIdentityByDefaultColumn","callLine":62,"paramSummary":"configures identity column for integer key property"},{"targetFile":"unknown","targetMethod":"HasData","callLine":532,"paramSummary":"seeds SubscriptionPlans rows (Free, Basic, Pro, Enterprise)"}],"actions":[{"id":"auto-generated_1","kind":"mapping","label":"Generated designer migration","line":1,"detail":"File header indicates auto-generated migration designer","visibility":"detail-only","confidence":0.7},{"id":"annotation_23","kind":"mapping","label":"Model annotations","line":23,"detail":"modelBuilder.HasAnnotation(\"ProductVersion\", \"10.0.7\") and Relational:MaxIdentifierLength","visibility":"detail-only","confidence":0.7},{"id":"extension-enable_27","kind":"mapping","label":"Enable Postgres vector extension","line":27,"detail":"NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, \"vector\")","visibility":"detail-only","confidence":0.7},{"id":"identity-config_28","kind":"mapping","label":"Configure identity sequences/identity by default","line":28,"detail":"NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder)","visibility":"detail-only","confidence":0.7},{"id":"entity-definition_30","kind":"mapping","label":"Define multiple EF entities (tables, keys, indexes)","line":30,"detail":"Defines AspNet identity tables and domain entities: Author, Ebook, KnowledgeUnit, KnowledgeUnitLink, NexusUser, QuizResult, SemanticKnowledgeCache, SubscriptionPlan, etc.","visibility":"detail-only","confidence":0.7},{"id":"index_49","kind":"mapping","label":"Creates indexes","line":49,"detail":"Multiple HasIndex(...) calls throughout entity definitions (e.g., RoleNameIndex, TenantId, UserId, SourceId)","visibility":"detail-only","confidence":0.7},{"id":"schema-change_199","kind":"mapping","label":"Adds Ebook.IsReadyForReading column","line":199,"detail":"b.Property(\"IsReadyForReading\").HasColumnType(\"boolean\")","visibility":"detail-only","confidence":0.7},{"id":"seed-data_532","kind":"mapping","label":"Seed SubscriptionPlans","line":532,"detail":"Inserts four SubscriptionPlan rows (Free, Basic, Pro, Enterprise) with AITokenLimit, MonthlyPrice, PlanName, StripeProductId","visibility":"detail-only","confidence":0.7},{"id":"relationship_622","kind":"mapping","label":"Defines foreign keys and navigations","line":622,"detail":"Ebook->Author, Ebook->NexusUser, KnowledgeUnitLink->KnowledgeUnit, NexusUser->SubscriptionPlan, QuizResult->NexusUser","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"Author","kind":"entity","line":162,"purpose":"Represents an ebook author and related ebooks.","fields":[{"name":"Id","type":"int","required":true,"line":164,"description":"Primary key, identity"},{"name":"Name","type":"string","required":true,"line":170,"description":"Author name, max length 255"},{"name":"Ebooks","type":"ICollection","required":false,"line":684,"description":"Navigation collection of ebooks"}]},{"name":"Ebook","kind":"entity","line":180,"purpose":"Represents an uploaded ebook with metadata and reading progress for a user and tenant.","fields":[{"name":"Id","type":"Guid","required":true,"line":182,"description":"Primary key (uuid)"},{"name":"AddedDate","type":"DateTime","required":true,"line":186,"description":"When ebook was added"},{"name":"AuthorId","type":"int","required":true,"line":189,"description":"FK to Author"},{"name":"FilePath","type":"string","required":true,"line":195,"description":"Path to file storage"},{"name":"IsReadyForReading","type":"bool","required":true,"line":199,"description":"Flag set by migration indicating ebook processing completed"},{"name":"TenantId","type":"string","required":true,"line":215,"description":"Tenant identifier (max 128)"},{"name":"UserId","type":"string","required":true,"line":225,"description":"Owner user id (FK to NexusUser)"}]},{"name":"KnowledgeUnit","kind":"entity","line":240,"purpose":"Semantic vectorized knowledge chunk stored for retrieval and similarity search.","fields":[{"name":"Id","type":"string","required":true,"line":242,"description":"Primary key (max 128)"},{"name":"Content","type":"string","required":true,"line":246,"description":"Raw text content"},{"name":"Vector","type":"Vector","required":false,"line":269,"description":"Embedding vector (vector(768))"},{"name":"TenantId","type":"string","required":true,"line":261,"description":"Tenant identifier"}]},{"name":"KnowledgeUnitLink","kind":"entity","line":286,"purpose":"Represents directed relationships between KnowledgeUnits.","fields":[{"name":"Id","type":"int","required":true,"line":288,"description":"Primary key, identity"},{"name":"RelationType","type":"string","required":true,"line":294,"description":"Type of relation (max 50)"},{"name":"SourceUnitId","type":"string","required":true,"line":299,"description":"FK to source KnowledgeUnit"},{"name":"TargetUnitId","type":"string","required":true,"line":304,"description":"FK to target KnowledgeUnit"}]},{"name":"NexusUser","kind":"entity","line":318,"purpose":"Application user (extends identity) storing profile, tenant and AI token usage metadata.","fields":[{"name":"Id","type":"string","required":true,"line":320,"description":"Primary key (identity user id)"},{"name":"AITokenLimit","type":"int","required":false,"line":323,"description":"Allowed AI tokens per period"},{"name":"AITokensUsed","type":"int","required":false,"line":326,"description":"Consumed AI tokens"},{"name":"TenantId","type":"string","required":true,"line":388,"description":"Tenant id (max 128)"},{"name":"SubscriptionPlanId","type":"int","required":true,"line":383,"description":"FK to SubscriptionPlan with default value 1"}]},{"name":"QuizResult","kind":"entity","line":416,"purpose":"Stores the results of quizzes taken by users.","fields":[{"name":"Id","type":"Guid","required":true,"line":418,"description":"Primary key (uuid)"},{"name":"CompletedDate","type":"DateTime","required":true,"line":422,"description":"When quiz completed"},{"name":"Score","type":"int","required":true,"line":425,"description":"Score achieved"},{"name":"UserId","type":"string","required":true,"line":440,"description":"FK to NexusUser"}]},{"name":"SemanticKnowledgeCache","kind":"entity","line":453,"purpose":"Caches semantic query results with embeddings and metadata per tenant/model for reuse.","fields":[{"name":"ContentHash","type":"string","required":true,"line":455,"description":"Primary key and unique content hash (max 128)"},{"name":"JsonData","type":"string","required":true,"line":462,"description":"Serialized cached response"},{"name":"Vector","type":"Vector","required":false,"line":485,"description":"Embedding vector (vector(1536))"},{"name":"TenantId","type":"string","required":true,"line":480,"description":"Tenant id"}]},{"name":"SubscriptionPlan","kind":"entity","line":498,"purpose":"Defines subscription plans with AI token limits, pricing and Stripe product ids; also seeded with default plans.","fields":[{"name":"Id","type":"int","required":true,"line":500,"description":"Primary key, identity"},{"name":"AITokenLimit","type":"int","required":true,"line":506,"description":"Token allowance for plan"},{"name":"IsUnlimitedTokens","type":"bool","required":true,"line":509,"description":"Flag for unlimited tokens"},{"name":"MonthlyPrice","type":"decimal","required":true,"line":512,"description":"Monthly price"},{"name":"PlanName","type":"string","required":true,"line":515,"description":"Plan name (unique, max 50)"},{"name":"StripeProductId","type":"string","required":true,"line":520,"description":"Stripe product identifier"}]},{"name":"Identity tables (AspNetRoles/AspNetUsers/etc.)","kind":"entity","line":30,"purpose":"Standard ASP.NET Identity schema definitions for roles, users, claims, logins, tokens and role-claim/user-role relationships.","fields":[{"name":"Role.Id/Name/NormalizedName","type":"string","required":true,"line":32,"description":"Role identity fields"},{"name":"User.Id/UserName/NormalizedUserName/Email","type":"string","required":true,"line":320,"description":"User identity and profile fields"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Data.Persistence/AppDbContext (referenced by [DbContext])","NexusReader.Domain.Entities (entities referenced by modelBuilder string names)"],"patterns":["EF Core Migration","Entity Relationship Mapping","Seed Data"],"domainConcepts":["Ebook","Author","KnowledgeUnit","NexusUser","SubscriptionPlan","SemanticKnowledgeCache"],"keyDetails":"Migration designer defines Postgres vector extension and identity configuration, adds an IsReadyForReading boolean column to Ebook, sets up relationships and indexes across domain entities, and seeds four SubscriptionPlan rows (Free, Basic, Pro, Enterprise). File is auto-generated by EF Core migration scaffolding.","orchestrationMethods":[{"name":"BuildTargetModel","line":20,"confidence":0.93,"reason":"Coordinates 6 downstream calls with 0 architectural actions.","actionKinds":["mapping"],"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260513181743_AddEbookReadyFlag.Designer.cs","unknown","unknown","unknown","unknown","unknown"]}],"typedContracts":[{"name":"Author","kind":"entity","line":162,"fieldCount":3,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260513181743_AddEbookReadyFlag.Designer.cs"]},{"name":"Ebook","kind":"entity","line":180,"fieldCount":7,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260513181743_AddEbookReadyFlag.Designer.cs"]},{"name":"KnowledgeUnit","kind":"entity","line":240,"fieldCount":4,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260513181743_AddEbookReadyFlag.Designer.cs"]},{"name":"KnowledgeUnitLink","kind":"entity","line":286,"fieldCount":4,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260513181743_AddEbookReadyFlag.Designer.cs"]},{"name":"NexusUser","kind":"entity","line":318,"fieldCount":5,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260513181743_AddEbookReadyFlag.Designer.cs"]},{"name":"QuizResult","kind":"entity","line":416,"fieldCount":4,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260513181743_AddEbookReadyFlag.Designer.cs"]},{"name":"SemanticKnowledgeCache","kind":"entity","line":453,"fieldCount":4,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260513181743_AddEbookReadyFlag.Designer.cs"]},{"name":"SubscriptionPlan","kind":"entity","line":498,"fieldCount":6,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260513181743_AddEbookReadyFlag.Designer.cs"]},{"name":"Identity tables (AspNetRoles/AspNetUsers/etc.)","kind":"entity","line":30,"fieldCount":2,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260513181743_AddEbookReadyFlag.Designer.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"orchestration-method","label":"BuildTargetModel","line":20,"summary":"Coordinates 6 downstream calls with 0 architectural actions.","confidence":0.93,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260513181743_AddEbookReadyFlag.Designer.cs","unknown","unknown","unknown","unknown","unknown"]},{"kind":"typed-contract","label":"Author","line":162,"summary":"entity with 3 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260513181743_AddEbookReadyFlag.Designer.cs"]},{"kind":"typed-contract","label":"Ebook","line":180,"summary":"entity with 7 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260513181743_AddEbookReadyFlag.Designer.cs"]},{"kind":"typed-contract","label":"KnowledgeUnit","line":240,"summary":"entity with 4 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260513181743_AddEbookReadyFlag.Designer.cs"]},{"kind":"typed-contract","label":"KnowledgeUnitLink","line":286,"summary":"entity with 4 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260513181743_AddEbookReadyFlag.Designer.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Data__Persistence__Migrations__20260513181743_AddEbookReadyFlag.cs.json b/src/.documentation/cache/summaries/NexusReader.Data__Persistence__Migrations__20260513181743_AddEbookReadyFlag.cs.json new file mode 100644 index 0000000..5161be3 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Data__Persistence__Migrations__20260513181743_AddEbookReadyFlag.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Data/Persistence/Migrations/20260513181743_AddEbookReadyFlag.cs","purpose":"EF Core migration that adds a boolean IsReadyForReading column to the Ebooks table (and removes it on rollback).","classification":{"role":"database-config","layer":"data","confidence":0.9,"evidence":["Namespace: NexusReader.Data.Persistence.Migrations","Class derives from Microsoft.EntityFrameworkCore.Migrations.Migration","Calls migrationBuilder.AddColumn / DropColumn to change DB schema"]},"className":"AddEbookReadyFlag","methods":[{"name":"Up","line":11,"endLine":19,"signature":"(migrationBuilder: MigrationBuilder) -> void","purpose":"Applies the migration by adding the IsReadyForReading boolean column (default false) to the Ebooks table.","calls":[{"targetFile":"unknown","targetMethod":"migrationBuilder.AddColumn","callLine":13,"paramSummary":"name: \"IsReadyForReading\", table: \"Ebooks\", type: \"boolean\", nullable: false, defaultValue: false"}],"actions":[{"id":"migration-step_11","kind":"mapping","label":"Up migration","line":11,"detail":"Defines the forward/upgrade migration step","visibility":"detail-only","confidence":0.7},{"id":"schema-change_13","kind":"mapping","label":"Add column","line":13,"detail":"migrationBuilder.AddColumn(name: \"IsReadyForReading\", table: \"Ebooks\", type: \"boolean\", nullable: false, defaultValue: false)","visibility":"detail-only","confidence":0.7}]},{"name":"Down","line":22,"endLine":26,"signature":"(migrationBuilder: MigrationBuilder) -> void","purpose":"Reverts the migration by removing the IsReadyForReading column from the Ebooks table.","calls":[{"targetFile":"unknown","targetMethod":"migrationBuilder.DropColumn","callLine":24,"paramSummary":"name: \"IsReadyForReading\", table: \"Ebooks\""}],"actions":[{"id":"migration-step_22","kind":"mapping","label":"Down migration","line":22,"detail":"Defines the rollback/downgrade migration step","visibility":"detail-only","confidence":0.7},{"id":"schema-change_24","kind":"mapping","label":"Drop column","line":24,"detail":"migrationBuilder.DropColumn(name: \"IsReadyForReading\", table: \"Ebooks\")","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"AddEbookReadyFlag","kind":"model","line":8,"purpose":"EF Core migration class that encapsulates schema changes to add/remove the IsReadyForReading column for Ebooks.","fields":[]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["EF Core Migration"],"domainConcepts":["Ebook"],"keyDetails":"Adds a non-nullable boolean column IsReadyForReading to the Ebooks table with default false; Down removes that column.","orchestrationMethods":[],"typedContracts":[{"name":"AddEbookReadyFlag","kind":"model","line":8,"fieldCount":0,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260513181743_AddEbookReadyFlag.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"AddEbookReadyFlag","line":8,"summary":"model with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260513181743_AddEbookReadyFlag.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Data__Persistence__Migrations__20260513183726_FixKnowledgeUnitEbookId.Designer.cs.json b/src/.documentation/cache/summaries/NexusReader.Data__Persistence__Migrations__20260513183726_FixKnowledgeUnitEbookId.Designer.cs.json new file mode 100644 index 0000000..ffb31e8 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Data__Persistence__Migrations__20260513183726_FixKnowledgeUnitEbookId.Designer.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Data/Persistence/Migrations/20260513183726_FixKnowledgeUnitEbookId.Designer.cs","purpose":"EF Core migration designer snapshot that defines the target EF Core model for the migration 'FixKnowledgeUnitEbookId' — maps tables, columns, indexes, relationships, Postgres vector extension, and seeds SubscriptionPlan data.","classification":{"role":"database-config","layer":"data","confidence":0.86,"evidence":["Class decorated with [DbContext(typeof(AppDbContext))] and [Migration(...)]","Contains BuildTargetModel(ModelBuilder) that declares entities, properties, relationships and seed HasData"]},"className":"FixKnowledgeUnitEbookId","methods":[{"name":"BuildTargetModel","line":20,"endLine":710,"signature":"(modelBuilder: ModelBuilder) -> void","purpose":"Constructs the EF Core model: configures annotations, registers Postgres/vector extensions, declares entity mappings (columns, keys, indexes), relationships, navigations and seeds SubscriptionPlan rows.","calls":[],"actions":[{"id":"annotation_23","kind":"mapping","label":"Set model annotations","line":23,"detail":"modelBuilder.HasAnnotation(\"ProductVersion\", \"10.0.7\").HasAnnotation(\"Relational:MaxIdentifierLength\", 63)","visibility":"detail-only","confidence":0.7},{"id":"extension-registration_27","kind":"mapping","label":"Register Postgres vector extension","line":27,"detail":"NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, \"vector\")","visibility":"detail-only","confidence":0.7},{"id":"db-config_28","kind":"mapping","label":"Use identity-by-default columns for Postgres","line":28,"detail":"NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder)","visibility":"detail-only","confidence":0.7},{"id":"entity-declaration_30","kind":"mapping","label":"Configure IdentityRole table mapping (AspNetRoles)","line":30,"detail":"Defines columns, keys, unique index on NormalizedName and maps to AspNetRoles","visibility":"detail-only","confidence":0.7},{"id":"entity-declaration_162","kind":"mapping","label":"Configure Author entity","line":162,"detail":"Defines Id (int, identity), Name (required, max 255), table Authors and key","visibility":"detail-only","confidence":0.7},{"id":"entity-declaration_180","kind":"mapping","label":"Configure Ebook entity","line":180,"detail":"Defines Id (Guid, uuid), AddedDate, AuthorId FK, FilePath, TenantId, Title, indexes on AuthorId/TenantId/UserId, table Ebooks","visibility":"detail-only","confidence":0.7},{"id":"entity-declaration_240","kind":"mapping","label":"Configure KnowledgeUnit entity","line":240,"detail":"Defines Id (string max128), Content (required text), EbookId (Guid, uuid) FK, Vector column vector(768), Version, TenantId, indexes and table KnowledgeUnits","visibility":"detail-only","confidence":0.7},{"id":"column-type_267","kind":"mapping","label":"Declare vector typed columns","line":267,"detail":"KnowledgeUnit.Vector mapped to vector(768); SemanticKnowledgeCache.Vector mapped to vector(1536)","visibility":"detail-only","confidence":0.7},{"id":"entity-declaration_284","kind":"mapping","label":"Configure KnowledgeUnitLink entity","line":284,"detail":"Defines Id (int identity), RelationType, SourceUnitId, TargetUnitId (string max128), indexes and table KnowledgeUnitLinks","visibility":"detail-only","confidence":0.7},{"id":"entity-declaration_316","kind":"mapping","label":"Configure NexusUser entity (AspNetUsers mapping)","line":316,"detail":"Defines many identity/user columns, SubscriptionPlanId (int, default 1), indexes on NormalizedEmail/NormalizedUserName/SubscriptionPlanId/TenantId and table AspNetUsers","visibility":"detail-only","confidence":0.7},{"id":"entity-declaration_414","kind":"mapping","label":"Configure QuizResult entity","line":414,"detail":"Defines Id (Guid), CompletedDate, Score, Topic, UserId, TenantId, indexes and table QuizResults","visibility":"detail-only","confidence":0.7},{"id":"entity-declaration_451","kind":"mapping","label":"Configure SemanticKnowledgeCache entity","line":451,"detail":"Defines ContentHash (pk), JsonData, ModelId, OriginalText, PromptVersion, Vector column vector(1536), TenantId and table SemanticKnowledgeCache","visibility":"detail-only","confidence":0.7},{"id":"entity-declaration_496","kind":"mapping","label":"Configure SubscriptionPlan entity with seed data","line":496,"detail":"Defines Id (int identity), AITokenLimit, PlanName (unique), StripeProductId and seeds 4 plan rows via HasData (Free, Basic, Pro, Enterprise)","visibility":"detail-only","confidence":0.7},{"id":"persistence-seed_530","kind":"mapping","label":"Seed SubscriptionPlan rows","line":530,"detail":"b.HasData(...) inserts 4 initial SubscriptionPlan records with Ids 1-4 and different AITokenLimit/MonthlyPrice/PlanName/StripeProductId","visibility":"detail-only","confidence":0.7},{"id":"relationship_620","kind":"mapping","label":"Ebook -> Author and Ebook -> NexusUser (FKs)","line":620,"detail":"b.HasOne Author with ForeignKey AuthorId (Restrict). b.HasOne User with ForeignKey UserId (Cascade)","visibility":"detail-only","confidence":0.7},{"id":"navigation-registration_634","kind":"mapping","label":"Register entity navigations","line":634,"detail":"Multiple b.Navigation(...) calls add EF navigation properties for relations (Author, User, IncomingLinks, OutgoingLinks, SubscriptionPlan, QuizResults, Ebooks)","visibility":"detail-only","confidence":0.7},{"id":"relationship_639","kind":"mapping","label":"KnowledgeUnit -> Ebook (FK)","line":639,"detail":"HasOne Ebook with ForeignKey EbookId (Cascade, required)","visibility":"detail-only","confidence":0.7},{"id":"relationship_650","kind":"mapping","label":"KnowledgeUnitLink -> KnowledgeUnit (Source/Target FKs)","line":650,"detail":"SourceUnitId -> KnowledgeUnit (OutgoingLinks), TargetUnitId -> KnowledgeUnit (IncomingLinks), both Cascade","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"FixKnowledgeUnitEbookId","kind":"model","line":17,"purpose":"Partial Migration class representing this EF Core migration snapshot","fields":[{"name":"BuildTargetModel","type":"method","required":true,"line":20,"description":"Override that constructs the ModelBuilder snapshot for migration"}]},{"name":"NexusReader.Domain.Entities.Ebook","kind":"entity","line":180,"purpose":"Domain entity mapping for ebooks (file, metadata, FK to Author & User)","fields":[{"name":"Id","type":"Guid","required":true,"line":182,"description":"Primary key (uuid)"},{"name":"AddedDate","type":"DateTime","required":true,"line":186,"description":"Date added"},{"name":"AuthorId","type":"int","required":true,"line":189,"description":"FK to Author (integer)"},{"name":"FilePath","type":"string","required":true,"line":195,"description":"Stored file path"},{"name":"TenantId","type":"string","required":true,"line":215,"description":"Tenant identifier (max 128)"},{"name":"Title","type":"string","required":true,"line":220,"description":"Ebook title"},{"name":"UserId","type":"string","required":true,"line":225,"description":"Owner user id (text)"}]},{"name":"NexusReader.Domain.Entities.KnowledgeUnit","kind":"entity","line":240,"purpose":"Vectorized knowledge unit associated with an Ebook and tenant-scoped","fields":[{"name":"Id","type":"string","required":true,"line":242,"description":"Primary key (max 128)"},{"name":"Content","type":"string","required":true,"line":246,"description":"Stored text content"},{"name":"CreatedAt","type":"DateTime","required":true,"line":250,"description":"Creation timestamp"},{"name":"EbookId","type":"Guid","required":true,"line":253,"description":"FK to Ebook (uuid)"},{"name":"Vector","type":"Vector","required":false,"line":267,"description":"Pgvector embedding vector(768)"},{"name":"Version","type":"string","required":true,"line":270,"description":"Version string (max 50)"},{"name":"TenantId","type":"string","required":true,"line":259,"description":"Tenant identifier"}]},{"name":"NexusReader.Domain.Entities.KnowledgeUnitLink","kind":"entity","line":284,"purpose":"Represents directed relations between KnowledgeUnits","fields":[{"name":"Id","type":"int","required":true,"line":286,"description":"Identity PK"},{"name":"RelationType","type":"string","required":true,"line":292,"description":"Type of relation (max 50)"},{"name":"SourceUnitId","type":"string","required":true,"line":297,"description":"FK to source KnowledgeUnit (max 128)"},{"name":"TargetUnitId","type":"string","required":true,"line":302,"description":"FK to target KnowledgeUnit (max 128)"}]},{"name":"NexusReader.Domain.Entities.NexusUser","kind":"entity","line":316,"purpose":"Application user mapping (extends Identity user fields, subscription and tenant info)","fields":[{"name":"Id","type":"string","required":true,"line":318,"description":"User id (text)"},{"name":"SubscriptionPlanId","type":"int","required":true,"line":381,"description":"FK to SubscriptionPlan with default 1"},{"name":"TenantId","type":"string","required":true,"line":386,"description":"Tenant id (max 128)"},{"name":"LastAiActionDate","type":"DateTime?","required":false,"line":345,"description":"Last AI action timestamp"}]},{"name":"NexusReader.Domain.Entities.SubscriptionPlan","kind":"entity","line":496,"purpose":"Subscription plan metadata and limits (seeded with default plans)","fields":[{"name":"Id","type":"int","required":true,"line":498,"description":"Primary key (identity)"},{"name":"AITokenLimit","type":"int","required":true,"line":504,"description":"Token limit for AI features"},{"name":"IsUnlimitedTokens","type":"bool","required":true,"line":507,"description":"Flag for unlimited tokens"},{"name":"MonthlyPrice","type":"decimal","required":true,"line":510,"description":"Price per month"},{"name":"PlanName","type":"string","required":true,"line":513,"description":"Plan name (unique)"},{"name":"StripeProductId","type":"string","required":true,"line":518,"description":"Stripe product id"}]},{"name":"NexusReader.Domain.Entities.SemanticKnowledgeCache","kind":"entity","line":451,"purpose":"Cache for semantic embeddings and metadata keyed by content hash","fields":[{"name":"ContentHash","type":"string","required":true,"line":453,"description":"Primary key and unique hash (max 128)"},{"name":"JsonData","type":"string","required":true,"line":460,"description":"Serialized JSON cache data"},{"name":"Vector","type":"Vector","required":false,"line":483,"description":"Pgvector embedding vector(1536)"},{"name":"TenantId","type":"string","required":true,"line":478,"description":"Tenant id"}]},{"name":"NexusReader.Domain.Entities.Author","kind":"entity","line":162,"purpose":"Author metadata for ebooks","fields":[{"name":"Id","type":"int","required":true,"line":164,"description":"Primary key (identity)"},{"name":"Name","type":"string","required":true,"line":170,"description":"Author name (max 255)"}]},{"name":"NexusReader.Domain.Entities.QuizResult","kind":"entity","line":414,"purpose":"Stores quiz completion results per user and tenant","fields":[{"name":"Id","type":"Guid","required":true,"line":416,"description":"Primary key (uuid)"},{"name":"CompletedDate","type":"DateTime","required":true,"line":420,"description":"Completion time"},{"name":"Score","type":"int","required":true,"line":423,"description":"Score value"},{"name":"UserId","type":"string","required":true,"line":438,"description":"FK to user"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Data.Persistence/AppDbContext.cs","NexusReader.Domain.Entities/Ebook.cs","NexusReader.Domain.Entities/KnowledgeUnit.cs","NexusReader.Domain.Entities/KnowledgeUnitLink.cs","NexusReader.Domain.Entities/NexusUser.cs","NexusReader.Domain.Entities/SubscriptionPlan.cs","NexusReader.Domain.Entities/SemanticKnowledgeCache.cs","NexusReader.Domain.Entities/Author.cs","NexusReader.Domain.Entities/QuizResult.cs"],"patterns":["EF Core Migration","Fluent API model mapping","Data seeding"],"domainConcepts":["Ebook","KnowledgeUnit (vectorized content)","KnowledgeUnitLink (relations)","SubscriptionPlan","SemanticKnowledgeCache","NexusUser","Author","QuizResult"],"keyDetails":"This migration snapshot registers Postgres 'vector' extension and pgvector column types (vector(768) and vector(1536)), configures FK delete behaviors (Cascade/Restrict), and seeds default SubscriptionPlan records (Ids 1-4).","orchestrationMethods":[],"typedContracts":[{"name":"FixKnowledgeUnitEbookId","kind":"model","line":17,"fieldCount":1,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260513183726_FixKnowledgeUnitEbookId.Designer.cs"]},{"name":"NexusReader.Domain.Entities.Ebook","kind":"entity","line":180,"fieldCount":7,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260513183726_FixKnowledgeUnitEbookId.Designer.cs"]},{"name":"NexusReader.Domain.Entities.KnowledgeUnit","kind":"entity","line":240,"fieldCount":7,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260513183726_FixKnowledgeUnitEbookId.Designer.cs"]},{"name":"NexusReader.Domain.Entities.KnowledgeUnitLink","kind":"entity","line":284,"fieldCount":4,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260513183726_FixKnowledgeUnitEbookId.Designer.cs"]},{"name":"NexusReader.Domain.Entities.NexusUser","kind":"entity","line":316,"fieldCount":4,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260513183726_FixKnowledgeUnitEbookId.Designer.cs"]},{"name":"NexusReader.Domain.Entities.SubscriptionPlan","kind":"entity","line":496,"fieldCount":6,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260513183726_FixKnowledgeUnitEbookId.Designer.cs"]},{"name":"NexusReader.Domain.Entities.SemanticKnowledgeCache","kind":"entity","line":451,"fieldCount":4,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260513183726_FixKnowledgeUnitEbookId.Designer.cs"]},{"name":"NexusReader.Domain.Entities.Author","kind":"entity","line":162,"fieldCount":2,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260513183726_FixKnowledgeUnitEbookId.Designer.cs"]},{"name":"NexusReader.Domain.Entities.QuizResult","kind":"entity","line":414,"fieldCount":4,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260513183726_FixKnowledgeUnitEbookId.Designer.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"FixKnowledgeUnitEbookId","line":17,"summary":"model with 1 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260513183726_FixKnowledgeUnitEbookId.Designer.cs"]},{"kind":"typed-contract","label":"NexusReader.Domain.Entities.Ebook","line":180,"summary":"entity with 7 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260513183726_FixKnowledgeUnitEbookId.Designer.cs"]},{"kind":"typed-contract","label":"NexusReader.Domain.Entities.KnowledgeUnit","line":240,"summary":"entity with 7 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260513183726_FixKnowledgeUnitEbookId.Designer.cs"]},{"kind":"typed-contract","label":"NexusReader.Domain.Entities.KnowledgeUnitLink","line":284,"summary":"entity with 4 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260513183726_FixKnowledgeUnitEbookId.Designer.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Data__Persistence__Migrations__20260513183726_FixKnowledgeUnitEbookId.cs.json b/src/.documentation/cache/summaries/NexusReader.Data__Persistence__Migrations__20260513183726_FixKnowledgeUnitEbookId.cs.json new file mode 100644 index 0000000..57d9bc0 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Data__Persistence__Migrations__20260513183726_FixKnowledgeUnitEbookId.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Data/Persistence/Migrations/20260513183726_FixKnowledgeUnitEbookId.cs","purpose":"EF Core migration that replaces a string SourceId on KnowledgeUnits with a Guid EbookId, adds an index and foreign key to Ebooks (cascade delete); provides Up and Down schema transitions.","classification":{"role":"database-config","layer":"data","confidence":0.9,"evidence":["Class derives from Migration (line 9)","Uses MigrationBuilder to alter KnowledgeUnits table: AddColumn, DropColumn, CreateIndex, AddForeignKey (lines 14-40, 46-69)"]},"className":"FixKnowledgeUnitEbookId","methods":[{"name":"Up","line":12,"endLine":41,"signature":"(migrationBuilder: MigrationBuilder) -> void","purpose":"Apply schema changes: remove SourceId (string) and its index from KnowledgeUnits, add non-nullable EbookId (Guid) with default Guid.Zero, create index on EbookId and add FK to Ebooks.Id with cascade delete.","calls":[],"actions":[{"id":"drop-index_14","kind":"mapping","label":"Drop IX_KnowledgeUnits_SourceId index","line":14,"detail":"migrationBuilder.DropIndex(name: \"IX_KnowledgeUnits_SourceId\", table: \"KnowledgeUnits\")","visibility":"detail-only","confidence":0.7},{"id":"drop-column_18","kind":"mapping","label":"Drop SourceId column","line":18,"detail":"migrationBuilder.DropColumn(name: \"SourceId\", table: \"KnowledgeUnits\")","visibility":"detail-only","confidence":0.7},{"id":"add-column_22","kind":"mapping","label":"Add EbookId column (Guid, non-nullable, default Guid.Empty)","line":22,"detail":"migrationBuilder.AddColumn(name: \"EbookId\", table: \"KnowledgeUnits\", type: \"uuid\", nullable: false, defaultValue: Guid.Empty)","visibility":"detail-only","confidence":0.7},{"id":"create-index_29","kind":"mapping","label":"Create IX_KnowledgeUnits_EbookId index","line":29,"detail":"migrationBuilder.CreateIndex(name: \"IX_KnowledgeUnits_EbookId\", table: \"KnowledgeUnits\", column: \"EbookId\")","visibility":"detail-only","confidence":0.7},{"id":"add-foreign-key_34","kind":"mapping","label":"Add FK from KnowledgeUnits.EbookId -> Ebooks.Id with cascade delete","line":34,"detail":"migrationBuilder.AddForeignKey(name: \"FK_KnowledgeUnits_Ebooks_EbookId\", table: \"KnowledgeUnits\", column: \"EbookId\", principalTable: \"Ebooks\", principalColumn: \"Id\", onDelete: ReferentialAction.Cascade)","visibility":"detail-only","confidence":0.7}]},{"name":"Down","line":44,"endLine":70,"signature":"(migrationBuilder: MigrationBuilder) -> void","purpose":"Revert schema changes: remove foreign key, index and EbookId column; re-add SourceId (string) with max length 128 and its index.","calls":[],"actions":[{"id":"drop-foreign-key_46","kind":"mapping","label":"Drop FK_KnowledgeUnits_Ebooks_EbookId","line":46,"detail":"migrationBuilder.DropForeignKey(name: \"FK_KnowledgeUnits_Ebooks_EbookId\", table: \"KnowledgeUnits\")","visibility":"detail-only","confidence":0.7},{"id":"drop-index_50","kind":"mapping","label":"Drop IX_KnowledgeUnits_EbookId index","line":50,"detail":"migrationBuilder.DropIndex(name: \"IX_KnowledgeUnits_EbookId\", table: \"KnowledgeUnits\")","visibility":"detail-only","confidence":0.7},{"id":"drop-column_54","kind":"mapping","label":"Drop EbookId column","line":54,"detail":"migrationBuilder.DropColumn(name: \"EbookId\", table: \"KnowledgeUnits\")","visibility":"detail-only","confidence":0.7},{"id":"add-column_58","kind":"mapping","label":"Re-add SourceId column (string, maxLength 128, non-nullable, default \"\")","line":58,"detail":"migrationBuilder.AddColumn(name: \"SourceId\", table: \"KnowledgeUnits\", type: \"character varying(128)\", maxLength: 128, nullable: false, defaultValue: \"\")","visibility":"detail-only","confidence":0.7},{"id":"create-index_66","kind":"mapping","label":"Re-create IX_KnowledgeUnits_SourceId index","line":66,"detail":"migrationBuilder.CreateIndex(name: \"IX_KnowledgeUnits_SourceId\", table: \"KnowledgeUnits\", column: \"SourceId\")","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"FixKnowledgeUnitEbookId","kind":"model","line":9,"purpose":"EF Core Migration class that applies/reverts the KnowledgeUnits EbookId/SourceId schema changes.","fields":[]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["EF Core Migration"],"domainConcepts":["KnowledgeUnit","Ebook"],"keyDetails":"Up adds non-nullable EbookId Guid with default Guid.Empty and cascade delete FK to Ebooks.Id; Down restores SourceId as non-nullable string(128).","orchestrationMethods":[],"typedContracts":[{"name":"FixKnowledgeUnitEbookId","kind":"model","line":9,"fieldCount":0,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260513183726_FixKnowledgeUnitEbookId.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"FixKnowledgeUnitEbookId","line":9,"summary":"model with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260513183726_FixKnowledgeUnitEbookId.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Data__Persistence__Migrations__20260513185108_MakeKnowledgeUnitEbookIdNullable.Designer.cs.json b/src/.documentation/cache/summaries/NexusReader.Data__Persistence__Migrations__20260513185108_MakeKnowledgeUnitEbookIdNullable.Designer.cs.json new file mode 100644 index 0000000..d9bddec --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Data__Persistence__Migrations__20260513185108_MakeKnowledgeUnitEbookIdNullable.Designer.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Data/Persistence/Migrations/20260513185108_MakeKnowledgeUnitEbookIdNullable.Designer.cs","purpose":"EF Core migration designer partial class that reconstructs the target EF model used by the migration 20260513185108_MakeKnowledgeUnitEbookIdNullable; it declares entity schemas, relationships, indices and seed data for the application's database model.","classification":{"role":"database-config","layer":"data","confidence":0.8,"evidence":["Class has [DbContext(typeof(AppDbContext))] and [Migration(...)] attributes","Overrides BuildTargetModel(ModelBuilder) to configure entity mappings, relationships and seed data"]},"className":"MakeKnowledgeUnitEbookIdNullable","methods":[{"name":"BuildTargetModel","line":20,"endLine":709,"signature":"(modelBuilder: ModelBuilder) -> void","purpose":"Rebuilds the EF Core model for the migration: sets annotations, registers Postgres extensions, configures all entity types (properties, keys, indices), relationships, navigations and seed data.","calls":[],"actions":[{"id":"annotation_23","kind":"mapping","label":"Sets model annotations","line":23,"detail":"modelBuilder.HasAnnotation(\"ProductVersion\", \"10.0.7\").HasAnnotation(\"Relational:MaxIdentifierLength\", 63)","visibility":"detail-only","confidence":0.7},{"id":"extension-register_27","kind":"mapping","label":"Registers Postgres extension 'vector'","line":27,"detail":"NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, \"vector\")","visibility":"detail-only","confidence":0.7},{"id":"identity-config_28","kind":"mapping","label":"Configures Identity/ID generation defaults","line":28,"detail":"NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder) and multiple NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn calls for integer Ids","visibility":"detail-only","confidence":0.7},{"id":"entity-configuration_30","kind":"mapping","label":"Configures Microsoft.AspNetCore.Identity.IdentityRole entity","line":30,"detail":"Defines Id, ConcurrencyStamp, Name, NormalizedName, PK, unique index on NormalizedName and maps to AspNetRoles table","visibility":"detail-only","confidence":0.7},{"id":"index_49","kind":"mapping","label":"Defines indices for multiple entities","line":49,"detail":"Examples: Role.NormalizedName unique (RoleNameIndex) line 49-51, Ebook indices AuthorId/TenantId/UserId lines 231-235, KnowledgeUnit indices EbookId/TenantId lines 277-279","visibility":"detail-only","confidence":0.7},{"id":"entity-configuration_56","kind":"mapping","label":"Configures Identity role/claim/login/user-role/user-token entities","line":56,"detail":"Multiple Identity-related entity configs with properties, keys, indices and table mappings (lines ~56-160)","visibility":"detail-only","confidence":0.7},{"id":"entity-configuration_162","kind":"mapping","label":"Configures domain entity Author","line":162,"detail":"Author.Id (int, identity), Name required string(255), PK and table Authors","visibility":"detail-only","confidence":0.7},{"id":"entity-configuration_180","kind":"mapping","label":"Configures domain entity Ebook","line":180,"detail":"Ebook.Id (Guid), AddedDate, AuthorId, FilePath, TenantId, Title, UserId, indices on AuthorId/TenantId/UserId and table Ebooks","visibility":"detail-only","confidence":0.7},{"id":"entity-configuration_240","kind":"mapping","label":"Configures domain entity KnowledgeUnit","line":240,"detail":"KnowledgeUnit.Id (string), Content required, CreatedAt, EbookId (Guid? — nullable), Vector, Version, indices on EbookId and TenantId; maps to KnowledgeUnits","visibility":"detail-only","confidence":0.7},{"id":"schema-change-evidence_253","kind":"mapping","label":"EbookId nullable configuration","line":253,"detail":"KnowledgeUnit property EbookId is declared as Guid? (nullable) with column type 'uuid'","visibility":"detail-only","confidence":0.7},{"id":"property-configuration_267","kind":"mapping","label":"Configures vector-typed properties","line":267,"detail":"KnowledgeUnit.Vector has column type 'vector(768)'; SemanticKnowledgeCache.Vector 'vector(1536)'","visibility":"detail-only","confidence":0.7},{"id":"entity-configuration_284","kind":"mapping","label":"Configures KnowledgeUnitLink entity","line":284,"detail":"Link Id (int identity), RelationType, SourceUnitId, TargetUnitId, indices and table KnowledgeUnitLinks","visibility":"detail-only","confidence":0.7},{"id":"entity-configuration_316","kind":"mapping","label":"Configures NexusUser, QuizResult, SemanticKnowledgeCache, SubscriptionPlan","line":316,"detail":"User properties and indices (AspNetUsers), QuizResult mapping, SemanticKnowledgeCache with vector(1536), SubscriptionPlan with seeded data","visibility":"detail-only","confidence":0.7},{"id":"seed-data_530","kind":"mapping","label":"Seeds SubscriptionPlan rows","line":530,"detail":"b.HasData(...) provides 4 plans (Free, Basic, Pro, Enterprise) with IDs 1..4 and token limits/prices","visibility":"detail-only","confidence":0.7},{"id":"relationship_622","kind":"mapping","label":"Configures foreign-key relationships and delete behaviors","line":622,"detail":"Ebook -> Author (Restrict); Ebook -> NexusUser (Cascade); KnowledgeUnit -> Ebook (Cascade); various Identity FK relations with Cascade","visibility":"detail-only","confidence":0.7},{"id":"navigation_634","kind":"mapping","label":"Configures navigations","line":634,"detail":"b.Navigation declarations for Author, User, Ebook, SourceUnit, TargetUnit, SubscriptionPlan and other navigations","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"MakeKnowledgeUnitEbookIdNullable","kind":"model","line":17,"purpose":"Partial migration class that contains BuildTargetModel to reconstruct the target EF model for the migration","fields":[]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Data.Persistence.AppDbContext","Npgsql.EntityFrameworkCore.PostgreSQL (NpgsqlModelBuilderExtensions / NpgsqlPropertyBuilderExtensions)","Pgvector (Vector type)","NexusReader.Domain.Entities (Author, Ebook, KnowledgeUnit, KnowledgeUnitLink, NexusUser, QuizResult, SemanticKnowledgeCache, SubscriptionPlan)","Microsoft.AspNetCore.Identity entities"],"patterns":["EF Core Migration","Fluent API (entity configuration)","Data Seeding"],"domainConcepts":["Ebook","KnowledgeUnit","KnowledgeUnitLink","NexusUser","SubscriptionPlan","SemanticKnowledgeCache","Author","QuizResult"],"keyDetails":"Migration designer configures full EF model: registers Postgres 'vector' extension, maps entity properties/indices/relationships, seeds SubscriptionPlan rows. Notably KnowledgeUnit.EbookId is configured as nullable Guid (Guid?) and a FK to Ebook with Cascade delete configured in the model.","orchestrationMethods":[],"typedContracts":[{"name":"MakeKnowledgeUnitEbookIdNullable","kind":"model","line":17,"fieldCount":0,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260513185108_MakeKnowledgeUnitEbookIdNullable.Designer.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"MakeKnowledgeUnitEbookIdNullable","line":17,"summary":"model with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260513185108_MakeKnowledgeUnitEbookIdNullable.Designer.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Data__Persistence__Migrations__20260513185108_MakeKnowledgeUnitEbookIdNullable.cs.json b/src/.documentation/cache/summaries/NexusReader.Data__Persistence__Migrations__20260513185108_MakeKnowledgeUnitEbookIdNullable.cs.json new file mode 100644 index 0000000..9097b80 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Data__Persistence__Migrations__20260513185108_MakeKnowledgeUnitEbookIdNullable.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Data/Persistence/Migrations/20260513185108_MakeKnowledgeUnitEbookIdNullable.cs","purpose":"EF Core code-first migration that changes the KnowledgeUnits.EbookId column to be nullable (and provides a Down method to revert the change).","classification":{"role":"database-config","layer":"data","confidence":0.88,"evidence":["class inherits from Microsoft.EntityFrameworkCore.Migrations.Migration","namespace NexusReader.Data.Persistence.Migrations and methods Up/Down altering DB column"]},"className":"MakeKnowledgeUnitEbookIdNullable","methods":[{"name":"Up","line":12,"endLine":21,"signature":"(migrationBuilder: MigrationBuilder) -> void","purpose":"Applies the migration: alters the KnowledgeUnits.EbookId column to be nullable (type uuid).","calls":[],"actions":[{"id":"override_12","kind":"mapping","label":"EF Migration override","line":12,"detail":"protected override void Up(MigrationBuilder migrationBuilder) - runtime entry for applying migration","visibility":"detail-only","confidence":0.7},{"id":"schema-change_14","kind":"mapping","label":"AlterColumn to make EbookId nullable","line":14,"detail":"migrationBuilder.AlterColumn(name: \"EbookId\", table: \"KnowledgeUnits\", type: \"uuid\", nullable: true, oldClrType: typeof(Guid), oldType: \"uuid\");","visibility":"detail-only","confidence":0.7}]},{"name":"Down","line":24,"endLine":35,"signature":"(migrationBuilder: MigrationBuilder) -> void","purpose":"Reverts the migration: alters the KnowledgeUnits.EbookId column to be non-nullable and sets a default zero GUID.","calls":[],"actions":[{"id":"override_24","kind":"mapping","label":"EF Migration override","line":24,"detail":"protected override void Down(MigrationBuilder migrationBuilder) - runtime entry for reverting migration","visibility":"detail-only","confidence":0.7},{"id":"schema-change_26","kind":"mapping","label":"AlterColumn to make EbookId non-nullable with default","line":26,"detail":"migrationBuilder.AlterColumn(name: \"EbookId\", table: \"KnowledgeUnits\", type: \"uuid\", nullable: false, defaultValue: new Guid(\"00000000-0000-0000-0000-000000000000\"), oldClrType: typeof(Guid), oldType: \"uuid\", oldNullable: true);","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"MakeKnowledgeUnitEbookIdNullable","kind":"model","line":9,"purpose":"EF Core migration class that toggles nullability of KnowledgeUnits.EbookId.","fields":[{"name":"Up","type":"method","required":true,"line":12,"description":"Applies the migration to alter the column to nullable."},{"name":"Down","type":"method","required":true,"line":24,"description":"Reverts the migration, making the column non-nullable and adding a default GUID."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["EF Core Migration","Schema Migration"],"domainConcepts":["KnowledgeUnit","Ebook","EbookId"],"keyDetails":"The Up method makes KnowledgeUnits.EbookId nullable (uuid); the Down method restores non-nullable with a zero GUID default. File is strictly a data-layer DB migration with no external calls beyond EF MigrationBuilder.","orchestrationMethods":[],"typedContracts":[{"name":"MakeKnowledgeUnitEbookIdNullable","kind":"model","line":9,"fieldCount":2,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260513185108_MakeKnowledgeUnitEbookIdNullable.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"MakeKnowledgeUnitEbookIdNullable","line":9,"summary":"model with 2 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260513185108_MakeKnowledgeUnitEbookIdNullable.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Data__Persistence__Migrations__20260514184243_AddDescriptionToEbook.Designer.cs.json b/src/.documentation/cache/summaries/NexusReader.Data__Persistence__Migrations__20260514184243_AddDescriptionToEbook.Designer.cs.json new file mode 100644 index 0000000..43aa548 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Data__Persistence__Migrations__20260514184243_AddDescriptionToEbook.Designer.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Data/Persistence/Migrations/20260514184243_AddDescriptionToEbook.Designer.cs","purpose":"Auto-generated EF Core migration designer that describes the target EF model for the migration 'AddDescriptionToEbook' (maps entities, indexes, relationships, Postgres vector extension and seeds subscription plans).","classification":{"role":"database-config","layer":"data","confidence":0.9,"evidence":["Migration attribute and migration id on class (line 15-16).","Override of BuildTargetModel(ModelBuilder) which configures entities, keys, indexes and relationships (line 20).","Calls configuring Postgres vector extension and ID generation (lines 27-28, 62, 168, 293, 505)."]},"className":"AddDescriptionToEbook","methods":[{"name":"BuildTargetModel","line":20,"endLine":712,"signature":"(modelBuilder: ModelBuilder) -> void","purpose":"Constructs the EF Core model snapshot for this migration: sets annotations, extensions, entity mappings, relationships, indexes and seed data.","calls":[],"actions":[{"id":"configure-db-annotation_23","kind":"mapping","label":"Set product and identifier length annotations","line":23,"detail":"modelBuilder.HasAnnotation(\"ProductVersion\", \"10.0.7\").HasAnnotation(\"Relational:MaxIdentifierLength\", 63)","visibility":"detail-only","confidence":0.7},{"id":"extension_27","kind":"mapping","label":"Enable Postgres 'vector' extension","line":27,"detail":"NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, \"vector\")","visibility":"detail-only","confidence":0.7},{"id":"extension_28","kind":"mapping","label":"Configure identity column defaults for Postgres","line":28,"detail":"NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder)","visibility":"detail-only","confidence":0.7},{"id":"configure-entity_30","kind":"mapping","label":"Define Identity and application entities (properties, keys, indices, tables)","line":30,"detail":"Multiple modelBuilder.Entity(...) blocks define IdentityRole, IdentityUser*, Author, Ebook, KnowledgeUnit, KnowledgeUnitLink, NexusUser, QuizResult, SemanticKnowledgeCache, SubscriptionPlan etc.","visibility":"detail-only","confidence":0.7},{"id":"define-column_195","kind":"mapping","label":"Add 'Description' column to Ebook","line":195,"detail":"b.Property(\"Description\").HasColumnType(\"text\") — new/explicit column mapping for Ebook.Description","visibility":"detail-only","confidence":0.7},{"id":"index_234","kind":"mapping","label":"Create indices for foreign keys and tenant/user lookups","line":234,"detail":"Ebook indices on AuthorId, TenantId, UserId (lines 234-238) — multiple entities have HasIndex calls","visibility":"detail-only","confidence":0.7},{"id":"define-column_270","kind":"mapping","label":"Define vector typed columns","line":270,"detail":"KnowledgeUnit.Vector column configured as vector(768) (line 271); SemanticKnowledgeCache.Vector as vector(1536) (line 487)","visibility":"detail-only","confidence":0.7},{"id":"seed-data_533","kind":"mapping","label":"Seed SubscriptionPlan rows","line":533,"detail":"b.HasData(...) seeds 4 subscription plans (Free, Basic, Pro, Enterprise) with Ids and token limits","visibility":"detail-only","confidence":0.7},{"id":"foreign-key_623","kind":"mapping","label":"Configure relationships between entities","line":623,"detail":"HasOne/WithMany/HasForeignKey blocks configure relationships (e.g. Ebook->Author, Ebook->User, KnowledgeUnit->Ebook, KnowledgeUnitLink source/target, NexusUser->SubscriptionPlan)","visibility":"detail-only","confidence":0.7},{"id":"navigation_637","kind":"mapping","label":"Declare EF navigation properties","line":637,"detail":"b.Navigation(\"Author\") and b.Navigation(\"User\") for Ebook and other entity navigations","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"Microsoft.AspNetCore.Identity.IdentityRole","kind":"entity","line":30,"purpose":"Identity role table mapping for ASP.NET Core Identity.","fields":[{"name":"Id","type":"string","required":true,"line":32,"description":"Primary key"},{"name":"Name","type":"string","required":false,"line":39,"description":"Role name (max 256)"},{"name":"NormalizedName","type":"string","required":false,"line":43,"description":"Normalized role name (indexed unique)"}]},{"name":"NexusReader.Domain.Entities.Author","kind":"entity","line":162,"purpose":"Author entity mapped to Authors table; tracks author name and relation to ebooks.","fields":[{"name":"Id","type":"int","required":true,"line":164,"description":"Primary key, identity column"},{"name":"Name","type":"string","required":true,"line":170,"description":"Author name, required, max length 255"}]},{"name":"NexusReader.Domain.Entities.Ebook","kind":"entity","line":180,"purpose":"Ebook entity mapping to Ebooks table; stores metadata and reading state for a user's ebook.","fields":[{"name":"Id","type":"Guid","required":true,"line":182,"description":"Primary key (uuid), value-generated"},{"name":"AddedDate","type":"DateTime","required":true,"line":186,"description":"When ebook was added"},{"name":"AuthorId","type":"int","required":true,"line":189,"description":"FK to Author"},{"name":"CoverUrl","type":"string","required":false,"line":192,"description":"Optional cover image URL"},{"name":"Description","type":"string","required":false,"line":195,"description":"Text description (migration adds/configures this column)"},{"name":"FilePath","type":"string","required":true,"line":198,"description":"Path to ebook file"},{"name":"IsReadyForReading","type":"bool","required":true,"line":202,"description":"Flag if ready"},{"name":"LastChapter","type":"string","required":false,"line":205,"description":"Last read chapter title"},{"name":"LastReadDate","type":"DateTime?","required":false,"line":212,"description":"Nullable last read timestamp"},{"name":"Progress","type":"double","required":true,"line":215,"description":"Reading progress"},{"name":"TenantId","type":"string","required":true,"line":218,"description":"Tenant scoping id"},{"name":"Title","type":"string","required":true,"line":223,"description":"Ebook title"},{"name":"UserId","type":"string","required":true,"line":228,"description":"Owner user id (FK to NexusUser)"}]},{"name":"NexusReader.Domain.Entities.KnowledgeUnit","kind":"entity","line":243,"purpose":"Stores semantic knowledge units with vector embeddings and optional link to an Ebook.","fields":[{"name":"Id","type":"string","required":true,"line":245,"description":"Primary key (max length 128)"},{"name":"Content","type":"string","required":true,"line":249,"description":"The unit text content"},{"name":"CreatedAt","type":"DateTime","required":true,"line":253,"description":"Creation timestamp"},{"name":"EbookId","type":"Guid?","required":false,"line":256,"description":"Optional FK to Ebook"},{"name":"Vector","type":"Vector","required":true,"line":270,"description":"Embedding vector stored as vector(768)"},{"name":"Version","type":"string","required":true,"line":273,"description":"Version string (max 50)"},{"name":"TenantId","type":"string","required":true,"line":262,"description":"Tenant scoping id"}]},{"name":"NexusReader.Domain.Entities.KnowledgeUnitLink","kind":"entity","line":287,"purpose":"Represents directional links between KnowledgeUnit entries.","fields":[{"name":"Id","type":"int","required":true,"line":289,"description":"Primary key, identity"},{"name":"RelationType","type":"string","required":true,"line":295,"description":"Type of relation (max 50)"},{"name":"SourceUnitId","type":"string","required":true,"line":300,"description":"FK to source KnowledgeUnit"},{"name":"TargetUnitId","type":"string","required":true,"line":305,"description":"FK to target KnowledgeUnit"}]},{"name":"NexusReader.Domain.Entities.NexusUser","kind":"entity","line":319,"purpose":"Application user mapping (extends Identity user) with tenant, usage counters and relations to ebooks and quiz results.","fields":[{"name":"Id","type":"string","required":true,"line":321,"description":"Primary key"},{"name":"AITokenLimit","type":"int","required":true,"line":324,"description":"AI token limit for the user"},{"name":"AITokensUsed","type":"int","required":true,"line":327,"description":"AI tokens consumed"},{"name":"SubscriptionPlanId","type":"int","required":true,"line":384,"description":"FK to subscription plan (default value 1)"},{"name":"TenantId","type":"string","required":true,"line":389,"description":"Tenant scoping id"}]},{"name":"NexusReader.Domain.Entities.QuizResult","kind":"entity","line":417,"purpose":"Stores quiz results tied to a user and tenant.","fields":[{"name":"Id","type":"Guid","required":true,"line":419,"description":"Primary key (uuid)"},{"name":"CompletedDate","type":"DateTime","required":true,"line":423,"description":"Completion time"},{"name":"Score","type":"int","required":true,"line":426,"description":"Score value"},{"name":"UserId","type":"string","required":true,"line":441,"description":"FK to NexusUser"},{"name":"TenantId","type":"string","required":true,"line":429,"description":"Tenant scoping id"}]},{"name":"NexusReader.Domain.Entities.SemanticKnowledgeCache","kind":"entity","line":454,"purpose":"Cache table for semantic knowledge with vector embeddings, model id and prompt/version metadata.","fields":[{"name":"ContentHash","type":"string","required":true,"line":456,"description":"Primary key and unique content hash"},{"name":"JsonData","type":"string","required":true,"line":463,"description":"Serialized cache payload"},{"name":"ModelId","type":"string","required":true,"line":467,"description":"Model identifier"},{"name":"Vector","type":"Vector","required":true,"line":486,"description":"Embedding vector stored as vector(1536)"},{"name":"TenantId","type":"string","required":true,"line":481,"description":"Tenant scoping id"}]},{"name":"NexusReader.Domain.Entities.SubscriptionPlan","kind":"entity","line":499,"purpose":"Subscription plan table with token limits and pricing; seeded with default plans in the migration.","fields":[{"name":"Id","type":"int","required":true,"line":501,"description":"Primary key, identity"},{"name":"AITokenLimit","type":"int","required":true,"line":507,"description":"Token allowance for plan"},{"name":"IsUnlimitedTokens","type":"bool","required":true,"line":510,"description":"Flag indicating unlimited tokens"},{"name":"MonthlyPrice","type":"decimal","required":true,"line":513,"description":"Monthly price"},{"name":"PlanName","type":"string","required":true,"line":516,"description":"Plan name (unique)"},{"name":"StripeProductId","type":"string","required":true,"line":521,"description":"External Stripe product id"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Data.Persistence/AppDbContext.cs","NexusReader.Domain/Entities/*.cs"],"patterns":["EF Core Migration","Entity-Relationship Mapping","Data Seeding"],"domainConcepts":["Ebook","Author","KnowledgeUnit","KnowledgeUnitLink","NexusUser","SubscriptionPlan","SemanticKnowledgeCache","QuizResult"],"keyDetails":"Auto-generated EF Core migration designer for migration id '20260514184243_AddDescriptionToEbook'. Adds/ensures Ebook.Description column mapping, configures pgvector extension and vector-typed columns, and seeds SubscriptionPlan rows (lines 533-569).","orchestrationMethods":[],"typedContracts":[{"name":"Microsoft.AspNetCore.Identity.IdentityRole","kind":"entity","line":30,"fieldCount":3,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260514184243_AddDescriptionToEbook.Designer.cs"]},{"name":"NexusReader.Domain.Entities.Author","kind":"entity","line":162,"fieldCount":2,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260514184243_AddDescriptionToEbook.Designer.cs"]},{"name":"NexusReader.Domain.Entities.Ebook","kind":"entity","line":180,"fieldCount":13,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260514184243_AddDescriptionToEbook.Designer.cs"]},{"name":"NexusReader.Domain.Entities.KnowledgeUnit","kind":"entity","line":243,"fieldCount":7,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260514184243_AddDescriptionToEbook.Designer.cs"]},{"name":"NexusReader.Domain.Entities.KnowledgeUnitLink","kind":"entity","line":287,"fieldCount":4,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260514184243_AddDescriptionToEbook.Designer.cs"]},{"name":"NexusReader.Domain.Entities.NexusUser","kind":"entity","line":319,"fieldCount":5,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260514184243_AddDescriptionToEbook.Designer.cs"]},{"name":"NexusReader.Domain.Entities.QuizResult","kind":"entity","line":417,"fieldCount":5,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260514184243_AddDescriptionToEbook.Designer.cs"]},{"name":"NexusReader.Domain.Entities.SemanticKnowledgeCache","kind":"entity","line":454,"fieldCount":5,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260514184243_AddDescriptionToEbook.Designer.cs"]},{"name":"NexusReader.Domain.Entities.SubscriptionPlan","kind":"entity","line":499,"fieldCount":6,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260514184243_AddDescriptionToEbook.Designer.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"Microsoft.AspNetCore.Identity.IdentityRole","line":30,"summary":"entity with 3 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260514184243_AddDescriptionToEbook.Designer.cs"]},{"kind":"typed-contract","label":"NexusReader.Domain.Entities.Author","line":162,"summary":"entity with 2 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260514184243_AddDescriptionToEbook.Designer.cs"]},{"kind":"typed-contract","label":"NexusReader.Domain.Entities.Ebook","line":180,"summary":"entity with 13 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260514184243_AddDescriptionToEbook.Designer.cs"]},{"kind":"typed-contract","label":"NexusReader.Domain.Entities.KnowledgeUnit","line":243,"summary":"entity with 7 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260514184243_AddDescriptionToEbook.Designer.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Data__Persistence__Migrations__20260514184243_AddDescriptionToEbook.cs.json b/src/.documentation/cache/summaries/NexusReader.Data__Persistence__Migrations__20260514184243_AddDescriptionToEbook.cs.json new file mode 100644 index 0000000..de5d4cf --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Data__Persistence__Migrations__20260514184243_AddDescriptionToEbook.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Data/Persistence/Migrations/20260514184243_AddDescriptionToEbook.cs","purpose":"EF Core migration that adds a nullable text Description column to the Ebooks table and provides a down migration to remove it.","classification":{"role":"database-config","layer":"data","confidence":0.8,"evidence":["Class inherits Microsoft.EntityFrameworkCore.Migrations.Migration","Namespace NexusReader.Data.Persistence.Migrations","Defines Up and Down methods that alter the database schema (AddColumn/DropColumn)"]},"className":"AddDescriptionToEbook","methods":[{"name":"Up","line":11,"endLine":18,"signature":"(migrationBuilder: MigrationBuilder) -> void","purpose":"Apply the migration by adding a nullable text 'Description' column to the 'Ebooks' table.","calls":[],"actions":[{"id":"schema-change_13","kind":"mapping","label":"AddColumn Description on Ebooks","line":13,"detail":"migrationBuilder.AddColumn(name: \"Description\", table: \"Ebooks\", type: \"text\", nullable: true)","visibility":"detail-only","confidence":0.7}]},{"name":"Down","line":21,"endLine":26,"signature":"(migrationBuilder: MigrationBuilder) -> void","purpose":"Revert the migration by dropping the 'Description' column from the 'Ebooks' table.","calls":[],"actions":[{"id":"schema-change_23","kind":"mapping","label":"DropColumn Description from Ebooks","line":23,"detail":"migrationBuilder.DropColumn(name: \"Description\", table: \"Ebooks\")","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"AddDescriptionToEbook","kind":"model","line":8,"purpose":"Represents an EF Core migration that adds/removes the Description column on the Ebooks table.","fields":[]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["EF Core Migration"],"domainConcepts":["Ebook","Ebooks table","Description column"],"keyDetails":"This migration adds a nullable text column 'Description' to the 'Ebooks' table (Up) and removes it on rollback (Down).","orchestrationMethods":[],"typedContracts":[{"name":"AddDescriptionToEbook","kind":"model","line":8,"fieldCount":0,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260514184243_AddDescriptionToEbook.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"AddDescriptionToEbook","line":8,"summary":"model with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260514184243_AddDescriptionToEbook.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Domain__Entities__Author.cs.json b/src/.documentation/cache/summaries/NexusReader.Domain__Entities__Author.cs.json new file mode 100644 index 0000000..52e2067 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Domain__Entities__Author.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Domain/Entities/Author.cs","purpose":"Domain entity representing an Author in the NexusReader domain model; declares identity, display name and a navigation collection of related Ebook entities for ORM mapping.","classification":{"role":"entity","layer":"domain","confidence":0.95,"evidence":["Domain/entity pattern","Domain path heuristic","Namespace NexusReader.Domain.Entities","Class Author with data-annotation attributes [Key], [Required], [MaxLength] and a virtual navigation ICollection"]},"className":"Author","methods":[],"types":[{"name":"Author","kind":"entity","line":5,"purpose":"Represents an author record with identity, name and related ebooks for persistence via an ORM (EF Core).","fields":[{"name":"Id","type":"int","required":true,"line":8,"description":"Primary key; annotated with [Key]"},{"name":"Name","type":"string","required":true,"line":12,"description":"Author display name; annotated with [Required] and [MaxLength(255)], initialized to empty string"},{"name":"Ebooks","type":"ICollection","required":true,"line":14,"description":"Virtual navigation collection of related Ebook entities; initialized to new List() (ORM relationship)"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Domain/Entities/Ebook.cs"],"patterns":["Entity","ORM (EF Core) navigation property"],"domainConcepts":["Author","Ebook"],"keyDetails":"Uses System.ComponentModel.DataAnnotations for schema constraints; navigation property is virtual and initialized, indicating intended EF Core usage (lazy/proxy or relationship mapping).","orchestrationMethods":[],"typedContracts":[{"name":"Author","kind":"entity","line":5,"fieldCount":3,"evidencePaths":["NexusReader.Domain/Entities/Author.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"Author","line":5,"summary":"entity with 3 fields.","confidence":0.8,"evidencePaths":["NexusReader.Domain/Entities/Author.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Domain__Entities__Ebook.cs.json b/src/.documentation/cache/summaries/NexusReader.Domain__Entities__Ebook.cs.json new file mode 100644 index 0000000..05d43d4 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Domain__Entities__Ebook.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Domain/Entities/Ebook.cs","purpose":"Defines the domain entity Ebook with storage/ORM mapping, metadata, navigation properties (Author, NexusUser), and fields used for reading/progress and AI ingestion readiness.","classification":{"role":"entity","layer":"domain","confidence":0.9,"evidence":["Domain/entity pattern","Domain path heuristic","namespace NexusReader.Domain.Entities; (line 4)","Entity class Ebook with data annotations like [Key], [Required], [ForeignKey] (lines 11, 14, 21, 24, 29, 53, 56)","Contains domain properties and navigation properties Author and NexusUser (lines 21-22, 56-57)"]},"className":"Ebook","methods":[],"types":[{"name":"Ebook","kind":"entity","line":9,"purpose":"Represents an e-book owned/uploaded by a user including metadata, storage info, reading progress and AI ingestion state.","fields":[{"name":"Id","type":"Guid","required":true,"line":11,"description":"Primary key; initialized to a new Guid"},{"name":"Title","type":"string","required":true,"line":14,"description":"Book title; max length 255"},{"name":"AuthorId","type":"int","required":true,"line":18,"description":"Foreign key to Author"},{"name":"Author","type":"Author (navigation)","required":true,"line":21,"description":"Navigation property to Author (ForeignKey(nameof(AuthorId)))"},{"name":"FilePath","type":"string","required":true,"line":24,"description":"Path to stored ebook file"},{"name":"CoverUrl","type":"string?","required":false,"line":27,"description":"Optional cover image URL"},{"name":"TenantId","type":"string","required":true,"line":29,"description":"Tenant identifier (multi-tenant); max length 128; defaults to \"global\""},{"name":"AddedDate","type":"DateTime","required":true,"line":33,"description":"Creation/added timestamp; defaults to DateTime.UtcNow"},{"name":"LastReadDate","type":"DateTime?","required":false,"line":35,"description":"Nullable timestamp for last time read"},{"name":"Progress","type":"double","required":true,"line":37,"description":"Reading progress percentage (0..100); defaults to 0"},{"name":"LastChapter","type":"string?","required":false,"line":39,"description":"Optional last chapter title; max length 255"},{"name":"LastChapterIndex","type":"int","required":true,"line":42,"description":"Index of last read chapter; defaults to 0"},{"name":"Description","type":"string?","required":false,"line":44,"description":"Optional description or synopsis"},{"name":"IsReadyForReading","type":"bool","required":true,"line":50,"description":"Flag indicating AI ingestion/processing completed and knowledge units are available"},{"name":"UserId","type":"string","required":true,"line":53,"description":"Owner user id (required)"},{"name":"User","type":"NexusUser? (navigation)","required":false,"line":56,"description":"Optional navigation to NexusUser (ForeignKey(nameof(UserId)))"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Domain.Entities.Author","NexusReader.Domain.Entities.NexusUser"],"patterns":["ORM Entity","Repository (consumer)"],"domainConcepts":["Ebook","Author","NexusUser","Tenant","AI ingestion / Knowledge Units"],"keyDetails":"Entity includes multi-tenant TenantId defaulting to 'global', navigation properties for Author and NexusUser, and an IsReadyForReading flag indicating AI processing state used by ingestion/reading flows.","orchestrationMethods":[],"typedContracts":[{"name":"Ebook","kind":"entity","line":9,"fieldCount":16,"evidencePaths":["NexusReader.Domain/Entities/Ebook.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"Ebook","line":9,"summary":"entity with 16 fields.","confidence":0.8,"evidencePaths":["NexusReader.Domain/Entities/Ebook.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Domain__Entities__KnowledgeUnit.cs.json b/src/.documentation/cache/summaries/NexusReader.Domain__Entities__KnowledgeUnit.cs.json new file mode 100644 index 0000000..daf8a36 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Domain__Entities__KnowledgeUnit.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Domain/Entities/KnowledgeUnit.cs","purpose":"Defines the domain entity KnowledgeUnit which models a piece of knowledge (content, type, provenance) and its relationships for persistence (EF Core) within the Domain project.","classification":{"role":"entity","layer":"domain","confidence":0.95,"evidence":["Domain/entity pattern","Domain path heuristic","Namespace NexusReader.Domain.Entities","Class named KnowledgeUnit with [Key], [Required], [ForeignKey] attributes and navigation properties"]},"className":"KnowledgeUnit","methods":[],"types":[{"name":"KnowledgeUnit","kind":"entity","line":7,"purpose":"Represents a persisted unit of knowledge (content, type, version, tenant scoping) and links to other knowledge units.","fields":[{"name":"Id","type":"string","required":true,"line":9,"description":"Primary key (hash of Source+Content+Version), max length 128"},{"name":"EbookId","type":"Guid?","required":false,"line":13,"description":"Optional FK to an Ebook"},{"name":"Ebook","type":"Ebook?","required":false,"line":15,"description":"Navigation property to Ebook (ForeignKey on EbookId)"},{"name":"Version","type":"string","required":true,"line":18,"description":"Unit version, required, max length 50, default '1.0'"},{"name":"Type","type":"KnowledgeUnitType","required":true,"line":22,"description":"Domain enum indicating the unit type (from NexusReader.Domain.Enums)"},{"name":"Content","type":"string","required":true,"line":25,"description":"The textual content of the knowledge unit"},{"name":"MetadataJson","type":"string?","required":false,"line":28,"description":"Optional JSON string with metadata (e.g., page, path)"},{"name":"TenantId","type":"string","required":true,"line":30,"description":"Tenant scoping identifier, required, max length 128"},{"name":"CreatedAt","type":"DateTime","required":true,"line":34,"description":"Timestamp when the unit was created, defaulted to DateTime.UtcNow"},{"name":"OutgoingLinks","type":"ICollection","required":true,"line":37,"description":"Navigation collection of outgoing links to other KnowledgeUnit instances"},{"name":"IncomingLinks","type":"ICollection","required":true,"line":38,"description":"Navigation collection of incoming links from other KnowledgeUnit instances"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Domain/Enums (KnowledgeUnitType)","NexusReader.Domain/Entities/Ebook.cs","NexusReader.Domain/Entities/KnowledgeUnitLink.cs"],"patterns":["Entity","EF Core (Data Annotations)","Aggregate / Graph node (links to other units)"],"domainConcepts":["KnowledgeUnit","Ebook","KnowledgeUnitLink","Tenant scoping"],"keyDetails":"Primary-key is a derived hash (Source+Content+Version). The entity is EF Core oriented (DataAnnotations), includes tenant scoping, versioning, metadata JSON, created timestamp, and bidirectional link collections to model a graph of knowledge units.","orchestrationMethods":[],"typedContracts":[{"name":"KnowledgeUnit","kind":"entity","line":7,"fieldCount":11,"evidencePaths":["NexusReader.Domain/Entities/KnowledgeUnit.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"KnowledgeUnit","line":7,"summary":"entity with 11 fields.","confidence":0.8,"evidencePaths":["NexusReader.Domain/Entities/KnowledgeUnit.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Domain__Entities__KnowledgeUnitLink.cs.json b/src/.documentation/cache/summaries/NexusReader.Domain__Entities__KnowledgeUnitLink.cs.json new file mode 100644 index 0000000..8eb92df --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Domain__Entities__KnowledgeUnitLink.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Domain/Entities/KnowledgeUnitLink.cs","purpose":"Defines the domain entity KnowledgeUnitLink which models a directed link between two KnowledgeUnit entities with metadata (relation type) and EF Core data annotations for persistence.","classification":{"role":"entity","layer":"domain","confidence":0.9,"evidence":["Domain/entity pattern","Domain path heuristic","namespace NexusReader.Domain.Entities (line 4)","DataAnnotations attributes ([Key], [Required], [MaxLength], [ForeignKey]) applied to properties","Class models relationships to KnowledgeUnit (SourceUnit, TargetUnit) via foreign keys"]},"className":"KnowledgeUnitLink","methods":[],"types":[{"name":"KnowledgeUnitLink","kind":"entity","line":6,"purpose":"Represents a directed relationship/link between two KnowledgeUnit entities with a typed relation label and persistence annotations.","fields":[{"name":"Id","type":"int","required":true,"line":9,"description":"Primary key for the link (annotated with [Key])."},{"name":"SourceUnitId","type":"string","required":true,"line":13,"description":"FK string identifier of the source KnowledgeUnit; [Required], [MaxLength(128)], defaults to empty string."},{"name":"TargetUnitId","type":"string","required":true,"line":17,"description":"FK string identifier of the target KnowledgeUnit; [Required], [MaxLength(128)], defaults to empty string."},{"name":"RelationType","type":"string","required":true,"line":21,"description":"Label describing the relation (e.g., \"Next\", \"Defines\", \"Contains\"); [Required], [MaxLength(50)], default \"References\"."},{"name":"SourceUnit","type":"KnowledgeUnit","required":true,"line":24,"description":"Navigation property to the source KnowledgeUnit; annotated with [ForeignKey(nameof(SourceUnitId))]."},{"name":"TargetUnit","type":"KnowledgeUnit","required":true,"line":27,"description":"Navigation property to the target KnowledgeUnit; annotated with [ForeignKey(nameof(TargetUnitId))]."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Domain/Entities/KnowledgeUnit.cs"],"patterns":["Entity","EF Core Data Annotations","Foreign Key Relationship"],"domainConcepts":["KnowledgeUnit","KnowledgeUnitLink","RelationType"],"keyDetails":"Simple EF Core entity with primary key (Id), two string FK identifiers (SourceUnitId, TargetUnitId) with max lengths, a RelationType with default \"References\", and navigation properties annotated with [ForeignKey] to link to KnowledgeUnit entities.","orchestrationMethods":[],"typedContracts":[{"name":"KnowledgeUnitLink","kind":"entity","line":6,"fieldCount":6,"evidencePaths":["NexusReader.Domain/Entities/KnowledgeUnitLink.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"KnowledgeUnitLink","line":6,"summary":"entity with 6 fields.","confidence":0.8,"evidencePaths":["NexusReader.Domain/Entities/KnowledgeUnitLink.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Domain__Entities__NexusUser.cs.json b/src/.documentation/cache/summaries/NexusReader.Domain__Entities__NexusUser.cs.json new file mode 100644 index 0000000..ecc4d09 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Domain__Entities__NexusUser.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Domain/Entities/NexusUser.cs","purpose":"Domain entity representing an application user, extending IdentityUser with tenancy, subscription, AI quota, reading state and navigation to related domain objects.","classification":{"role":"entity","layer":"domain","confidence":0.9,"evidence":["Domain/entity pattern","Domain path heuristic","namespace NexusReader.Domain.Entities","public class NexusUser : IdentityUser","Contains navigation properties (SubscriptionPlan, Ebooks, QuizResults) and domain-specific fields (TenantId, SubscriptionPlanId, AITokenLimit)"]},"className":"NexusUser","methods":[],"types":[{"name":"NexusUser","kind":"entity","line":7,"purpose":"Represents a user in the domain with identity integration, tenant-scoping, subscription and AI quota accounting, and reading-related state.","fields":[{"name":"DisplayName","type":"string?","required":false,"line":13,"description":"User's display name or full name (MaxLength 100)."},{"name":"AITokenLimit","type":"int","required":true,"line":18,"description":"Total AI tokens available for the user (depends on subscription)."},{"name":"AITokensUsed","type":"int","required":true,"line":23,"description":"AI tokens consumed by the user in the current billing period."},{"name":"LastAiActionDate","type":"DateTime?","required":false,"line":28,"description":"Date when the user last performed an AI-related action."},{"name":"TenantId","type":"string","required":true,"line":35,"description":"Multi-tenant identifier (Required, MaxLength 128), defaults to \"global\"."},{"name":"SubscriptionPlanId","type":"int","required":true,"line":41,"description":"Foreign key for the current subscription plan (Required)."},{"name":"SubscriptionPlan","type":"SubscriptionPlan?","required":false,"line":46,"description":"Navigation property for the current subscription plan."},{"name":"Ebooks","type":"ICollection","required":true,"line":51,"description":"Collection of e-books owned by the user; initialized to an empty list."},{"name":"QuizResults","type":"ICollection","required":true,"line":56,"description":"Collection of quiz results completed by the user; initialized to an empty list."},{"name":"LastReadPageId","type":"string?","required":false,"line":62,"description":"ID of the last page read by the user (MaxLength 255)."},{"name":"LastReadAt","type":"DateTime?","required":false,"line":67,"description":"Last read timestamp."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Domain/Entities/SubscriptionPlan.cs","NexusReader.Domain/Entities/Ebook.cs","NexusReader.Domain/Entities/QuizResult.cs","Microsoft.AspNetCore.Identity (framework)"],"patterns":["Entity","IdentityUser-extension","ORM-navigation-properties"],"domainConcepts":["User","Tenant","SubscriptionPlan","AITokens","Ebook","QuizResult","ReadingState"],"keyDetails":"Lightweight domain entity that augments ASP.NET Identity user with tenancy, subscription linkage, AI quota tracking and reading-state navigation; no runtime methods in this file.","orchestrationMethods":[],"typedContracts":[{"name":"NexusUser","kind":"entity","line":7,"fieldCount":11,"evidencePaths":["NexusReader.Domain/Entities/NexusUser.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"NexusUser","line":7,"summary":"entity with 11 fields.","confidence":0.8,"evidencePaths":["NexusReader.Domain/Entities/NexusUser.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Domain__Entities__QuizResult.cs.json b/src/.documentation/cache/summaries/NexusReader.Domain__Entities__QuizResult.cs.json new file mode 100644 index 0000000..ca1a961 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Domain__Entities__QuizResult.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Domain/Entities/QuizResult.cs","purpose":"Defines the domain entity that records a user's result for an AI-generated quiz, including metadata (user, tenant, topic), score, computed percentage, and completion timestamp.","classification":{"role":"entity","layer":"domain","confidence":0.9,"evidence":["Domain/entity pattern","Domain path heuristic","Namespace: NexusReader.Domain.Entities","Class uses [Key], [Required], [ForeignKey] attributes (EF Core/ORM metadata)","Represents a persistent model (Id, foreign key to NexusUser)"]},"className":"QuizResult","methods":[{"name":"implicit constructor","line":9,"endLine":34,"signature":"() -> QuizResult","purpose":"Initializes instance-level default values for properties when a new QuizResult is created.","calls":[],"actions":[{"id":"metadata_11","kind":"mapping","label":"EF Core attributes applied","line":11,"detail":"Attributes such as [Key], [Required], [MaxLength], [ForeignKey] are present on properties and used by ORM","visibility":"detail-only","confidence":0.7},{"id":"init_12","kind":"mapping","label":"Set Id to new Guid","line":12,"detail":"Id property initialized to Guid.NewGuid() at declaration","visibility":"detail-only","confidence":0.7},{"id":"init_15","kind":"mapping","label":"Set UserId default","line":15,"detail":"UserId initialized to empty string","visibility":"detail-only","confidence":0.7},{"id":"init_22","kind":"mapping","label":"Set TenantId default","line":22,"detail":"TenantId initialized to \"global\"","visibility":"detail-only","confidence":0.7},{"id":"init_25","kind":"mapping","label":"Set Topic default","line":25,"detail":"Topic initialized to empty string","visibility":"detail-only","confidence":0.7},{"id":"init_33","kind":"mapping","label":"Set CompletedDate to UTC now","line":33,"detail":"CompletedDate initialized to DateTime.UtcNow at declaration","visibility":"detail-only","confidence":0.7}]},{"name":"Percentage (getter)","line":31,"endLine":31,"signature":"() -> double","purpose":"Computes the quiz score percentage as Score/TotalQuestions*100, guarding against division by zero.","calls":[],"actions":[{"id":"guard-clause_31","kind":"guard-clause","label":"Avoid divide-by-zero","line":31,"detail":"If TotalQuestions > 0 returns (double)Score/TotalQuestions*100, else returns 0","conditionSummary":"TotalQuestions > 0","outcomeLabels":["return computed percentage","return 0"],"visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"QuizResult","kind":"entity","line":9,"purpose":"Represents a persisted quiz result for a user including score, topic, tenant, and completion timestamp.","fields":[{"name":"Id","type":"Guid","required":true,"line":12,"description":"Primary key; initialized to a new Guid by default; decorated with [Key]."},{"name":"UserId","type":"string","required":true,"line":15,"description":"FK string id of the user who took the quiz; decorated with [Required]."},{"name":"User","type":"NexusUser?","required":false,"line":18,"description":"Navigation property to the NexusUser entity; marked with [ForeignKey(nameof(UserId))]."},{"name":"TenantId","type":"string","required":true,"line":22,"description":"Tenant identifier with [Required] and [MaxLength(128)], defaulting to \"global\"."},{"name":"Topic","type":"string","required":true,"line":25,"description":"Topic or subject of the quiz; [Required], default empty string."},{"name":"Score","type":"int","required":false,"line":27,"description":"Number of correct answers."},{"name":"TotalQuestions","type":"int","required":false,"line":29,"description":"Total number of questions in the quiz used to compute Percentage."},{"name":"Percentage","type":"double","required":false,"line":31,"description":"Computed read-only property returning (Score/TotalQuestions)*100 with divide-by-zero guard."},{"name":"CompletedDate","type":"DateTime","required":false,"line":33,"description":"When the quiz was completed; defaulted to DateTime.UtcNow."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Domain/Entities/NexusUser.cs"],"patterns":["Entity","EF Core (ORM)","Computed Property"],"domainConcepts":["QuizResult","User","Tenant","Topic","Score/Percentage"],"keyDetails":"Small EF Core entity with declarative attributes, default initializers (Id->Guid.NewGuid, CompletedDate->UtcNow), and a computed Percentage getter that guards against division by zero.","orchestrationMethods":[],"typedContracts":[{"name":"QuizResult","kind":"entity","line":9,"fieldCount":9,"evidencePaths":["NexusReader.Domain/Entities/QuizResult.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"QuizResult","line":9,"summary":"entity with 9 fields.","confidence":0.8,"evidencePaths":["NexusReader.Domain/Entities/QuizResult.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Domain__Entities__SemanticKnowledgeCache.cs.json b/src/.documentation/cache/summaries/NexusReader.Domain__Entities__SemanticKnowledgeCache.cs.json new file mode 100644 index 0000000..1b13823 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Domain__Entities__SemanticKnowledgeCache.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Domain/Entities/SemanticKnowledgeCache.cs","purpose":"Defines a domain entity that caches semantic extraction results (JSON payload, original text, model/prompt metadata) and stores an optional vector embedding for semantic search.","classification":{"role":"entity","layer":"domain","confidence":0.8,"evidence":["Domain/entity pattern","Domain path heuristic","Namespace NexusReader.Domain.Entities and folder path Entities","Class is a POCO with data annotations ([Key], [Required], [MaxLength]) used by an ORM","Uses Pgvector.Vector for embeddings (persistence of vector data)"]},"className":"SemanticKnowledgeCache","methods":[],"types":[{"name":"SemanticKnowledgeCache","kind":"entity","line":7,"purpose":"Represents a persisted cache entry for semantic knowledge including raw text, JSON result, model/prompt metadata, tenant scoping, and an optional vector embedding for semantic search.","fields":[{"name":"ContentHash","type":"string","required":true,"line":11,"description":"Primary key: hash of the content used as unique identifier (MaxLength 128)."},{"name":"JsonData","type":"string","required":true,"line":14,"description":"Serialized JSON result of the semantic extraction or analysis."},{"name":"OriginalText","type":"string","required":true,"line":17,"description":"Original source text used to produce the JSONData / embedding."},{"name":"ModelId","type":"string","required":true,"line":21,"description":"Identifier of the model used to generate the semantic data (MaxLength 50). Defaults to 'gemini-1.5-flash'."},{"name":"PromptVersion","type":"string","required":true,"line":25,"description":"Version of the prompt used for generation (MaxLength 10). Defaults to '1.0'."},{"name":"TenantId","type":"string","required":true,"line":29,"description":"Tenant or scope identifier for multi-tenant isolation (MaxLength 128)."},{"name":"Embedding","type":"Pgvector.Vector?","required":false,"line":32,"description":"Optional vector embedding used for semantic search (comment: 768 dimensions)."},{"name":"CreatedAt","type":"DateTime","required":true,"line":34,"description":"UTC timestamp when the cache entry was created; defaulted to DateTime.UtcNow."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Domain/Entities/SemanticKnowledgeCache.cs","Pgvector (NuGet package)","System.ComponentModel.DataAnnotations (for [Key],[Required],[MaxLength])"],"patterns":["ORM Entity","Repository (implied)","Vector embedding cache"],"domainConcepts":["Semantic cache","Embedding","Tenant scoping","Model and prompt versioning","Content hashing (cache key)"],"keyDetails":"Primary key is ContentHash (MaxLength 128). Embedding is stored via Pgvector.Vector (comment notes 768 dims). ModelId and PromptVersion have defaults and length constraints. CreatedAt defaults to UTC now.","orchestrationMethods":[],"typedContracts":[{"name":"SemanticKnowledgeCache","kind":"entity","line":7,"fieldCount":8,"evidencePaths":["NexusReader.Domain/Entities/SemanticKnowledgeCache.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"SemanticKnowledgeCache","line":7,"summary":"entity with 8 fields.","confidence":0.8,"evidencePaths":["NexusReader.Domain/Entities/SemanticKnowledgeCache.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Domain__Entities__SubscriptionPlan.cs.json b/src/.documentation/cache/summaries/NexusReader.Domain__Entities__SubscriptionPlan.cs.json new file mode 100644 index 0000000..3ed16d4 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Domain__Entities__SubscriptionPlan.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Domain/Entities/SubscriptionPlan.cs","purpose":"Defines the domain entity SubscriptionPlan which models subscription tiers, pricing and AI token limits used by the application.","classification":{"role":"entity","layer":"domain","confidence":0.9,"evidence":["Domain/entity pattern","Domain path heuristic","Contains public class SubscriptionPlan with data annotations (Key, Required, MaxLength)","Defines constants for plan names and IDs used across the domain"]},"className":"SubscriptionPlan","methods":[],"types":[{"name":"SubscriptionPlan","kind":"entity","line":5,"purpose":"Represents a subscription tier with identifiers, display name, token limits and billing identifiers/pricing.","fields":[{"name":"FreeName","type":"string (const)","required":false,"line":7,"description":"Static constant for the Free plan name"},{"name":"BasicName","type":"string (const)","required":false,"line":8,"description":"Static constant for the Basic plan name"},{"name":"ProName","type":"string (const)","required":false,"line":9,"description":"Static constant for the Pro plan name"},{"name":"EnterpriseName","type":"string (const)","required":false,"line":10,"description":"Static constant for the Enterprise plan name"},{"name":"FreeId","type":"int (const)","required":false,"line":12,"description":"Static constant for the Free plan numeric id"},{"name":"BasicId","type":"int (const)","required":false,"line":13,"description":"Static constant for the Basic plan numeric id"},{"name":"ProId","type":"int (const)","required":false,"line":14,"description":"Static constant for the Pro plan numeric id"},{"name":"EnterpriseId","type":"int (const)","required":false,"line":15,"description":"Static constant for the Enterprise plan numeric id"},{"name":"Id","type":"int","required":true,"line":18,"description":"Primary key for the subscription plan (annotated with [Key])"},{"name":"PlanName","type":"string","required":true,"line":22,"description":"Human-readable plan name (annotated with [Required] and [MaxLength(50)])"},{"name":"AITokenLimit","type":"int","required":false,"line":24,"description":"Per-period AI token allotment for this plan"},{"name":"IsUnlimitedTokens","type":"bool","required":false,"line":26,"description":"Flag indicating tokens are unlimited for this plan"},{"name":"MonthlyPrice","type":"decimal","required":false,"line":28,"description":"Monthly price for the plan"},{"name":"StripeProductId","type":"string","required":false,"line":31,"description":"Optional Stripe product identifier (MaxLength 50)"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["Entity","EF Core DataAnnotations"],"domainConcepts":["SubscriptionPlan","Pricing","Billing/Stripe integration","AI token limits"],"keyDetails":"Simple EF-style entity with DataAnnotations for validation and length; includes static constants for well-known plan names and numeric IDs used application-wide.","orchestrationMethods":[],"typedContracts":[{"name":"SubscriptionPlan","kind":"entity","line":5,"fieldCount":14,"evidencePaths":["NexusReader.Domain/Entities/SubscriptionPlan.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"SubscriptionPlan","line":5,"summary":"entity with 14 fields.","confidence":0.8,"evidencePaths":["NexusReader.Domain/Entities/SubscriptionPlan.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Domain__Enums__KnowledgeUnitType.cs.json b/src/.documentation/cache/summaries/NexusReader.Domain__Enums__KnowledgeUnitType.cs.json new file mode 100644 index 0000000..0627d81 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Domain__Enums__KnowledgeUnitType.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Domain/Enums/KnowledgeUnitType.cs","purpose":"Defines the domain-level enumeration of different knowledge unit categories used across the NexusReader system.","classification":{"role":"entity","layer":"domain","confidence":0.9,"evidence":["Domain/entity pattern","namespace NexusReader.Domain.Enums","file path indicates Domain/Enums and contains a single enum declaration"]},"className":"","methods":[],"types":[{"name":"KnowledgeUnitType","kind":"enum","line":3,"purpose":"Represents possible kinds of knowledge units (e.g., Section, Table, Definition) for classification and branching in domain logic.","fields":[{"name":"Section","type":"int","required":true,"line":5,"description":"A document section"},{"name":"Table","type":"int","required":true,"line":6,"description":"A tabular data unit"},{"name":"Definition","type":"int","required":true,"line":7,"description":"A definitional entry"},{"name":"ProcedureStep","type":"int","required":true,"line":8,"description":"A step in a procedure"},{"name":"PolicyRule","type":"int","required":true,"line":9,"description":"A policy or rule item"},{"name":"KeyConcept","type":"int","required":true,"line":10,"description":"An important concept or takeaway"},{"name":"Snippet","type":"int","required":true,"line":11,"description":"A short text/code snippet"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["Enum"],"domainConcepts":["KnowledgeUnit"],"keyDetails":"Simple, single-file enum used for domain classification; no runtime logic, methods, or external dependencies present.","orchestrationMethods":[],"typedContracts":[],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Domain__NexusReader.Domain.csproj.json b/src/.documentation/cache/summaries/NexusReader.Domain__NexusReader.Domain.csproj.json new file mode 100644 index 0000000..6362799 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Domain__NexusReader.Domain.csproj.json @@ -0,0 +1 @@ +{"path":"NexusReader.Domain/NexusReader.Domain.csproj","purpose":"Project file for the NexusReader.Domain assembly: declares build settings (TargetFramework net10.0), compiler behaviors (implicit usings, nullable), runtime configuration generation, and package dependencies used by the Domain project.","classification":{"role":"config","layer":"domain","confidence":0.9,"evidence":["Domain/entity pattern","File name and path indicate the Domain project (NexusReader.Domain)","TargetFramework set to net10.0 (line 4)","PackageReference entries for Pgvector and Microsoft.Extensions.Identity.Stores (lines 11-12)","GenerateRuntimeConfigurationFiles enabled (line 7)"]},"className":"","methods":[],"types":[],"serviceRegistrations":[],"startupActions":[],"dependencies":["[object Object]","[object Object]"],"patterns":["project-file"],"domainConcepts":["Domain project boundary for NexusReader"],"keyDetails":"Targets .NET 10 (net10.0), enables implicit usings and nullable reference types, and instructs generation of runtime configuration files. Declares dependencies on Pgvector and Microsoft.Extensions.Identity.Stores.","orchestrationMethods":[],"typedContracts":[],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Infrastructure.Mobile__Class1.cs.json b/src/.documentation/cache/summaries/NexusReader.Infrastructure.Mobile__Class1.cs.json new file mode 100644 index 0000000..281a666 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Infrastructure.Mobile__Class1.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Infrastructure.Mobile/Class1.cs","purpose":"Placeholder/empty class in the NexusReader.Infrastructure.Mobile project; likely a template/auto-generated file with no runtime behavior.","classification":{"role":"unknown","layer":"unknown","confidence":0.6,"evidence":["Namespace: NexusReader.Infrastructure.Mobile indicates infrastructure/mobile concerns","File contains an empty class (no methods or members) so it does not implement startup or service registration"]},"className":"Class1","methods":[],"types":[{"name":"Class1","kind":"model","line":3,"purpose":"Empty placeholder class declared in the mobile infrastructure project.","fields":[]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":[],"domainConcepts":[],"keyDetails":"File contains only an empty Class1 declaration (lines 3-6). No runtime behavior, calls, or type members to analyze.","orchestrationMethods":[],"typedContracts":[{"name":"Class1","kind":"model","line":3,"fieldCount":0,"evidencePaths":["NexusReader.Infrastructure.Mobile/Class1.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"Class1","line":3,"summary":"model with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Infrastructure.Mobile/Class1.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Infrastructure.Mobile__NexusReader.Infrastructure.Mobile.csproj.json b/src/.documentation/cache/summaries/NexusReader.Infrastructure.Mobile__NexusReader.Infrastructure.Mobile.csproj.json new file mode 100644 index 0000000..f378fc8 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Infrastructure.Mobile__NexusReader.Infrastructure.Mobile.csproj.json @@ -0,0 +1 @@ +{"path":"NexusReader.Infrastructure.Mobile/NexusReader.Infrastructure.Mobile.csproj","purpose":"MSBuild project file for the NexusReader mobile app; defines target platforms, MAUI usage, package and project dependencies, and build-time settings for the mobile application.","classification":{"role":"config","layer":"infrastructure","confidence":0.8,"evidence":["Contains TargetFrameworks and MSBuild conditionals (lines 4-6)","Enables UseMaui and references Microsoft.Maui.Essentials (lines 7-8, 20)","Has a ProjectReference to NexusReader.Application (line 16)"]},"className":"","methods":[],"types":[],"serviceRegistrations":[],"startupActions":[],"dependencies":["[object Object]","[object Object]"],"patterns":["MAUI App","Multi-targeting"],"domainConcepts":["Mobile","MAUI","Android","iOS","macCatalyst","Windows"],"keyDetails":"Targets net10.0-android always and conditionally adds net10.0-ios, net10.0-maccatalyst on macOS and net10.0-windows10.0.19041.0 on Windows (lines 4-6). MAUI and MAUI Essentials are enabled (lines 7-8). Implicit usings and nullable are enabled (lines 10-11). Project references Application project (line 16).","orchestrationMethods":[],"typedContracts":[],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Infrastructure.Mobile__Services__MauiPlatformService.cs.json b/src/.documentation/cache/summaries/NexusReader.Infrastructure.Mobile__Services__MauiPlatformService.cs.json new file mode 100644 index 0000000..466783f --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Infrastructure.Mobile__Services__MauiPlatformService.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Infrastructure.Mobile/Services/MauiPlatformService.cs","purpose":"MAUI platform implementation that adapts device/haptic APIs to the application's IPlatformService abstraction for mobile platforms.","classification":{"role":"service","layer":"infrastructure","confidence":0.9,"evidence":["Service naming pattern","Application/service path heuristic","Class MauiPlatformService implements IPlatformService (line 8)","Uses Microsoft.Maui device and haptic APIs to provide platform-specific behavior (lines 14, 29, 55-56)"]},"className":"MauiPlatformService","methods":[{"name":"VibrateSuccessAsync","line":10,"endLine":23,"signature":"() -> Task","purpose":"Performs a short success haptic pattern (two clicks) and returns a Result indicating success or failure.","calls":[],"actions":[{"id":"try-catch_12","kind":"mapping","label":"Exception handling with Result fallback","line":12,"detail":"Wraps platform interactions in try/catch and returns FluentResults.Result","conditionSummary":"any Exception thrown by platform calls","outcomeLabels":["Result.Ok on success","Result.Fail(ex.Message) on exception"],"visibility":"detail-only","confidence":0.7},{"id":"external-call_14","kind":"external-call","label":"Haptic click","line":14,"detail":"Calls HapticFeedback.Default.Perform(HapticFeedbackType.Click) (framework)","visibility":"detail-only","confidence":0.7},{"id":"async-delay_15","kind":"mapping","label":"Wait between haptics","line":15,"detail":"await Task.Delay(100)","visibility":"detail-only","confidence":0.7},{"id":"external-call_16","kind":"external-call","label":"Haptic click","line":16,"detail":"Calls HapticFeedback.Default.Perform(HapticFeedbackType.Click) (framework)","visibility":"detail-only","confidence":0.7},{"id":"vibratesuccessasync_return_17_0","kind":"return","label":"Returns result","line":17,"detail":"return Result.Ok();","visibility":"detail-only","confidence":0.7},{"id":"vibratesuccessasync_return_21_1","kind":"return","label":"Returns result","line":21,"detail":"return Result.Fail(ex.Message);","visibility":"detail-only","confidence":0.7}]},{"name":"VibrateErrorAsync","line":25,"endLine":36,"signature":"() -> Task","purpose":"Performs an error haptic (long press) and returns a Result success/failure.","calls":[],"actions":[{"id":"try-catch_27","kind":"mapping","label":"Exception handling with Result fallback","line":27,"detail":"Wraps platform interaction in try/catch and returns FluentResults.Result","conditionSummary":"any Exception thrown by platform calls","outcomeLabels":["Result.Ok on success","Result.Fail(ex.Message) on exception"],"visibility":"detail-only","confidence":0.7},{"id":"external-call_29","kind":"external-call","label":"Haptic long press","line":29,"detail":"Calls HapticFeedback.Default.Perform(HapticFeedbackType.LongPress) (framework)","visibility":"detail-only","confidence":0.7},{"id":"vibrateerrorasync_return_30_0","kind":"return","label":"Returns result","line":30,"detail":"return Result.Ok();","visibility":"detail-only","confidence":0.7},{"id":"vibrateerrorasync_return_34_1","kind":"return","label":"Returns result","line":34,"detail":"return Result.Fail(ex.Message);","visibility":"detail-only","confidence":0.7}]},{"name":"VibrateAsync","line":38,"endLine":49,"signature":"(milliseconds: int) -> Task","purpose":"Attempts a generic click haptic (ignores milliseconds parameter) and returns a Result success/failure.","calls":[],"actions":[{"id":"parameter-unused_38","kind":"mapping","label":"milliseconds parameter is not used","line":38,"detail":"Method signature accepts milliseconds but method body performs a single click only","visibility":"detail-only","confidence":0.7},{"id":"try-catch_40","kind":"mapping","label":"Exception handling with Result fallback","line":40,"detail":"Wraps platform interaction in try/catch and returns FluentResults.Result","conditionSummary":"any Exception thrown by platform calls","outcomeLabels":["Result.Ok on success","Result.Fail(ex.Message) on exception"],"visibility":"detail-only","confidence":0.7},{"id":"external-call_42","kind":"external-call","label":"Haptic click","line":42,"detail":"Calls HapticFeedback.Default.Perform(HapticFeedbackType.Click) (framework)","visibility":"detail-only","confidence":0.7},{"id":"vibrateasync_return_43_0","kind":"return","label":"Returns result","line":43,"detail":"return Result.Ok();","visibility":"detail-only","confidence":0.7},{"id":"vibrateasync_return_47_1","kind":"return","label":"Returns result","line":47,"detail":"return Result.Fail(ex.Message);","visibility":"detail-only","confidence":0.7}]},{"name":"GetDeviceContext","line":51,"endLine":69,"signature":"() -> Result","purpose":"Gathers device model/manufacturer, maps idiom and display orientation to application DeviceContext and returns it wrapped in a Result.","calls":[{"targetFile":"self","targetMethod":"MapDeviceType","callLine":61,"paramSummary":"device.Idiom"},{"targetFile":"self","targetMethod":"MapOrientation","callLine":62,"paramSummary":"display.Orientation"},{"targetFile":"NexusReader.Application.Abstractions.Services","targetMethod":"DeviceContext (ctor)","callLine":58,"paramSummary":"model, manufacturer, mapped DeviceType, mapped DisplayOrientation"}],"actions":[{"id":"try-catch_53","kind":"mapping","label":"Exception handling with Result fallback","line":53,"detail":"Wraps reads/mapping in try/catch and returns FluentResults.Result","conditionSummary":"any Exception thrown while reading device/display or mapping","outcomeLabels":["Result.Ok(DeviceContext) on success","Result.Fail(ex.Message) on exception"],"visibility":"detail-only","confidence":0.7},{"id":"external-read_55","kind":"mapping","label":"Read device info","line":55,"detail":"var device = DeviceInfo.Current (framework)","visibility":"detail-only","confidence":0.7},{"id":"external-read_56","kind":"mapping","label":"Read display info","line":56,"detail":"var display = DeviceDisplay.Current.MainDisplayInfo (framework)","visibility":"detail-only","confidence":0.7},{"id":"object-creation_58","kind":"mapping","label":"Create DeviceContext","line":58,"detail":"Constructs new DeviceContext with gathered and mapped values (application type)","visibility":"detail-only","confidence":0.7},{"id":"getdevicecontext_return_58_0","kind":"return","label":"Returns result","line":58,"detail":"return Result.Ok(new DeviceContext(","visibility":"detail-only","confidence":0.7},{"id":"mapping_61","kind":"mapping","label":"Map device idiom to app DeviceType","line":61,"detail":"Calls MapDeviceType(device.Idiom) to translate platform idiom to app enum","visibility":"detail-only","confidence":0.7},{"id":"getdevicecontext_mapping_61_1","kind":"mapping","label":"Maps data or transforms shape","line":61,"detail":"MapDeviceType(device.Idiom),","visibility":"detail-only","confidence":0.74},{"id":"mapping_62","kind":"mapping","label":"Map display orientation to app DisplayOrientation","line":62,"detail":"Calls MapOrientation(display.Orientation) to translate platform orientation to app enum","visibility":"detail-only","confidence":0.7},{"id":"getdevicecontext_mapping_62_2","kind":"mapping","label":"Maps data or transforms shape","line":62,"detail":"MapOrientation(display.Orientation)","visibility":"detail-only","confidence":0.74},{"id":"getdevicecontext_return_67_3","kind":"return","label":"Returns result","line":67,"detail":"return Result.Fail(ex.Message);","visibility":"detail-only","confidence":0.7}]},{"name":"MapDeviceType","line":71,"endLine":77,"signature":"(idiom: DeviceIdiom) -> NexusReader.Application.Abstractions.Services.DeviceType","purpose":"Maps MAUI's DeviceIdiom values to the application's DeviceType enum with explicit branches and a default Unknown.","calls":[],"actions":[{"id":"mapdevicetype_mapping_71_0","kind":"mapping","label":"Maps data or transforms shape","line":71,"detail":"private static NexusReader.Application.Abstractions.Services.DeviceType MapDeviceType(DeviceIdiom idiom)","visibility":"detail-only","confidence":0.74},{"id":"branch_72","kind":"branch","label":"If-chain mapping idiom -> DeviceType","line":72,"detail":"Sequential if checks return corresponding application enum, default to Unknown","conditionSummary":"Checks idiom against Phone, Tablet, Desktop","outcomeLabels":["DeviceType.Phone","DeviceType.Tablet","DeviceType.Desktop","DeviceType.Unknown"],"visibility":"detail-only","confidence":0.7},{"id":"mapdevicetype_guard-clause_73_1","kind":"guard-clause","label":"Guards early exit or rejection path","line":73,"detail":"if (idiom == DeviceIdiom.Phone) return NexusReader.Application.Abstractions.Services.DeviceType.Phone;","conditionSummary":"idiom == DeviceIdiom.Phone","outcomeLabels":["exit","continue"],"visibility":"primary-visible","confidence":0.9},{"id":"mapdevicetype_guard-clause_74_2","kind":"guard-clause","label":"Guards early exit or rejection path","line":74,"detail":"if (idiom == DeviceIdiom.Tablet) return NexusReader.Application.Abstractions.Services.DeviceType.Tablet;","conditionSummary":"idiom == DeviceIdiom.Tablet","outcomeLabels":["exit","continue"],"visibility":"primary-visible","confidence":0.9},{"id":"mapdevicetype_guard-clause_75_3","kind":"guard-clause","label":"Guards early exit or rejection path","line":75,"detail":"if (idiom == DeviceIdiom.Desktop) return NexusReader.Application.Abstractions.Services.DeviceType.Desktop;","conditionSummary":"idiom == DeviceIdiom.Desktop","outcomeLabels":["exit","continue"],"visibility":"primary-visible","confidence":0.9},{"id":"mapdevicetype_return_76_4","kind":"return","label":"Returns result","line":76,"detail":"return NexusReader.Application.Abstractions.Services.DeviceType.Unknown;","visibility":"detail-only","confidence":0.7}]},{"name":"MapOrientation","line":79,"endLine":84,"signature":"(orientation: Microsoft.Maui.Devices.DisplayOrientation) -> NexusReader.Application.Abstractions.Services.DisplayOrientation","purpose":"Maps MAUI display orientation enum to the application's DisplayOrientation via a switch expression with a default Unknown case.","calls":[],"actions":[{"id":"maporientation_mapping_79_0","kind":"mapping","label":"Maps data or transforms shape","line":79,"detail":"private static NexusReader.Application.Abstractions.Services.DisplayOrientation MapOrientation(Microsoft.Maui.Devices.DisplayOrientation orientation) => orientation switch","visibility":"detail-only","confidence":0.74},{"id":"switch_79","kind":"switch","label":"Switch expression mapping orientation","line":79,"detail":"Uses switch expression to map framework enum to application enum","conditionSummary":"DisplayOrientation.Portrait | Landscape | other","outcomeLabels":["DisplayOrientation.Portrait","DisplayOrientation.Landscape","DisplayOrientation.Unknown"],"visibility":"detail-only","confidence":0.7}]}],"types":[],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Application.Abstractions.Services"],"patterns":["Platform Adapter"],"domainConcepts":["Device","DisplayOrientation","DeviceType","Haptics"],"keyDetails":"All public methods wrap MAUI platform calls in try/catch and return FluentResults.Result; mapping helpers translate MAUI enums to application enums. Methods interact with framework APIs (DeviceInfo, DeviceDisplay, HapticFeedback) and construct application DeviceContext.","orchestrationMethods":[{"name":"VibrateSuccessAsync","line":10,"confidence":0.69,"reason":"Contains 2 architectural actions relevant to business execution.","actionKinds":["mapping","external-call","return"],"evidencePaths":["NexusReader.Infrastructure.Mobile/Services/MauiPlatformService.cs"]},{"name":"GetDeviceContext","line":51,"confidence":0.69,"reason":"Coordinates 3 downstream calls with 0 architectural actions.","actionKinds":["mapping","return"],"evidencePaths":["NexusReader.Infrastructure.Mobile/Services/MauiPlatformService.cs","self","self","NexusReader.Application.Abstractions.Services"]},{"name":"VibrateErrorAsync","line":25,"confidence":0.57,"reason":"Contains 1 architectural actions relevant to business execution.","actionKinds":["mapping","external-call","return"],"evidencePaths":["NexusReader.Infrastructure.Mobile/Services/MauiPlatformService.cs"]},{"name":"VibrateAsync","line":38,"confidence":0.57,"reason":"Contains 1 architectural actions relevant to business execution.","actionKinds":["mapping","external-call","return"],"evidencePaths":["NexusReader.Infrastructure.Mobile/Services/MauiPlatformService.cs"]},{"name":"MapDeviceType","line":71,"confidence":0.57,"reason":"Contains 1 architectural actions relevant to business execution.","actionKinds":["mapping","branch","guard-clause","return"],"evidencePaths":["NexusReader.Infrastructure.Mobile/Services/MauiPlatformService.cs"]}],"typedContracts":[],"persistenceInteractions":[],"externalInteractions":[{"methodName":"VibrateSuccessAsync","line":14,"kind":"external-call","detail":"Calls HapticFeedback.Default.Perform(HapticFeedbackType.Click) (framework)","evidencePaths":["NexusReader.Infrastructure.Mobile/Services/MauiPlatformService.cs"]},{"methodName":"VibrateSuccessAsync","line":16,"kind":"external-call","detail":"Calls HapticFeedback.Default.Perform(HapticFeedbackType.Click) (framework)","evidencePaths":["NexusReader.Infrastructure.Mobile/Services/MauiPlatformService.cs"]},{"methodName":"VibrateErrorAsync","line":29,"kind":"external-call","detail":"Calls HapticFeedback.Default.Perform(HapticFeedbackType.LongPress) (framework)","evidencePaths":["NexusReader.Infrastructure.Mobile/Services/MauiPlatformService.cs"]},{"methodName":"VibrateAsync","line":42,"kind":"external-call","detail":"Calls HapticFeedback.Default.Perform(HapticFeedbackType.Click) (framework)","evidencePaths":["NexusReader.Infrastructure.Mobile/Services/MauiPlatformService.cs"]}],"evidenceAnchors":[{"kind":"orchestration-method","label":"VibrateSuccessAsync","line":10,"summary":"Contains 2 architectural actions relevant to business execution.","confidence":0.69,"evidencePaths":["NexusReader.Infrastructure.Mobile/Services/MauiPlatformService.cs"]},{"kind":"orchestration-method","label":"GetDeviceContext","line":51,"summary":"Coordinates 3 downstream calls with 0 architectural actions.","confidence":0.69,"evidencePaths":["NexusReader.Infrastructure.Mobile/Services/MauiPlatformService.cs","self","self","NexusReader.Application.Abstractions.Services"]},{"kind":"orchestration-method","label":"VibrateErrorAsync","line":25,"summary":"Contains 1 architectural actions relevant to business execution.","confidence":0.57,"evidencePaths":["NexusReader.Infrastructure.Mobile/Services/MauiPlatformService.cs"]},{"kind":"orchestration-method","label":"VibrateAsync","line":38,"summary":"Contains 1 architectural actions relevant to business execution.","confidence":0.57,"evidencePaths":["NexusReader.Infrastructure.Mobile/Services/MauiPlatformService.cs"]},{"kind":"external-call","label":"VibrateSuccessAsync","line":14,"summary":"Calls HapticFeedback.Default.Perform(HapticFeedbackType.Click) (framework)","confidence":0.8,"evidencePaths":["NexusReader.Infrastructure.Mobile/Services/MauiPlatformService.cs"]},{"kind":"external-call","label":"VibrateSuccessAsync","line":16,"summary":"Calls HapticFeedback.Default.Perform(HapticFeedbackType.Click) (framework)","confidence":0.8,"evidencePaths":["NexusReader.Infrastructure.Mobile/Services/MauiPlatformService.cs"]},{"kind":"external-call","label":"VibrateErrorAsync","line":29,"summary":"Calls HapticFeedback.Default.Perform(HapticFeedbackType.LongPress) (framework)","confidence":0.8,"evidencePaths":["NexusReader.Infrastructure.Mobile/Services/MauiPlatformService.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Infrastructure.Mobile__Services__MauiStorageService.cs.json b/src/.documentation/cache/summaries/NexusReader.Infrastructure.Mobile__Services__MauiStorageService.cs.json new file mode 100644 index 0000000..7d48be9 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Infrastructure.Mobile__Services__MauiStorageService.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Infrastructure.Mobile/Services/MauiStorageService.cs","purpose":"MAUI-specific implementation of INativeStorageService that adapts MAUI Preferences and SecureStorage APIs to the application's FluentResults-based async storage abstraction.","classification":{"role":"service","layer":"infrastructure","confidence":0.9,"evidence":["Service naming pattern","Application/service path heuristic","Implements INativeStorageService (NexusReader.Application.Abstractions.Services)","Uses Microsoft.Maui.Storage APIs (Preferences, SecureStorage)","Namespace NexusReader.Infrastructure.Mobile.Services indicates platform/infrastructure role"]},"className":"MauiStorageService","methods":[{"name":"SaveStringAsync","line":10,"endLine":21,"signature":"(key: string, value: string) -> Task","purpose":"Stores a string value in MAUI Preferences and returns a FluentResults Result indicating success or failure.","calls":[],"actions":[{"id":"try-catch_12","kind":"mapping","label":"Protects Preference write","line":12,"detail":"try { Preferences.Default.Set(key, value); return Result.Ok(); } catch (Exception ex) { return Result.Fail(ex.Message); }","visibility":"detail-only","confidence":0.7},{"id":"persistence-write_14","kind":"mapping","label":"Preferences.Set","line":14,"detail":"Writes key/value to MAUI Preferences (platform persistent storage).","visibility":"detail-only","confidence":0.7},{"id":"savestringasync_return_15_0","kind":"return","label":"Returns result","line":15,"detail":"return Task.FromResult(Result.Ok());","visibility":"detail-only","confidence":0.7},{"id":"return_15","kind":"return","label":"success","line":15,"detail":"Returns Task.FromResult(Result.Ok()).","visibility":"detail-only","confidence":0.7},{"id":"return_19","kind":"return","label":"failure","line":19,"detail":"Returns Task.FromResult(Result.Fail(ex.Message)).","visibility":"detail-only","confidence":0.7},{"id":"savestringasync_return_19_1","kind":"return","label":"Returns result","line":19,"detail":"return Task.FromResult(Result.Fail(ex.Message));","visibility":"detail-only","confidence":0.7}]},{"name":"GetStringAsync","line":23,"endLine":33,"signature":"(key: string) -> Task>","purpose":"Reads a string value from MAUI Preferences and returns it wrapped in a FluentResults Result, or a failure Result on exception.","calls":[],"actions":[{"id":"try-catch_25","kind":"mapping","label":"Protects Preference read","line":25,"detail":"try { return Result.Ok(Preferences.Default.Get(key, (string?)null)); } catch (Exception ex) { return Result.Fail(ex.Message); }","visibility":"detail-only","confidence":0.7},{"id":"persistence-read_27","kind":"mapping","label":"Preferences.Get","line":27,"detail":"Reads key from MAUI Preferences with null default.","visibility":"detail-only","confidence":0.7},{"id":"getstringasync_return_27_0","kind":"return","label":"Returns result","line":27,"detail":"return Task.FromResult(Result.Ok(Preferences.Default.Get(key, (string?)null)));","visibility":"detail-only","confidence":0.7},{"id":"return_27","kind":"return","label":"success","line":27,"detail":"Returns Task.FromResult(Result.Ok(value)).","visibility":"detail-only","confidence":0.7},{"id":"return_31","kind":"return","label":"failure","line":31,"detail":"Returns Task.FromResult(Result.Fail(ex.Message)).","visibility":"detail-only","confidence":0.7},{"id":"getstringasync_return_31_1","kind":"return","label":"Returns result","line":31,"detail":"return Task.FromResult(Result.Fail(ex.Message));","visibility":"detail-only","confidence":0.7}]},{"name":"SaveBoolAsync","line":35,"endLine":46,"signature":"(key: string, value: bool) -> Task","purpose":"Stores a boolean value in MAUI Preferences and returns a FluentResults Result indicating success or failure.","calls":[],"actions":[{"id":"try-catch_37","kind":"mapping","label":"Protects Preference write (bool)","line":37,"detail":"try { Preferences.Default.Set(key, value); return Result.Ok(); } catch (Exception ex) { return Result.Fail(ex.Message); }","visibility":"detail-only","confidence":0.7},{"id":"persistence-write_39","kind":"mapping","label":"Preferences.Set","line":39,"detail":"Writes boolean value to Preferences.","visibility":"detail-only","confidence":0.7},{"id":"saveboolasync_return_40_0","kind":"return","label":"Returns result","line":40,"detail":"return Task.FromResult(Result.Ok());","visibility":"detail-only","confidence":0.7},{"id":"return_40","kind":"return","label":"success","line":40,"detail":"Returns Task.FromResult(Result.Ok()).","visibility":"detail-only","confidence":0.7},{"id":"return_44","kind":"return","label":"failure","line":44,"detail":"Returns Task.FromResult(Result.Fail(ex.Message)).","visibility":"detail-only","confidence":0.7},{"id":"saveboolasync_return_44_1","kind":"return","label":"Returns result","line":44,"detail":"return Task.FromResult(Result.Fail(ex.Message));","visibility":"detail-only","confidence":0.7}]},{"name":"GetBoolAsync","line":48,"endLine":58,"signature":"(key: string, defaultValue: bool = false) -> Task>","purpose":"Reads a boolean from MAUI Preferences with a provided default and returns it wrapped in a FluentResults Result, or a failure Result on exception.","calls":[],"actions":[{"id":"try-catch_50","kind":"mapping","label":"Protects Preference read (bool)","line":50,"detail":"try { return Result.Ok(Preferences.Default.Get(key, defaultValue)); } catch (Exception ex) { return Result.Fail(ex.Message); }","visibility":"detail-only","confidence":0.7},{"id":"persistence-read_52","kind":"mapping","label":"Preferences.Get","line":52,"detail":"Reads boolean value using provided defaultValue.","visibility":"detail-only","confidence":0.7},{"id":"getboolasync_return_52_0","kind":"return","label":"Returns result","line":52,"detail":"return Task.FromResult(Result.Ok(Preferences.Default.Get(key, defaultValue)));","visibility":"detail-only","confidence":0.7},{"id":"return_52","kind":"return","label":"success","line":52,"detail":"Returns Task.FromResult(Result.Ok(value)).","visibility":"detail-only","confidence":0.7},{"id":"return_56","kind":"return","label":"failure","line":56,"detail":"Returns Task.FromResult(Result.Fail(ex.Message)).","visibility":"detail-only","confidence":0.7},{"id":"getboolasync_return_56_1","kind":"return","label":"Returns result","line":56,"detail":"return Task.FromResult(Result.Fail(ex.Message));","visibility":"detail-only","confidence":0.7}]},{"name":"RemoveAsync","line":60,"endLine":71,"signature":"(key: string) -> Task","purpose":"Removes a key from MAUI Preferences and returns a FluentResults Result indicating success or failure.","calls":[],"actions":[{"id":"try-catch_62","kind":"mapping","label":"Protects Preference remove","line":62,"detail":"try { Preferences.Default.Remove(key); return Result.Ok(); } catch (Exception ex) { return Result.Fail(ex.Message); }","visibility":"detail-only","confidence":0.7},{"id":"persistence-write_64","kind":"mapping","label":"Preferences.Remove","line":64,"detail":"Deletes a stored preference key.","visibility":"detail-only","confidence":0.7},{"id":"removeasync_return_65_0","kind":"return","label":"Returns result","line":65,"detail":"return Task.FromResult(Result.Ok());","visibility":"detail-only","confidence":0.7},{"id":"return_65","kind":"return","label":"success","line":65,"detail":"Returns Task.FromResult(Result.Ok()).","visibility":"detail-only","confidence":0.7},{"id":"return_69","kind":"return","label":"failure","line":69,"detail":"Returns Task.FromResult(Result.Fail(ex.Message)).","visibility":"detail-only","confidence":0.7},{"id":"removeasync_return_69_1","kind":"return","label":"Returns result","line":69,"detail":"return Task.FromResult(Result.Fail(ex.Message));","visibility":"detail-only","confidence":0.7}]},{"name":"SaveSecureString","line":73,"endLine":84,"signature":"(key: string, value: string) -> async Task","purpose":"Asynchronously stores a string in MAUI SecureStorage (encrypted) and returns a FluentResults Result.","calls":[],"actions":[{"id":"try-catch_75","kind":"mapping","label":"Protects SecureStorage.SetAsync","line":75,"detail":"try { await SecureStorage.Default.SetAsync(key, value); return Result.Ok(); } catch (Exception ex) { return Result.Fail(ex.Message); }","visibility":"detail-only","confidence":0.7},{"id":"await_77","kind":"mapping","label":"await SecureStorage.Default.SetAsync","line":77,"detail":"Async persistence call is awaited before returning.","visibility":"detail-only","confidence":0.7},{"id":"external-call_77","kind":"external-call","label":"SecureStorage.SetAsync (async)","line":77,"detail":"Awaitable call to MAUI SecureStorage for encrypted storage.","visibility":"detail-only","confidence":0.7},{"id":"savesecurestring_return_78_0","kind":"return","label":"Returns result","line":78,"detail":"return Result.Ok();","visibility":"detail-only","confidence":0.7},{"id":"return_78","kind":"return","label":"success","line":78,"detail":"Returns Result.Ok().","visibility":"detail-only","confidence":0.7},{"id":"return_82","kind":"return","label":"failure","line":82,"detail":"Returns Result.Fail(ex.Message).","visibility":"detail-only","confidence":0.7},{"id":"savesecurestring_return_82_1","kind":"return","label":"Returns result","line":82,"detail":"return Result.Fail(ex.Message);","visibility":"detail-only","confidence":0.7}]},{"name":"GetSecureString","line":86,"endLine":96,"signature":"(key: string) -> async Task>","purpose":"Asynchronously reads a string from MAUI SecureStorage and returns it wrapped in a FluentResults Result, or a failure Result on exception.","calls":[],"actions":[{"id":"try-catch_88","kind":"mapping","label":"Protects SecureStorage.GetAsync","line":88,"detail":"try { return Result.Ok(await SecureStorage.Default.GetAsync(key)); } catch (Exception ex) { return Result.Fail(ex.Message); }","visibility":"detail-only","confidence":0.7},{"id":"await_90","kind":"mapping","label":"await SecureStorage.Default.GetAsync","line":90,"detail":"Async read is awaited and value wrapped in Result.Ok.","visibility":"detail-only","confidence":0.7},{"id":"getsecurestring_return_90_0","kind":"return","label":"Returns result","line":90,"detail":"return Result.Ok(await SecureStorage.Default.GetAsync(key));","visibility":"detail-only","confidence":0.7},{"id":"external-call_90","kind":"external-call","label":"SecureStorage.GetAsync (async)","line":90,"detail":"Awaitable call to read encrypted value from MAUI SecureStorage.","visibility":"detail-only","confidence":0.7},{"id":"return_90","kind":"return","label":"success","line":90,"detail":"Returns Result.Ok(value).","visibility":"detail-only","confidence":0.7},{"id":"return_94","kind":"return","label":"failure","line":94,"detail":"Returns Result.Fail(ex.Message).","visibility":"detail-only","confidence":0.7},{"id":"getsecurestring_return_94_1","kind":"return","label":"Returns result","line":94,"detail":"return Result.Fail(ex.Message);","visibility":"detail-only","confidence":0.7}]},{"name":"RemoveSecureAsync","line":98,"endLine":109,"signature":"(key: string) -> Task","purpose":"Removes a key from MAUI SecureStorage (or secure store wrapper) and returns a FluentResults Result indicating success or failure.","calls":[],"actions":[{"id":"try-catch_100","kind":"mapping","label":"Protects SecureStorage.Remove","line":100,"detail":"try { SecureStorage.Default.Remove(key); return Result.Ok(); } catch (Exception ex) { return Result.Fail(ex.Message); }","visibility":"detail-only","confidence":0.7},{"id":"persistence-write_102","kind":"mapping","label":"SecureStorage.Remove","line":102,"detail":"Removes key from secure storage.","visibility":"detail-only","confidence":0.7},{"id":"removesecureasync_return_103_0","kind":"return","label":"Returns result","line":103,"detail":"return Task.FromResult(Result.Ok());","visibility":"detail-only","confidence":0.7},{"id":"return_103","kind":"return","label":"success","line":103,"detail":"Returns Task.FromResult(Result.Ok()).","visibility":"detail-only","confidence":0.7},{"id":"return_107","kind":"return","label":"failure","line":107,"detail":"Returns Task.FromResult(Result.Fail(ex.Message)).","visibility":"detail-only","confidence":0.7},{"id":"removesecureasync_return_107_1","kind":"return","label":"Returns result","line":107,"detail":"return Task.FromResult(Result.Fail(ex.Message));","visibility":"detail-only","confidence":0.7}]}],"types":[],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Application.Abstractions.Services (INativeStorageService)","Microsoft.Maui.Storage (Preferences, SecureStorage)","FluentResults (Result, Result)"],"patterns":["Adapter","Infrastructure Service","Facade"],"domainConcepts":["Preferences-based persistence","SecureStorage (encrypted storage)","Result-wrapping for error handling"],"keyDetails":"This class adapts MAUI's synchronous Preferences and async SecureStorage APIs to the application's async FluentResults-based INativeStorageService; synchronous MAUI Preference calls are wrapped with Task.FromResult, while SecureStorage calls use async/await. All methods use try/catch to convert exceptions into FluentResults Failures.","orchestrationMethods":[{"name":"SaveSecureString","line":73,"confidence":0.57,"reason":"Contains 1 architectural actions relevant to business execution.","actionKinds":["mapping","external-call","return"],"evidencePaths":["NexusReader.Infrastructure.Mobile/Services/MauiStorageService.cs"]},{"name":"GetSecureString","line":86,"confidence":0.57,"reason":"Contains 1 architectural actions relevant to business execution.","actionKinds":["mapping","return","external-call"],"evidencePaths":["NexusReader.Infrastructure.Mobile/Services/MauiStorageService.cs"]}],"typedContracts":[],"persistenceInteractions":[],"externalInteractions":[{"methodName":"SaveSecureString","line":77,"kind":"external-call","detail":"Awaitable call to MAUI SecureStorage for encrypted storage.","evidencePaths":["NexusReader.Infrastructure.Mobile/Services/MauiStorageService.cs"]},{"methodName":"GetSecureString","line":90,"kind":"external-call","detail":"Awaitable call to read encrypted value from MAUI SecureStorage.","evidencePaths":["NexusReader.Infrastructure.Mobile/Services/MauiStorageService.cs"]}],"evidenceAnchors":[{"kind":"orchestration-method","label":"SaveSecureString","line":73,"summary":"Contains 1 architectural actions relevant to business execution.","confidence":0.57,"evidencePaths":["NexusReader.Infrastructure.Mobile/Services/MauiStorageService.cs"]},{"kind":"orchestration-method","label":"GetSecureString","line":86,"summary":"Contains 1 architectural actions relevant to business execution.","confidence":0.57,"evidencePaths":["NexusReader.Infrastructure.Mobile/Services/MauiStorageService.cs"]},{"kind":"external-call","label":"SaveSecureString","line":77,"summary":"Awaitable call to MAUI SecureStorage for encrypted storage.","confidence":0.8,"evidencePaths":["NexusReader.Infrastructure.Mobile/Services/MauiStorageService.cs"]},{"kind":"external-call","label":"GetSecureString","line":90,"summary":"Awaitable call to read encrypted value from MAUI SecureStorage.","confidence":0.8,"evidencePaths":["NexusReader.Infrastructure.Mobile/Services/MauiStorageService.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Infrastructure__Configuration__AiSettings.cs.json b/src/.documentation/cache/summaries/NexusReader.Infrastructure__Configuration__AiSettings.cs.json new file mode 100644 index 0000000..ba6ac71 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Infrastructure__Configuration__AiSettings.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Infrastructure/Configuration/AiSettings.cs","purpose":"Defines a POCO that models AI/LLM configuration settings (API key, model names, token limits, retries, temperature) intended for binding from configuration (likely using the .NET Options pattern).","classification":{"role":"config","layer":"infrastructure","confidence":0.9,"evidence":["Config/settings pattern","Namespace: NexusReader.Infrastructure.Configuration","Contains a SectionName constant and simple properties matching configuration keys","Type is a plain settings/POCO used to hold values such as ApiKey, Model, and token limits"]},"className":"AiSettings","methods":[],"types":[{"name":"AiSettings","kind":"dto","line":3,"purpose":"Holds AI/Google-related configuration for the application (model names, keys, token limits, retry and temperature settings).","fields":[{"name":"SectionName","type":"string (const)","required":true,"line":5,"description":"Configuration section key used to bind these settings (\"Ai:Google\")."},{"name":"ApiKey","type":"string","required":false,"line":7,"description":"API key for the AI provider; default empty string."},{"name":"Model","type":"string","required":false,"line":8,"description":"Primary model identifier, default \"gemini-1.5-flash\"."},{"name":"EmbeddingModel","type":"string","required":false,"line":9,"description":"Embedding model identifier, default \"gemini-embedding-001\"."},{"name":"MaxInputTokens","type":"int","required":false,"line":14,"description":"Maximum allowed input tokens (default 15000)."},{"name":"MaxOutputTokens","type":"int","required":false,"line":16,"description":"Maximum allowed output tokens (default 1000)."},{"name":"RetryAttempts","type":"int","required":false,"line":17,"description":"Number of retry attempts for calls (default 3)."},{"name":"Temperature","type":"double","required":false,"line":18,"description":"Sampling temperature for model responses (default 0.1)."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["Options Pattern","Configuration POCO"],"domainConcepts":["AI configuration","LLM model selection","Embeddings","Rate/size limits and retry policy"],"keyDetails":"Simple configuration holder with SectionName = \"Ai:Google\" and sensible defaults for model, embedding model, token limits, retry attempts, and temperature; intended for binding from configuration at startup.","orchestrationMethods":[],"typedContracts":[{"name":"AiSettings","kind":"dto","line":3,"fieldCount":8,"evidencePaths":["NexusReader.Infrastructure/Configuration/AiSettings.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"AiSettings","line":3,"summary":"dto with 8 fields.","confidence":0.8,"evidencePaths":["NexusReader.Infrastructure/Configuration/AiSettings.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Infrastructure__Configuration__StripeSettings.cs.json b/src/.documentation/cache/summaries/NexusReader.Infrastructure__Configuration__StripeSettings.cs.json new file mode 100644 index 0000000..6a8b2e1 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Infrastructure__Configuration__StripeSettings.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Infrastructure/Configuration/StripeSettings.cs","purpose":"Defines configuration settings for Stripe integration (product IDs) and exposes the configuration section name for binding.","classification":{"role":"config","layer":"infrastructure","confidence":0.9,"evidence":["Config/settings pattern","Namespace: NexusReader.Infrastructure.Configuration","Record named StripeSettings with SectionName constant and product ID properties"]},"className":"StripeSettings","methods":[],"types":[{"name":"StripeSettings","kind":"dto","line":3,"purpose":"Configuration DTO that holds Stripe product identifiers and the configuration section key.","fields":[{"name":"SectionName","type":"string (const)","required":true,"line":5,"description":"Configuration section key used for binding (\"Stripe\")."},{"name":"ProProductId","type":"string","required":true,"line":6,"description":"Product id for the Pro tier; default empty string."},{"name":"BasicProductId","type":"string","required":true,"line":7,"description":"Product id for the Basic tier; default empty string."},{"name":"FreeProductId","type":"string","required":true,"line":8,"description":"Product id for the Free tier; default empty string."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["Options pattern","Configuration DTO"],"domainConcepts":["Stripe","ProductId"],"keyDetails":"A simple immutable record used for binding the 'Stripe' configuration section; contains three init-only product id properties and a SectionName constant.","orchestrationMethods":[],"typedContracts":[{"name":"StripeSettings","kind":"dto","line":3,"fieldCount":4,"evidencePaths":["NexusReader.Infrastructure/Configuration/StripeSettings.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"StripeSettings","line":3,"summary":"dto with 4 fields.","confidence":0.8,"evidencePaths":["NexusReader.Infrastructure/Configuration/StripeSettings.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Infrastructure__DependencyInjection.cs.json b/src/.documentation/cache/summaries/NexusReader.Infrastructure__DependencyInjection.cs.json new file mode 100644 index 0000000..f1d4755 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Infrastructure__DependencyInjection.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Infrastructure/DependencyInjection.cs","purpose":"Registers and configures infrastructure dependencies: DB contexts, external clients (Qdrant, Neo4j), Hangfire, AI clients/resilience, app services, authorization policies, and related configuration for the NexusReader solution.","classification":{"role":"service-registration","layer":"infrastructure","confidence":0.9,"evidence":["Service registration API usage","File defines an IServiceCollection extension AddInfrastructure","Registers DbContexts, external clients, Hangfire, AI, and app services"]},"className":"DependencyInjection","methods":[{"name":"AddInfrastructure","line":31,"endLine":135,"signature":"(this IServiceCollection services, IConfiguration configuration) -> IServiceCollection","purpose":"Configures and registers infrastructure services and external clients (DBs, AI, vector/graph stores, job processing, authorization, and app-layer implementations) into the DI container.","calls":[{"targetFile":"NexusReader.Infrastructure/Persistence/AppDbContext.cs","targetMethod":"AppDbContext (DbContext)","callLine":36,"paramSummary":"pgConnectionString via UseNpgsql in AddDbContextFactory"},{"targetFile":"NexusReader.Infrastructure/Persistence/AppDbContext.cs","targetMethod":"AppDbContext (DbContext)","callLine":41,"paramSummary":"pgConnectionString via UseNpgsql in AddDbContext"},{"targetFile":"NexusReader.Infrastructure/Persistence/AppDbContext.cs","targetMethod":"AppDbContext (DbContext)","callLine":47,"paramSummary":"sqliteConnectionString via UseSqlite in AddDbContextFactory"},{"targetFile":"NexusReader.Infrastructure/Persistence/AppDbContext.cs","targetMethod":"AppDbContext (DbContext)","callLine":51,"paramSummary":"sqliteConnectionString via UseSqlite in AddDbContext"},{"targetFile":"NexusReader.Infrastructure/Services/KnowledgeService.cs","targetMethod":"KnowledgeService (implementation)","callLine":112,"paramSummary":"registered as IKnowledgeService (scoped)"},{"targetFile":"NexusReader.Infrastructure/Services/EpubReaderService.cs","targetMethod":"EpubReaderService (implementation)","callLine":113,"paramSummary":"registered as IEpubReader (transient)"},{"targetFile":"NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs","targetMethod":"EpubMetadataExtractor (implementation)","callLine":114,"paramSummary":"registered as IEpubMetadataExtractor (transient)"},{"targetFile":"NexusReader.Infrastructure/Services/BookStorageService.cs","targetMethod":"BookStorageService (implementation)","callLine":118,"paramSummary":"registered as IBookStorageService (scoped)"},{"targetFile":"NexusReader.Infrastructure.Persistence/EbookRepository.cs","targetMethod":"EbookRepository (implementation)","callLine":121,"paramSummary":"registered as IEbookRepository (scoped)"},{"targetFile":"NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs","targetMethod":"SignalRSyncBroadcaster (implementation)","callLine":124,"paramSummary":"registered as ISyncBroadcaster (scoped)"},{"targetFile":"NexusReader.Application.Security/ProUserHandler.cs","targetMethod":"ProUserHandler (authorization handler)","callLine":131,"paramSummary":"registered as IAuthorizationHandler (scoped)"},{"targetFile":"self","targetMethod":"InfrastructureMarker (class)","callLine":132,"paramSummary":"registered as IInfrastructureMarker (scoped)"}],"actions":[{"id":"branch_33","kind":"branch","label":"Selects DB provider","line":33,"detail":"If Postgres connection string present -> configure Npgsql DbContextFactory and DbContext; else configure Sqlite DbContextFactory and DbContext","visibility":"detail-only","confidence":0.7},{"id":"addinfrastructure_branch_34_0","kind":"branch","label":"Evaluates branch condition","line":34,"detail":"if (!string.IsNullOrEmpty(pgConnectionString))","conditionSummary":"!string.IsNullOrEmpty(pgConnectionString)","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"addinfrastructure_fallback_44_1","kind":"fallback","label":"Falls back to alternate path","line":44,"detail":"else","outcomeLabels":["fallback"],"visibility":"primary-visible","confidence":0.84},{"id":"external-client-registration_56","kind":"mapping","label":"Qdrant client registration","line":56,"detail":"Creates and registers QdrantClient singleton with resolved QdrantConnection URL","visibility":"detail-only","confidence":0.7},{"id":"external-client-registration_60","kind":"mapping","label":"Neo4j driver registration","line":60,"detail":"Creates and registers IDriver singleton using GraphDatabase.Driver with resolved Neo4jConnection URL","visibility":"detail-only","confidence":0.7},{"id":"addinfrastructure_branch_64_2","kind":"branch","label":"Evaluates branch condition","line":64,"detail":"if (!string.IsNullOrEmpty(pgConnectionString))","conditionSummary":"!string.IsNullOrEmpty(pgConnectionString)","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"conditional-registration_64","kind":"mapping","label":"Hangfire setup only with Postgres","line":64,"detail":"Registers Hangfire and HangfireServer if Postgres connection string exists","visibility":"detail-only","confidence":0.7},{"id":"config-binding_72","kind":"mapping","label":"Bind AiSettings and StripeSettings","line":72,"detail":"services.Configure called for AiSettings and StripeSettings using configuration sections","visibility":"detail-only","confidence":0.7},{"id":"addinfrastructure_branch_76_3","kind":"branch","label":"Evaluates branch condition","line":76,"detail":"if (string.IsNullOrWhiteSpace(aiSettings.ApiKey) || aiSettings.ApiKey == \"PLACEHOLDER\")","conditionSummary":"string.IsNullOrWhiteSpace(aiSettings.ApiKey) || aiSettings.ApiKey == \"PLACEHOLDER\"","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"guard-log_76","kind":"mapping","label":"Warn if AI API key missing or placeholder","line":76,"detail":"Console.WriteLine warning about missing AI API key","conditionSummary":"aiSettings.ApiKey is null/whitespace or equals 'PLACEHOLDER'","outcomeLabels":["log-warning","continue"],"visibility":"detail-only","confidence":0.7},{"id":"resilience-setup_81","kind":"mapping","label":"AI retry/resilience pipeline","line":81,"detail":"Adds 'ai-retry' pipeline with retry strategy: predicate-based handling for throttling/503/quota strings, exponential backoff, jitter, configurable MaxRetryAttempts and base Delay","visibility":"detail-only","confidence":0.7},{"id":"ai-client-registration_99","kind":"mapping","label":"Chat and embedding clients","line":99,"detail":"Registers Gemini chat client and embedding generator configured with AiSettings (ApiKey, ModelId, EmbeddingModel)","visibility":"detail-only","confidence":0.7},{"id":"service-registration_111","kind":"mapping","label":"Registers application and infrastructure services","line":111,"detail":"Registers multiple app-layer implementations (scoped/transient) like IKnowledgeService, IEpubReader, IBookStorageService, IEbookRepository, ISyncBroadcaster and authorization handler","visibility":"detail-only","confidence":0.7},{"id":"authorization-policy_126","kind":"mapping","label":"Adds ProUser policy","line":126,"detail":"Defines 'ProUser' policy adding ProUserRequirement","visibility":"detail-only","confidence":0.7},{"id":"return_134","kind":"return","label":"Returns IServiceCollection","line":134,"detail":"Returns the modified services collection","visibility":"detail-only","confidence":0.7},{"id":"addinfrastructure_return_134_4","kind":"return","label":"Returns result","line":134,"detail":"return services;","visibility":"detail-only","confidence":0.7}]},{"name":"Assembly","line":137,"endLine":138,"signature":"-> System.Reflection.Assembly","purpose":"Exposes the assembly containing the DependencyInjection type (convenience property for reflection/registration scenarios).","calls":[],"actions":[{"id":"return_137","kind":"return","label":"Return assembly","line":137,"detail":"Returns typeof(DependencyInjection).Assembly","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"IInfrastructureMarker","kind":"interface","line":140,"purpose":"Marker interface used to tag/identify the infrastructure assembly's registrations.","fields":[]},{"name":"InfrastructureMarker","kind":"model","line":141,"purpose":"Empty internal implementation of IInfrastructureMarker to register a concrete marker in DI.","fields":[]}],"serviceRegistrations":[{"line":36,"serviceType":"AppDbContext (DbContextFactory)","implementationType":"AppDbContext","lifetime":"scoped","factorySummary":"Adds AppDbContext factory using Npgsql when Postgres connection string is present"},{"line":41,"serviceType":"AppDbContext (DbContext)","implementationType":"AppDbContext","lifetime":"scoped","factorySummary":"Registers scoped AppDbContext using Npgsql"},{"line":47,"serviceType":"AppDbContext (DbContextFactory)","implementationType":"AppDbContext","lifetime":"scoped","factorySummary":"Adds AppDbContext factory using Sqlite fallback"},{"line":51,"serviceType":"AppDbContext (DbContext)","implementationType":"AppDbContext","lifetime":"scoped","factorySummary":"Registers scoped AppDbContext using Sqlite fallback"},{"line":57,"serviceType":"QdrantClient","implementationType":"QdrantClient","lifetime":"singleton","factorySummary":"Registers QdrantClient singleton with configured URL"},{"line":61,"serviceType":"IDriver","implementationType":"Neo4j.Driver (GraphDatabase.Driver)","lifetime":"singleton","factorySummary":"Registers Neo4j driver singleton with configured URL"},{"line":66,"serviceType":"Hangfire (storage/server)","implementationType":"Hangfire/Postgres storage","lifetime":"unknown","factorySummary":"Configures Hangfire to use Postgres storage and adds HangfireServer when Postgres available"},{"line":99,"serviceType":"ChatClient / GeminiChatClient","implementationType":"GeminiChatClient","lifetime":"unknown","factorySummary":"Registers Gemini chat client using AiSettings"},{"line":105,"serviceType":"EmbeddingGenerator / GeminiEmbeddingGenerator","implementationType":"GeminiEmbeddingGenerator","lifetime":"unknown","factorySummary":"Registers embedding generator using AiSettings"},{"line":112,"serviceType":"IKnowledgeService","implementationType":"KnowledgeService","lifetime":"scoped","factorySummary":"Application-layer knowledge service registration"},{"line":113,"serviceType":"IEpubReader","implementationType":"EpubReaderService","lifetime":"transient","factorySummary":"Ebook reading service registration"},{"line":118,"serviceType":"IBookStorageService","implementationType":"BookStorageService","lifetime":"scoped","factorySummary":"Scoped book storage service (MAUI-compatible lifetime)"},{"line":121,"serviceType":"IEbookRepository","implementationType":"EbookRepository","lifetime":"scoped","factorySummary":"Ebook repository matching DbContext lifetime"},{"line":124,"serviceType":"ISyncBroadcaster","implementationType":"SignalRSyncBroadcaster","lifetime":"scoped","factorySummary":"SignalR-based sync broadcaster registered scoped"},{"line":131,"serviceType":"IAuthorizationHandler","implementationType":"ProUserHandler","lifetime":"scoped","factorySummary":"Custom authorization handler for ProUser policy"},{"line":132,"serviceType":"IInfrastructureMarker","implementationType":"InfrastructureMarker","lifetime":"scoped","factorySummary":"Registers a marker instance to denote infrastructure assembly presence"}],"startupActions":[],"dependencies":["NexusReader.Infrastructure/Persistence/AppDbContext.cs","NexusReader.Infrastructure/Services/KnowledgeService.cs","NexusReader.Infrastructure/Services/EpubReaderService.cs","NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs","NexusReader.Infrastructure/Services/BookStorageService.cs","NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs","NexusReader.Infrastructure.Persistence/EbookRepository.cs","NexusReader.Application.Security/ProUserHandler.cs","NexusReader.Infrastructure/Configuration/AiSettings.cs","NexusReader.Infrastructure/Configuration/StripeSettings.cs"],"patterns":["Dependency Injection / Service Registration","Factory (DbContextFactory)","Resilience (retry pipeline)","Repository","Marker type registration"],"domainConcepts":["Ebook / Epub processing","AI (chat/embeddings)","Vector store (Qdrant)","Graph DB (Neo4j)","Background jobs (Hangfire)","Authorization (ProUser policy)"],"keyDetails":"File is the central infra DI composition point: chooses DB provider (Postgres vs Sqlite), configures Hangfire conditionally, registers external AI/vector/graph clients, installs an AI retry pipeline that inspects exception messages for throttling and service errors, warns when AI key is missing, and registers scoped services matching DbContext lifetime to prevent MAUI singleton issues.","orchestrationMethods":[{"name":"AddInfrastructure","line":31,"confidence":0.98,"reason":"Coordinates 12 downstream calls with 5 architectural actions.","actionKinds":["branch","fallback","mapping","return"],"evidencePaths":["NexusReader.Infrastructure/DependencyInjection.cs","NexusReader.Infrastructure/Persistence/AppDbContext.cs","NexusReader.Infrastructure/Persistence/AppDbContext.cs","NexusReader.Infrastructure/Persistence/AppDbContext.cs","NexusReader.Infrastructure/Persistence/AppDbContext.cs","NexusReader.Infrastructure/Services/KnowledgeService.cs"]}],"typedContracts":[{"name":"IInfrastructureMarker","kind":"interface","line":140,"fieldCount":0,"evidencePaths":["NexusReader.Infrastructure/DependencyInjection.cs"]},{"name":"InfrastructureMarker","kind":"model","line":141,"fieldCount":0,"evidencePaths":["NexusReader.Infrastructure/DependencyInjection.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"orchestration-method","label":"AddInfrastructure","line":31,"summary":"Coordinates 12 downstream calls with 5 architectural actions.","confidence":0.98,"evidencePaths":["NexusReader.Infrastructure/DependencyInjection.cs","NexusReader.Infrastructure/Persistence/AppDbContext.cs","NexusReader.Infrastructure/Persistence/AppDbContext.cs","NexusReader.Infrastructure/Persistence/AppDbContext.cs","NexusReader.Infrastructure/Persistence/AppDbContext.cs","NexusReader.Infrastructure/Services/KnowledgeService.cs"]},{"kind":"typed-contract","label":"IInfrastructureMarker","line":140,"summary":"interface with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Infrastructure/DependencyInjection.cs"]},{"kind":"typed-contract","label":"InfrastructureMarker","line":141,"summary":"model with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Infrastructure/DependencyInjection.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Infrastructure__Helpers__ContentHasher.cs.json b/src/.documentation/cache/summaries/NexusReader.Infrastructure__Helpers__ContentHasher.cs.json new file mode 100644 index 0000000..0dc005c --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Infrastructure__Helpers__ContentHasher.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Infrastructure/Helpers/ContentHasher.cs","purpose":"Utility for normalizing text content and producing a deterministic SHA-256 hex hash used by the infrastructure layer for content identity/lookup.","classification":{"role":"service","layer":"infrastructure","confidence":0.78,"evidence":["namespace NexusReader.Infrastructure.Helpers (file path indicates infrastructure helpers)","static helper class ContentHasher provides hashing/normalization utilities"]},"className":"ContentHasher","methods":[{"name":"ComputeHash","line":9,"endLine":22,"signature":"(input: string) -> string","purpose":"Normalizes input text, computes a SHA-256 hash of the UTF-8 bytes, and returns the lowercase hex string.","calls":[{"targetFile":"self","targetMethod":"Normalize","callLine":16,"paramSummary":"input string to normalize"}],"actions":[{"id":"computehash_branch_11_0","kind":"branch","label":"Evaluates branch condition","line":11,"detail":"if (string.IsNullOrWhiteSpace(input))","conditionSummary":"string.IsNullOrWhiteSpace(input)","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"guard-clause_11","kind":"guard-clause","label":"Rejects empty/whitespace input","line":11,"detail":"if input is null/whitespace returns string.Empty","conditionSummary":"string.IsNullOrWhiteSpace(input)","outcomeLabels":["returns-empty","continue"],"visibility":"detail-only","confidence":0.7},{"id":"computehash_return_13_1","kind":"return","label":"Returns result","line":13,"detail":"return string.Empty;","visibility":"detail-only","confidence":0.7},{"id":"normalization-call_16","kind":"mapping","label":"Normalizes input before hashing","line":16,"detail":"calls Normalize(input)","visibility":"detail-only","confidence":0.7},{"id":"encoding_18","kind":"mapping","label":"Encodes normalized input to UTF-8 bytes","line":18,"detail":"Encoding.UTF8.GetBytes(normalizedInput)","visibility":"detail-only","confidence":0.7},{"id":"hash_19","kind":"mapping","label":"Computes SHA-256 hash","line":19,"detail":"SHA256.HashData(inputBytes)","visibility":"detail-only","confidence":0.7},{"id":"format_21","kind":"mapping","label":"Converts hash bytes to lowercase hex string","line":21,"detail":"Convert.ToHexString(hashBytes).ToLowerInvariant() and return","visibility":"detail-only","confidence":0.7},{"id":"return_21","kind":"return","label":"Returns hex hash or empty string","line":21,"detail":"final return of computed hash or early empty","visibility":"detail-only","confidence":0.7},{"id":"computehash_return_21_2","kind":"return","label":"Returns result","line":21,"detail":"return Convert.ToHexString(hashBytes).ToLowerInvariant();","visibility":"detail-only","confidence":0.7}]},{"name":"Normalize","line":24,"endLine":36,"signature":"(input: string) -> string","purpose":"Trims whitespace, collapses consecutive whitespace to single spaces, and lower-cases the text for stable semantic comparison.","calls":[],"actions":[{"id":"normalize_branch_26_0","kind":"branch","label":"Evaluates branch condition","line":26,"detail":"if (string.IsNullOrWhiteSpace(input))","conditionSummary":"string.IsNullOrWhiteSpace(input)","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"guard-clause_26","kind":"guard-clause","label":"Rejects empty/whitespace input","line":26,"detail":"if input is null/whitespace returns string.Empty","conditionSummary":"string.IsNullOrWhiteSpace(input)","outcomeLabels":["returns-empty","continue"],"visibility":"detail-only","confidence":0.7},{"id":"normalize_return_28_1","kind":"return","label":"Returns result","line":28,"detail":"return string.Empty;","visibility":"detail-only","confidence":0.7},{"id":"transformation_32","kind":"mapping","label":"Trim and collapse whitespace","line":32,"detail":"Regex.Replace(input.Trim(), @\"\\s+\", \" \") collapses runs of whitespace to a single space","visibility":"detail-only","confidence":0.7},{"id":"transformation_35","kind":"mapping","label":"Lower-case normalization","line":35,"detail":"normalized.ToLowerInvariant() for case-insensitive comparisons","visibility":"detail-only","confidence":0.7},{"id":"return_35","kind":"return","label":"Returns normalized string","line":35,"detail":"final normalized string returned","visibility":"detail-only","confidence":0.7},{"id":"normalize_return_35_2","kind":"return","label":"Returns result","line":35,"detail":"return normalized.ToLowerInvariant();","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"ContentHasher","kind":"model","line":7,"purpose":"Static utility class providing content normalization and hashing helpers.","fields":[]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["Utility","Hashing"],"domainConcepts":["content normalization","deterministic hashing"],"keyDetails":"Stable content hashing with whitespace collapsing and lower-casing to ensure semantically equivalent inputs map to the same SHA-256 hex string; early-return on empty inputs.","orchestrationMethods":[{"name":"ComputeHash","line":9,"confidence":0.65,"reason":"Contains 1 architectural actions relevant to business execution.","actionKinds":["branch","guard-clause","return","mapping"],"evidencePaths":["NexusReader.Infrastructure/Helpers/ContentHasher.cs","self"]},{"name":"Normalize","line":24,"confidence":0.57,"reason":"Contains 1 architectural actions relevant to business execution.","actionKinds":["branch","guard-clause","return","mapping"],"evidencePaths":["NexusReader.Infrastructure/Helpers/ContentHasher.cs"]}],"typedContracts":[{"name":"ContentHasher","kind":"model","line":7,"fieldCount":0,"evidencePaths":["NexusReader.Infrastructure/Helpers/ContentHasher.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"orchestration-method","label":"ComputeHash","line":9,"summary":"Contains 1 architectural actions relevant to business execution.","confidence":0.65,"evidencePaths":["NexusReader.Infrastructure/Helpers/ContentHasher.cs","self"]},{"kind":"orchestration-method","label":"Normalize","line":24,"summary":"Contains 1 architectural actions relevant to business execution.","confidence":0.57,"evidencePaths":["NexusReader.Infrastructure/Helpers/ContentHasher.cs"]},{"kind":"typed-contract","label":"ContentHasher","line":7,"summary":"model with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Infrastructure/Helpers/ContentHasher.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Infrastructure__Helpers__JsonRepairHelper.cs.json b/src/.documentation/cache/summaries/NexusReader.Infrastructure__Helpers__JsonRepairHelper.cs.json new file mode 100644 index 0000000..db7f601 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Infrastructure__Helpers__JsonRepairHelper.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Infrastructure/Helpers/JsonRepairHelper.cs","purpose":"Provides a small infrastructure helper to repair/truncate malformed or truncated JSON text by pruning trailing garbage and auto-closing open strings/brackets/braces.","classification":{"role":"service","layer":"infrastructure","confidence":0.9,"evidence":["namespace NexusReader.Infrastructure.Helpers (line 4)","static helper class JsonRepairHelper with a Repair method (lines 6-9)","implementation performs JSON truncation repair and balancing logic (lines 13-64)"]},"className":"JsonRepairHelper","methods":[{"name":"Repair","line":8,"endLine":68,"signature":"(json: string) -> string","purpose":"Detects truncated/garbled JSON, prunes trailing garbage, and auto-closes open strings/brackets/braces to return a best-effort valid JSON string.","calls":[],"actions":[{"id":"repair_guard-clause_10_0","kind":"guard-clause","label":"Guards early exit or rejection path","line":10,"detail":"if (string.IsNullOrWhiteSpace(json)) return json;","conditionSummary":"string.IsNullOrWhiteSpace(json)","outcomeLabels":["exit","continue"],"visibility":"primary-visible","confidence":0.9},{"id":"guard-clause_10","kind":"guard-clause","label":"Rejects empty input","line":10,"detail":"if (string.IsNullOrWhiteSpace(json)) return json;","conditionSummary":"string.IsNullOrWhiteSpace(json)","outcomeLabels":["return original (null/empty/whitespace)","continue"],"visibility":"detail-only","confidence":0.7},{"id":"transformation_11","kind":"mapping","label":"Trim input","line":11,"detail":"json = json.Trim();","visibility":"detail-only","confidence":0.7},{"id":"branch_14","kind":"branch","label":"Check for definite truncation","line":14,"detail":"if (!json.EndsWith(\"}\") && !json.EndsWith(\"]\")) { ... }","conditionSummary":"not ending with '}' and not ending with ']'","outcomeLabels":["repair path (likely truncated)","return original (already closed)"],"visibility":"detail-only","confidence":0.7},{"id":"repair_branch_14_1","kind":"branch","label":"Evaluates branch condition","line":14,"detail":"if (!json.EndsWith(\"}\") && !json.EndsWith(\"]\"))","conditionSummary":"!json.EndsWith(\"}\") && !json.EndsWith(\"]\")","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"computation_18","kind":"mapping","label":"Find last likely clean delimiter","line":18,"detail":"int lastGoodComma = json.LastIndexOf(','); int lastGoodBrace = json.LastIndexOf('}'); int lastGoodBracket = json.LastIndexOf(']'); int cutoff = Math.Max(lastGoodComma, Math.Max(lastGoodBrace, lastGoodBracket));","visibility":"detail-only","confidence":0.7},{"id":"repair_branch_24_2","kind":"branch","label":"Evaluates branch condition","line":24,"detail":"if (cutoff > 0)","conditionSummary":"cutoff > 0","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"guard-clause_24","kind":"guard-clause","label":"Prune trailing garbage if a cutoff found","line":24,"detail":"if (cutoff > 0) { json = json.Substring(0, cutoff); }","conditionSummary":"cutoff > 0","outcomeLabels":["prune to cutoff","keep original"],"visibility":"detail-only","confidence":0.7},{"id":"setup_31","kind":"mapping","label":"Initialize balancing state","line":31,"detail":"Stack stack, bool inString=false, bool escaped=false","visibility":"detail-only","confidence":0.7},{"id":"repair_loop_35_3","kind":"loop","label":"Repeats work over a collection or condition","line":35,"detail":"foreach (char c in json)","conditionSummary":"char c in json","loopTargetLine":35,"loopExitSummary":"Leaves the loop when the condition no longer holds.","visibility":"primary-visible","confidence":0.86},{"id":"loop_35","kind":"loop","label":"Scan characters to track open/close tokens and string escaping","line":35,"detail":"foreach (char c in json) { handle escape, toggle inString on '\"', push '{'/'[' to stack, pop when matching '}'/']' }","visibility":"detail-only","confidence":0.7},{"id":"repair_guard-clause_37_4","kind":"guard-clause","label":"Guards early exit or rejection path","line":37,"detail":"if (escaped) { escaped = false; continue; }","conditionSummary":"escaped","outcomeLabels":["exit","continue"],"visibility":"primary-visible","confidence":0.9},{"id":"repair_guard-clause_38_5","kind":"guard-clause","label":"Guards early exit or rejection path","line":38,"detail":"if (c == '\\\\') { escaped = true; continue; }","conditionSummary":"c == '\\\\'","outcomeLabels":["exit","continue"],"visibility":"primary-visible","confidence":0.9},{"id":"repair_guard-clause_39_6","kind":"guard-clause","label":"Guards early exit or rejection path","line":39,"detail":"if (c == '\"') { inString = !inString; continue; }","conditionSummary":"c == '\"'","outcomeLabels":["exit","continue"],"visibility":"primary-visible","confidence":0.9},{"id":"repair_guard-clause_40_7","kind":"guard-clause","label":"Guards early exit or rejection path","line":40,"detail":"if (inString) continue;","conditionSummary":"inString","outcomeLabels":["exit","continue"],"visibility":"primary-visible","confidence":0.9},{"id":"repair_branch_42_8","kind":"branch","label":"Evaluates branch condition","line":42,"detail":"if (c == '{' || c == '[') stack.Push(c);","conditionSummary":"c == '{' || c == '[') stack.Push(c","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"repair_branch_43_9","kind":"branch","label":"Evaluates branch condition","line":43,"detail":"else if (c == '}' || c == ']')","conditionSummary":"c == '}' || c == ']'","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"repair_fallback_43_10","kind":"fallback","label":"Falls back to alternate path","line":43,"detail":"else if (c == '}' || c == ']')","outcomeLabels":["fallback"],"visibility":"primary-visible","confidence":0.84},{"id":"repair_branch_45_11","kind":"branch","label":"Evaluates branch condition","line":45,"detail":"if (stack.Count > 0)","conditionSummary":"stack.Count > 0","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"repair_branch_48_12","kind":"branch","label":"Evaluates branch condition","line":48,"detail":"if ((c == '}' && last == '{') || (c == ']' && last == '['))","conditionSummary":"(c == '}' && last == '{') || (c == ']' && last == '[')","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"construction_54","kind":"mapping","label":"Build repaired output","line":54,"detail":"var builder = new StringBuilder(json); if (inString) builder.Append('\"'); while (stack.Count>0) pop and append matching closing brace/bracket;","visibility":"detail-only","confidence":0.7},{"id":"repair_branch_55_13","kind":"branch","label":"Evaluates branch condition","line":55,"detail":"if (inString) builder.Append('\"');","conditionSummary":"inString) builder.Append('\"'","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"loop_57","kind":"loop","label":"Close remaining open containers","line":57,"detail":"while (stack.Count > 0) { var c = stack.Pop(); if (c == '{') builder.Append('}'); else if (c == '[') builder.Append(']'); }","visibility":"detail-only","confidence":0.7},{"id":"repair_loop_57_14","kind":"loop","label":"Repeats work over a collection or condition","line":57,"detail":"while (stack.Count > 0)","conditionSummary":"stack.Count > 0","loopTargetLine":57,"loopExitSummary":"Leaves the loop when the condition no longer holds.","visibility":"primary-visible","confidence":0.86},{"id":"repair_branch_60_15","kind":"branch","label":"Evaluates branch condition","line":60,"detail":"if (c == '{') builder.Append(\"}\");","conditionSummary":"c == '{') builder.Append(\"}\"","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"repair_branch_61_16","kind":"branch","label":"Evaluates branch condition","line":61,"detail":"else if (c == '[') builder.Append(\"]\");","conditionSummary":"c == '[') builder.Append(\"]\"","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"repair_fallback_61_17","kind":"fallback","label":"Falls back to alternate path","line":61,"detail":"else if (c == '[') builder.Append(\"]\");","outcomeLabels":["fallback"],"visibility":"primary-visible","confidence":0.84},{"id":"return_64","kind":"return","label":"Return repaired JSON","line":64,"detail":"return builder.ToString();","visibility":"detail-only","confidence":0.7},{"id":"repair_return_64_18","kind":"return","label":"Returns result","line":64,"detail":"return builder.ToString();","visibility":"detail-only","confidence":0.7},{"id":"return_67","kind":"return","label":"Return original JSON when already closed","line":67,"detail":"return json;","visibility":"detail-only","confidence":0.7},{"id":"repair_return_67_19","kind":"return","label":"Returns result","line":67,"detail":"return json;","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"JsonRepairHelper","kind":"model","line":6,"purpose":"Static helper class encapsulating JSON repair utility logic used by infrastructure code.","fields":[]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["Helper","Stack-based balancing algorithm","Defensive input sanitization"],"domainConcepts":[],"keyDetails":"Single-file static utility that attempts best-effort repair of truncated or garbled JSON by pruning trailing noise and auto-closing open strings/brackets/braces; purely in-process and deterministic, no external calls or persistence.","orchestrationMethods":[{"name":"Repair","line":8,"confidence":0.98,"reason":"Contains 16 architectural actions relevant to business execution.","actionKinds":["guard-clause","mapping","branch","loop","fallback","return"],"evidencePaths":["NexusReader.Infrastructure/Helpers/JsonRepairHelper.cs"]}],"typedContracts":[{"name":"JsonRepairHelper","kind":"model","line":6,"fieldCount":0,"evidencePaths":["NexusReader.Infrastructure/Helpers/JsonRepairHelper.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"orchestration-method","label":"Repair","line":8,"summary":"Contains 16 architectural actions relevant to business execution.","confidence":0.98,"evidencePaths":["NexusReader.Infrastructure/Helpers/JsonRepairHelper.cs"]},{"kind":"typed-contract","label":"JsonRepairHelper","line":6,"summary":"model with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Infrastructure/Helpers/JsonRepairHelper.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Infrastructure__Identity__TokenLimitHandler.cs.json b/src/.documentation/cache/summaries/NexusReader.Infrastructure__Identity__TokenLimitHandler.cs.json new file mode 100644 index 0000000..025a9bc --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Infrastructure__Identity__TokenLimitHandler.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Infrastructure/Identity/TokenLimitHandler.cs","purpose":"Authorization handler that verifies whether the current user has available AI tokens or an unlimited token subscription, using the application's DbContext and Identity user data.","classification":{"role":"handler","layer":"infrastructure","confidence":0.8,"evidence":["Domain/entity pattern","Class inherits Microsoft.AspNetCore.Authorization.AuthorizationHandler","Namespace NexusReader.Infrastructure.Identity and references to AppDbContext and NexusUser","Implements authorization logic (context.Succeed)"]},"className":"TokenLimitHandler","methods":[{"name":"TokenLimitHandler","line":18,"endLine":22,"signature":"(dbContextFactory: IDbContextFactory, userManager: UserManager) -> void","purpose":"Constructor: captures DbContext factory and UserManager dependencies for use by the handler.","calls":[],"actions":[{"id":"assignment_20","kind":"mapping","label":"Store dependencies","line":20,"detail":"_dbContextFactory = dbContextFactory; _userManager = userManager;","visibility":"detail-only","confidence":0.7}]},{"name":"HandleRequirementAsync","line":24,"endLine":49,"signature":"(context: AuthorizationHandlerContext, requirement: TokenLimitRequirement) -> Task","purpose":"Evaluates the requirement by resolving the current user and their subscription/token usage and marks the requirement succeeded if tokens are available or the plan is unlimited.","calls":[{"targetFile":"unknown","targetMethod":"ClaimsPrincipal.FindFirstValue","callLine":28,"paramSummary":"ClaimTypes.NameIdentifier (reads current user's id from context.User)"},{"targetFile":"unknown","targetMethod":"IDbContextFactory.CreateDbContext","callLine":34,"paramSummary":"none (creates AppDbContext instance for query)"},{"targetFile":"unknown","targetMethod":"DbSet.Include / FirstOrDefaultAsync","callLine":35,"paramSummary":"Include(u => u.SubscriptionPlan) then FirstOrDefaultAsync(u => u.Id == userId) to load the NexusUser"},{"targetFile":"unknown","targetMethod":"AuthorizationHandlerContext.Succeed","callLine":47,"paramSummary":"requirement (marks authorization success)"}],"actions":[{"id":"handlerequirementasync_repository-read_28_0","kind":"repository-read","label":"Reads repository or persistence state","line":28,"detail":"var userId = context.User.FindFirstValue(ClaimTypes.NameIdentifier);","visibility":"secondary-visible","confidence":0.86},{"id":"handlerequirementasync_branch_29_1","kind":"branch","label":"Evaluates branch condition","line":29,"detail":"if (userId == null)","conditionSummary":"userId == null","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"guard-clause_29","kind":"guard-clause","label":"Return if no user id in auth context","line":29,"detail":"If claim for NameIdentifier is missing, handler exits without succeeding the requirement.","conditionSummary":"userId == null","outcomeLabels":["return"],"visibility":"detail-only","confidence":0.7},{"id":"handlerequirementasync_return_31_2","kind":"return","label":"Returns result","line":31,"detail":"return;","visibility":"detail-only","confidence":0.7},{"id":"resource-creation_34","kind":"mapping","label":"Create DbContext with using/disposal","line":34,"detail":"using var db = _dbContextFactory.CreateDbContext(); ensures context is disposed after use.","visibility":"detail-only","confidence":0.7},{"id":"repository-read_35","kind":"repository-read","label":"Query Users with SubscriptionPlan included","line":35,"detail":"db.Users.Include(u => u.SubscriptionPlan).FirstOrDefaultAsync(u => u.Id == userId) - loads user and navigation property","visibility":"detail-only","confidence":0.7},{"id":"handlerequirementasync_branch_39_3","kind":"branch","label":"Evaluates branch condition","line":39,"detail":"if (user == null)","conditionSummary":"user == null","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"guard-clause_39","kind":"guard-clause","label":"Return if user record not found","line":39,"detail":"If no matching user, handler exits without succeeding requirement.","conditionSummary":"user == null","outcomeLabels":["return"],"visibility":"detail-only","confidence":0.7},{"id":"handlerequirementasync_return_41_4","kind":"return","label":"Returns result","line":41,"detail":"return;","visibility":"detail-only","confidence":0.7},{"id":"branch_44","kind":"branch","label":"Check token availability / unlimited plan","line":44,"detail":"If true, calls context.Succeed(requirement); otherwise does nothing (authorization fails by omission).","conditionSummary":"user.SubscriptionPlan?.IsUnlimitedTokens == true || user.AITokensUsed < user.AITokenLimit","outcomeLabels":["succeed","no-action"],"visibility":"detail-only","confidence":0.7},{"id":"handlerequirementasync_branch_45_5","kind":"branch","label":"Evaluates branch condition","line":45,"detail":"if (user.SubscriptionPlan?.IsUnlimitedTokens == true || user.AITokensUsed < user.AITokenLimit)","conditionSummary":"user.SubscriptionPlan?.IsUnlimitedTokens == true || user.AITokensUsed < user.AITokenLimit","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"handlerequirementasync_repository-read_47_6","kind":"repository-read","label":"Reads repository or persistence state","line":47,"detail":"context.Succeed(requirement);","visibility":"secondary-visible","confidence":0.86}]}],"types":[],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Data.Persistence/AppDbContext (referenced via IDbContextFactory)","NexusReader.Domain.Entities/NexusUser","TokenLimitRequirement (authorization requirement type, referenced)"],"patterns":["Authorization Handler","Repository Query (EF Core)","Guard Clauses"],"domainConcepts":["User","SubscriptionPlan","AI tokens / token limits"],"keyDetails":"Handler uses a DbContext factory to query the NexusUser with SubscriptionPlan and marks the authorization requirement succeeded if the plan is unlimited or user has remaining AI tokens. The injected UserManager is captured but unused in this file.","orchestrationMethods":[{"name":"HandleRequirementAsync","line":24,"confidence":0.98,"reason":"Coordinates 4 downstream calls with 7 architectural actions.","actionKinds":["repository-read","branch","guard-clause","return","mapping"],"evidencePaths":["NexusReader.Infrastructure/Identity/TokenLimitHandler.cs","unknown","unknown","unknown","unknown"]}],"typedContracts":[],"persistenceInteractions":[{"methodName":"HandleRequirementAsync","line":28,"kind":"persistence-read","detail":"var userId = context.User.FindFirstValue(ClaimTypes.NameIdentifier);","evidencePaths":["NexusReader.Infrastructure/Identity/TokenLimitHandler.cs"]},{"methodName":"HandleRequirementAsync","line":35,"kind":"persistence-read","detail":"db.Users.Include(u => u.SubscriptionPlan).FirstOrDefaultAsync(u => u.Id == userId) - loads user and navigation property","evidencePaths":["NexusReader.Infrastructure/Identity/TokenLimitHandler.cs"]},{"methodName":"HandleRequirementAsync","line":47,"kind":"persistence-read","detail":"context.Succeed(requirement);","evidencePaths":["NexusReader.Infrastructure/Identity/TokenLimitHandler.cs"]}],"externalInteractions":[],"evidenceAnchors":[{"kind":"orchestration-method","label":"HandleRequirementAsync","line":24,"summary":"Coordinates 4 downstream calls with 7 architectural actions.","confidence":0.98,"evidencePaths":["NexusReader.Infrastructure/Identity/TokenLimitHandler.cs","unknown","unknown","unknown","unknown"]},{"kind":"persistence","label":"HandleRequirementAsync","line":28,"summary":"var userId = context.User.FindFirstValue(ClaimTypes.NameIdentifier);","confidence":0.82,"evidencePaths":["NexusReader.Infrastructure/Identity/TokenLimitHandler.cs"]},{"kind":"persistence","label":"HandleRequirementAsync","line":35,"summary":"db.Users.Include(u => u.SubscriptionPlan).FirstOrDefaultAsync(u => u.Id == userId) - loads user and navigation property","confidence":0.82,"evidencePaths":["NexusReader.Infrastructure/Identity/TokenLimitHandler.cs"]},{"kind":"persistence","label":"HandleRequirementAsync","line":47,"summary":"context.Succeed(requirement);","confidence":0.82,"evidencePaths":["NexusReader.Infrastructure/Identity/TokenLimitHandler.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Infrastructure__Identity__TokenLimitRequirement.cs.json b/src/.documentation/cache/summaries/NexusReader.Infrastructure__Identity__TokenLimitRequirement.cs.json new file mode 100644 index 0000000..39d2dd0 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Infrastructure__Identity__TokenLimitRequirement.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Infrastructure/Identity/TokenLimitRequirement.cs","purpose":"Defines an authorization requirement used to enforce per-user AI token limits (marker type for policy-based authorization).","classification":{"role":"middleware","layer":"infrastructure","confidence":0.9,"evidence":["Domain/entity pattern","Implements Microsoft.AspNetCore.Authorization.IAuthorizationRequirement","Located in NexusReader.Infrastructure.Identity namespace and file path"]},"className":"TokenLimitRequirement","methods":[],"types":[{"name":"TokenLimitRequirement","kind":"model","line":8,"purpose":"Marker authorization requirement indicating a check for a user's AI token usage/limit.","fields":[]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["Policy-based Authorization","Marker Requirement"],"domainConcepts":["AI token limit","Authorization/Policy"],"keyDetails":"Empty marker class implementing IAuthorizationRequirement; runtime behavior is provided by an authorization handler elsewhere that will evaluate token usage against limits.","orchestrationMethods":[],"typedContracts":[{"name":"TokenLimitRequirement","kind":"model","line":8,"fieldCount":0,"evidencePaths":["NexusReader.Infrastructure/Identity/TokenLimitRequirement.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"TokenLimitRequirement","line":8,"summary":"model with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Infrastructure/Identity/TokenLimitRequirement.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Infrastructure__NexusReader.Infrastructure.csproj.json b/src/.documentation/cache/summaries/NexusReader.Infrastructure__NexusReader.Infrastructure.csproj.json new file mode 100644 index 0000000..6d50244 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Infrastructure__NexusReader.Infrastructure.csproj.json @@ -0,0 +1 @@ +{"path":"NexusReader.Infrastructure/NexusReader.Infrastructure.csproj","purpose":"MSBuild project file that defines the Infrastructure project: references Application and Data projects, declares framework and a set of NuGet packages required for runtime concerns like AI, persistence, background jobs, resilience, graph DB, vector DB, and payments.","classification":{"role":"unknown","layer":"infrastructure","confidence":0.9,"evidence":["ProjectReference entries to ../NexusReader.Application and ../NexusReader.Data (lines 4-5)","PackageReference entries for Hangfire, EF Core, Neo4j, Qdrant, Polly, Stripe, AI/Tokenizers (lines 13-34)","FrameworkReference to Microsoft.AspNetCore.App (line 9)"]},"className":"","methods":[],"types":[],"serviceRegistrations":[],"startupActions":[],"dependencies":["..\\NexusReader.Application\\NexusReader.Application.csproj","..\\NexusReader.Data\\NexusReader.Data.csproj"],"patterns":["Background Jobs (Hangfire)","Resilience/Retry (Polly)","ORM/Repository (EF Core, Npgsql)","Graph DB integration (Neo4j)","Vector DB/Embedding (Qdrant)","AI/ML integration (Gemini, ML Tokenizers)","Payment integration (Stripe)"],"domainConcepts":["Background processing","Resilience and HTTP retries","Vector search / embeddings","Graph relationships","Authentication/Identity","Payments","Ebook processing"],"keyDetails":"TargetFramework: net10.0 (line 37); ImplicitUsings enabled and Nullable enabled (lines 38-39). Project wires Application and Data projects and brings runtime packages for AI, persistence, background jobs, graph DB, vector DB, resilience, tokenization, and payments.","orchestrationMethods":[],"typedContracts":[],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Infrastructure__Persistence__EbookRepository.cs.json b/src/.documentation/cache/summaries/NexusReader.Infrastructure__Persistence__EbookRepository.cs.json new file mode 100644 index 0000000..cefd4e5 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Infrastructure__Persistence__EbookRepository.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Infrastructure/Persistence/EbookRepository.cs","purpose":"EF Core repository implementing IEbookRepository; provides data access for Author and Ebook entities using an AppDbContext, with provider-aware search logic and basic persistence operations.","classification":{"role":"repository","layer":"infrastructure","confidence":0.9,"evidence":["Repository naming pattern","namespace NexusReader.Infrastructure.Persistence","implements IEbookRepository and uses AppDbContext","contains Add/Find/Save persistence methods interacting with DbContext"]},"className":"EbookRepository","methods":[{"name":"FindAuthorByNameAsync","line":22,"endLine":36,"signature":"(name: string, cancellationToken: CancellationToken = default) -> Task","purpose":"Finds an Author by name using a case-insensitive comparison; uses PostgreSQL ILike when running on Npgsql, otherwise falls back to ToLower string comparison.","calls":[{"targetFile":"unknown","targetMethod":"Database.IsNpgsql","callLine":26,"paramSummary":"none; checks provider"},{"targetFile":"NexusReader.Data.Persistence/AppDbContext.cs","targetMethod":"Authors.FirstOrDefaultAsync","callLine":28,"paramSummary":"predicate: EF.Functions.ILike(a.Name, name); cancellationToken"},{"targetFile":"NexusReader.Data.Persistence/AppDbContext.cs","targetMethod":"Authors.FirstOrDefaultAsync","callLine":32,"paramSummary":"predicate: a.Name.ToLower() == name.ToLower(); cancellationToken"}],"actions":[{"id":"findauthorbynameasync_repository-read_22_0","kind":"repository-read","label":"Reads repository or persistence state","line":22,"detail":"public async Task FindAuthorByNameAsync(string name, CancellationToken cancellationToken = default)","visibility":"secondary-visible","confidence":0.86},{"id":"findauthorbynameasync_branch_26_1","kind":"branch","label":"Evaluates branch condition","line":26,"detail":"if (_context.Database.IsNpgsql())","conditionSummary":"_context.Database.IsNpgsql()","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"branch_26","kind":"branch","label":"Provider-aware search","line":26,"detail":"Chooses EF.Functions.ILike when on Npgsql provider; otherwise performs ToLower() comparison","conditionSummary":"_context.Database.IsNpgsql()","outcomeLabels":["use-postgres-ilike","fallback-to-lowercase"],"visibility":"detail-only","confidence":0.7},{"id":"external-call_28","kind":"external-call","label":"Query Authors DbSet","line":28,"detail":"Executes FirstOrDefaultAsync against Authors DbSet and returns result","visibility":"detail-only","confidence":0.7},{"id":"findauthorbynameasync_return_28_2","kind":"return","label":"Returns result","line":28,"detail":"return await _context.Authors","visibility":"detail-only","confidence":0.7},{"id":"return_29","kind":"return","label":"returns found Author or null","line":29,"detail":"awaits and returns query result","visibility":"detail-only","confidence":0.7},{"id":"findauthorbynameasync_return_32_3","kind":"return","label":"Returns result","line":32,"detail":"return await _context.Authors","visibility":"detail-only","confidence":0.7}]},{"name":"AddAuthor","line":39,"endLine":39,"signature":"(author: Author) -> void","purpose":"Adds an Author entity to the DbContext change tracker.","calls":[{"targetFile":"NexusReader.Data.Persistence/AppDbContext.cs","targetMethod":"Authors.Add","callLine":39,"paramSummary":"author entity"}],"actions":[{"id":"persistence-write_39","kind":"mapping","label":"Add Author to context","line":39,"detail":"_context.Authors.Add(author) (entity tracked; requires SaveChangesAsync)","visibility":"detail-only","confidence":0.7},{"id":"addauthor_repository-write_39_0","kind":"repository-write","label":"Writes repository or persistence state","line":39,"detail":"public void AddAuthor(Author author) => _context.Authors.Add(author);","visibility":"secondary-visible","confidence":0.88}]},{"name":"AddEbook","line":42,"endLine":47,"signature":"(ebook: Ebook) -> void","purpose":"Prepares and adds an Ebook entity to the DbContext: marks it as not ready for reading and attaches it to the Ebooks DbSet.","calls":[{"targetFile":"self","targetMethod":"setter: Ebook.IsReadyForReading","callLine":45,"paramSummary":"sets IsReadyForReading = false on passed ebook instance"},{"targetFile":"NexusReader.Data.Persistence/AppDbContext.cs","targetMethod":"Ebooks.Add","callLine":46,"paramSummary":"ebook entity"}],"actions":[{"id":"state-mutation_45","kind":"mapping","label":"mark ebook not ready","line":45,"detail":"ebook.IsReadyForReading = false","visibility":"detail-only","confidence":0.7},{"id":"persistence-write_46","kind":"mapping","label":"Add Ebook to context","line":46,"detail":"_context.Ebooks.Add(ebook) (entity tracked; requires SaveChangesAsync)","visibility":"detail-only","confidence":0.7},{"id":"addebook_repository-write_46_0","kind":"repository-write","label":"Writes repository or persistence state","line":46,"detail":"_context.Ebooks.Add(ebook);","visibility":"secondary-visible","confidence":0.88}]},{"name":"SaveChangesAsync","line":50,"endLine":51,"signature":"(cancellationToken: CancellationToken = default) -> Task","purpose":"Persists tracked changes in the AppDbContext to the database asynchronously.","calls":[{"targetFile":"NexusReader.Data.Persistence/AppDbContext.cs","targetMethod":"SaveChangesAsync","callLine":51,"paramSummary":"cancellationToken"}],"actions":[{"id":"persistence-commit_51","kind":"mapping","label":"Commit tracked changes","line":51,"detail":"Returns number of state entries written to database","visibility":"detail-only","confidence":0.7},{"id":"return_51","kind":"return","label":"returns Task","line":51,"detail":"for caller to await","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"EbookRepository","kind":"model","line":12,"purpose":"Concrete EF Core repository implementing IEbookRepository to manage Author and Ebook entities via AppDbContext.","fields":[{"name":"_context","type":"AppDbContext","required":true,"line":14,"description":"EF Core DbContext used for queries and persistence operations"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Application.Abstractions.Persistence/IEbookRepository.cs","NexusReader.Data.Persistence/AppDbContext.cs","NexusReader.Domain.Entities/Author.cs","NexusReader.Domain.Entities/Ebook.cs","Microsoft.EntityFrameworkCore (EF Core)"],"patterns":["Repository","EF Core DbContext/UnitOfWork (implicit via SaveChangesAsync)"],"domainConcepts":["Author","Ebook"],"keyDetails":"Provider-aware name search using EF.Functions.ILike when on Npgsql; AddEbook explicitly sets IsReadyForReading = false before adding; persistence requires SaveChangesAsync to commit changes.","orchestrationMethods":[{"name":"FindAuthorByNameAsync","line":22,"confidence":0.98,"reason":"Coordinates 3 downstream calls with 4 architectural actions.","actionKinds":["repository-read","branch","external-call","return"],"evidencePaths":["NexusReader.Infrastructure/Persistence/EbookRepository.cs","unknown","NexusReader.Data.Persistence/AppDbContext.cs","NexusReader.Data.Persistence/AppDbContext.cs"]},{"name":"AddEbook","line":42,"confidence":0.73,"reason":"Coordinates 2 downstream calls with 1 architectural actions.","actionKinds":["mapping","repository-write"],"evidencePaths":["NexusReader.Infrastructure/Persistence/EbookRepository.cs","self","NexusReader.Data.Persistence/AppDbContext.cs"]},{"name":"AddAuthor","line":39,"confidence":0.65,"reason":"Contains 1 architectural actions relevant to business execution.","actionKinds":["mapping","repository-write"],"evidencePaths":["NexusReader.Infrastructure/Persistence/EbookRepository.cs","NexusReader.Data.Persistence/AppDbContext.cs"]}],"typedContracts":[{"name":"EbookRepository","kind":"model","line":12,"fieldCount":1,"evidencePaths":["NexusReader.Infrastructure/Persistence/EbookRepository.cs"]}],"persistenceInteractions":[{"methodName":"FindAuthorByNameAsync","line":22,"kind":"persistence-read","detail":"public async Task FindAuthorByNameAsync(string name, CancellationToken cancellationToken = default)","evidencePaths":["NexusReader.Infrastructure/Persistence/EbookRepository.cs"]},{"methodName":"AddAuthor","line":39,"kind":"persistence-write","detail":"public void AddAuthor(Author author) => _context.Authors.Add(author);","evidencePaths":["NexusReader.Infrastructure/Persistence/EbookRepository.cs"]},{"methodName":"AddEbook","line":46,"kind":"persistence-write","detail":"_context.Ebooks.Add(ebook);","evidencePaths":["NexusReader.Infrastructure/Persistence/EbookRepository.cs"]}],"externalInteractions":[{"methodName":"FindAuthorByNameAsync","line":28,"kind":"external-call","detail":"Executes FirstOrDefaultAsync against Authors DbSet and returns result","evidencePaths":["NexusReader.Infrastructure/Persistence/EbookRepository.cs"]}],"evidenceAnchors":[{"kind":"orchestration-method","label":"FindAuthorByNameAsync","line":22,"summary":"Coordinates 3 downstream calls with 4 architectural actions.","confidence":0.98,"evidencePaths":["NexusReader.Infrastructure/Persistence/EbookRepository.cs","unknown","NexusReader.Data.Persistence/AppDbContext.cs","NexusReader.Data.Persistence/AppDbContext.cs"]},{"kind":"orchestration-method","label":"AddEbook","line":42,"summary":"Coordinates 2 downstream calls with 1 architectural actions.","confidence":0.73,"evidencePaths":["NexusReader.Infrastructure/Persistence/EbookRepository.cs","self","NexusReader.Data.Persistence/AppDbContext.cs"]},{"kind":"orchestration-method","label":"AddAuthor","line":39,"summary":"Contains 1 architectural actions relevant to business execution.","confidence":0.65,"evidencePaths":["NexusReader.Infrastructure/Persistence/EbookRepository.cs","NexusReader.Data.Persistence/AppDbContext.cs"]},{"kind":"typed-contract","label":"EbookRepository","line":12,"summary":"model with 1 fields.","confidence":0.8,"evidencePaths":["NexusReader.Infrastructure/Persistence/EbookRepository.cs"]},{"kind":"persistence","label":"FindAuthorByNameAsync","line":22,"summary":"public async Task FindAuthorByNameAsync(string name, CancellationToken cancellationToken = default)","confidence":0.82,"evidencePaths":["NexusReader.Infrastructure/Persistence/EbookRepository.cs"]},{"kind":"persistence","label":"AddAuthor","line":39,"summary":"public void AddAuthor(Author author) => _context.Authors.Add(author);","confidence":0.82,"evidencePaths":["NexusReader.Infrastructure/Persistence/EbookRepository.cs"]},{"kind":"persistence","label":"AddEbook","line":46,"summary":"_context.Ebooks.Add(ebook);","confidence":0.82,"evidencePaths":["NexusReader.Infrastructure/Persistence/EbookRepository.cs"]},{"kind":"external-call","label":"FindAuthorByNameAsync","line":28,"summary":"Executes FirstOrDefaultAsync against Authors DbSet and returns result","confidence":0.8,"evidencePaths":["NexusReader.Infrastructure/Persistence/EbookRepository.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Infrastructure__RealTime__SignalRSyncBroadcaster.cs.json b/src/.documentation/cache/summaries/NexusReader.Infrastructure__RealTime__SignalRSyncBroadcaster.cs.json new file mode 100644 index 0000000..11b5613 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Infrastructure__RealTime__SignalRSyncBroadcaster.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs","purpose":"Implements a SignalR-backed ISyncBroadcaster to push sync/progress updates (general progress and ingestion progress) to all connected devices of a user via HubContext.","classification":{"role":"integration-client","layer":"infrastructure","confidence":0.9,"evidence":["Implements ISyncBroadcaster (NexusReader.Application.Abstractions.Messaging)","Uses IHubContext (Microsoft.AspNetCore.SignalR) to send updates","Namespace: NexusReader.Infrastructure.RealTime"]},"className":"SignalRSyncBroadcaster","methods":[{"name":"SignalRSyncBroadcaster","line":15,"endLine":18,"signature":"(hubContext: IHubContext) -> ctor","purpose":"Constructs broadcaster and stores HubContext for sending SignalR messages.","calls":[],"actions":[{"id":"field-assignment_17","kind":"mapping","label":"Stores hub context","line":17,"detail":"_hubContext = hubContext","visibility":"detail-only","confidence":0.7}]},{"name":"BroadcastProgressAsync","line":21,"endLine":46,"signature":"(userId: string, pageId: string, timestamp: DateTime, excludedConnectionId: string?, cancellationToken: CancellationToken) -> Task","purpose":"Broadcasts a 'ProgressUpdated' message (pageId + timestamp) to all connections for a given user; attempts to consider an excluded connection id but ultimately uses Clients.User(userId).","calls":[],"actions":[{"id":"guard-clause_30","kind":"guard-clause","label":"Check excludedConnectionId","line":30,"detail":"Different branches exist but both branches call Clients.User(userId).SendAsync(...) due to HubContext limitations","conditionSummary":"!string.IsNullOrEmpty(excludedConnectionId)","outcomeLabels":["branch-true: attempt comment & send","branch-false: send"],"visibility":"detail-only","confidence":0.7},{"id":"broadcastprogressasync_branch_30_0","kind":"branch","label":"Evaluates branch condition","line":30,"detail":"if (!string.IsNullOrEmpty(excludedConnectionId))","conditionSummary":"!string.IsNullOrEmpty(excludedConnectionId)","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"external-call_32","kind":"external-call","label":"SignalR send ProgressUpdated (branch true)","line":32,"detail":"Calls _hubContext.Clients.User(userId).SendAsync(\"ProgressUpdated\", pageId, timestamp, cancellationToken: cancellationToken)","visibility":"detail-only","confidence":0.7},{"id":"broadcastprogressasync_external-call_34_1","kind":"external-call","label":"Calls external dependency","line":34,"detail":".SendAsync(\"ProgressUpdated\", pageId, timestamp, cancellationToken: cancellationToken);","visibility":"secondary-visible","confidence":0.82},{"id":"note_36","kind":"mapping","label":"Exclusion limitation","line":36,"detail":"Comment notes HubContext doesn't support 'Except' when using .User(userId) from outside the Hub without custom IUserIdProvider; groups would be required for strict exclusion","visibility":"detail-only","confidence":0.7},{"id":"broadcastprogressasync_fallback_40_2","kind":"fallback","label":"Falls back to alternate path","line":40,"detail":"else","outcomeLabels":["fallback"],"visibility":"primary-visible","confidence":0.84},{"id":"external-call_42","kind":"external-call","label":"SignalR send ProgressUpdated (branch false)","line":42,"detail":"Calls _hubContext.Clients.User(userId).SendAsync(\"ProgressUpdated\", pageId, timestamp, cancellationToken: cancellationToken)","visibility":"detail-only","confidence":0.7},{"id":"broadcastprogressasync_external-call_44_3","kind":"external-call","label":"Calls external dependency","line":44,"detail":".SendAsync(\"ProgressUpdated\", pageId, timestamp, cancellationToken: cancellationToken);","visibility":"secondary-visible","confidence":0.82}]},{"name":"BroadcastIngestionProgressAsync","line":49,"endLine":60,"signature":"(userId: string, message: string, progress: double, cancellationToken: CancellationToken) -> Task","purpose":"Sends ingestion-specific progress/status updates (message + progress float 0.0-1.0) to a user's connected clients.","calls":[],"actions":[{"id":"comment_55","kind":"mapping","label":"Purpose comment","line":55,"detail":"Pushes ingestion status (e.g., \"Parsing chapters...\") and progress (0.0-1.0) to user's active session components","visibility":"detail-only","confidence":0.7},{"id":"external-call_57","kind":"external-call","label":"SignalR send IngestionProgress","line":57,"detail":"Calls _hubContext.Clients.User(userId).SendAsync(\"IngestionProgress\", message, progress, cancellationToken: cancellationToken)","visibility":"detail-only","confidence":0.7},{"id":"broadcastingestionprogressasync_external-call_59_0","kind":"external-call","label":"Calls external dependency","line":59,"detail":".SendAsync(\"IngestionProgress\", message, progress, cancellationToken: cancellationToken);","visibility":"secondary-visible","confidence":0.82}]}],"types":[{"name":"SignalRSyncBroadcaster","kind":"model","line":11,"purpose":"Concrete SignalR-backed implementation of ISyncBroadcaster that uses HubContext to publish real-time updates to user sessions.","fields":[{"name":"_hubContext","type":"IHubContext","required":true,"line":13,"description":"SignalR hub context used to target Clients.User(userId).SendAsync(...)"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Application.Abstractions.Messaging (ISyncBroadcaster)","NexusReader.Infrastructure.RealTime.SyncHub (SyncHub type)","Microsoft.AspNetCore.SignalR (IHubContext)"],"patterns":["SignalR broadcaster","Real-time push / integration-client"],"domainConcepts":["Sync","Progress","Ingestion","User sessions / connected devices"],"keyDetails":"BroadcastProgressAsync contains a branch attempting to respect an excludedConnectionId but both branches call Clients.User(userId).SendAsync due to HubContext limitations; strict per-connection exclusion would require groups or a custom IUserIdProvider.","orchestrationMethods":[{"name":"BroadcastProgressAsync","line":21,"confidence":0.98,"reason":"Contains 6 architectural actions relevant to business execution.","actionKinds":["guard-clause","branch","external-call","mapping","fallback"],"evidencePaths":["NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs"]},{"name":"BroadcastIngestionProgressAsync","line":49,"confidence":0.69,"reason":"Contains 2 architectural actions relevant to business execution.","actionKinds":["mapping","external-call"],"evidencePaths":["NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs"]}],"typedContracts":[{"name":"SignalRSyncBroadcaster","kind":"model","line":11,"fieldCount":1,"evidencePaths":["NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs"]}],"persistenceInteractions":[],"externalInteractions":[{"methodName":"BroadcastProgressAsync","line":32,"kind":"external-call","detail":"Calls _hubContext.Clients.User(userId).SendAsync(\"ProgressUpdated\", pageId, timestamp, cancellationToken: cancellationToken)","evidencePaths":["NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs"]},{"methodName":"BroadcastProgressAsync","line":34,"kind":"external-call","detail":".SendAsync(\"ProgressUpdated\", pageId, timestamp, cancellationToken: cancellationToken);","evidencePaths":["NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs"]},{"methodName":"BroadcastProgressAsync","line":42,"kind":"external-call","detail":"Calls _hubContext.Clients.User(userId).SendAsync(\"ProgressUpdated\", pageId, timestamp, cancellationToken: cancellationToken)","evidencePaths":["NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs"]},{"methodName":"BroadcastProgressAsync","line":44,"kind":"external-call","detail":".SendAsync(\"ProgressUpdated\", pageId, timestamp, cancellationToken: cancellationToken);","evidencePaths":["NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs"]},{"methodName":"BroadcastIngestionProgressAsync","line":57,"kind":"external-call","detail":"Calls _hubContext.Clients.User(userId).SendAsync(\"IngestionProgress\", message, progress, cancellationToken: cancellationToken)","evidencePaths":["NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs"]},{"methodName":"BroadcastIngestionProgressAsync","line":59,"kind":"external-call","detail":".SendAsync(\"IngestionProgress\", message, progress, cancellationToken: cancellationToken);","evidencePaths":["NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs"]}],"evidenceAnchors":[{"kind":"orchestration-method","label":"BroadcastProgressAsync","line":21,"summary":"Contains 6 architectural actions relevant to business execution.","confidence":0.98,"evidencePaths":["NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs"]},{"kind":"orchestration-method","label":"BroadcastIngestionProgressAsync","line":49,"summary":"Contains 2 architectural actions relevant to business execution.","confidence":0.69,"evidencePaths":["NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs"]},{"kind":"typed-contract","label":"SignalRSyncBroadcaster","line":11,"summary":"model with 1 fields.","confidence":0.8,"evidencePaths":["NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs"]},{"kind":"external-call","label":"BroadcastProgressAsync","line":32,"summary":"Calls _hubContext.Clients.User(userId).SendAsync(\"ProgressUpdated\", pageId, timestamp, cancellationToken: cancellationToken)","confidence":0.8,"evidencePaths":["NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs"]},{"kind":"external-call","label":"BroadcastProgressAsync","line":34,"summary":".SendAsync(\"ProgressUpdated\", pageId, timestamp, cancellationToken: cancellationToken);","confidence":0.8,"evidencePaths":["NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs"]},{"kind":"external-call","label":"BroadcastProgressAsync","line":42,"summary":"Calls _hubContext.Clients.User(userId).SendAsync(\"ProgressUpdated\", pageId, timestamp, cancellationToken: cancellationToken)","confidence":0.8,"evidencePaths":["NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Infrastructure__RealTime__SyncHub.cs.json b/src/.documentation/cache/summaries/NexusReader.Infrastructure__RealTime__SyncHub.cs.json new file mode 100644 index 0000000..763df35 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Infrastructure__RealTime__SyncHub.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Infrastructure/RealTime/SyncHub.cs","purpose":"Defines a SignalR Hub (SyncHub) that handles real-time reading-progress updates and per-user connection grouping; it forwards progress updates into the application via MediatR.","classification":{"role":"endpoint","layer":"infrastructure","confidence":0.9,"evidence":["Command pattern","class derives from Microsoft.AspNetCore.SignalR.Hub","namespace NexusReader.Infrastructure.RealTime","[Authorize] attribute applied to the hub"]},"className":"SyncHub","methods":[{"name":"SyncHub","line":14,"endLine":17,"signature":"(mediator: IMediator) -> void","purpose":"Constructor that receives and stores an IMediator instance for dispatching application commands.","calls":[],"actions":[{"id":"dependency-injection_14","kind":"mapping","label":"Depends on IMediator","line":14,"detail":"Constructor injection of MediatR mediator","visibility":"detail-only","confidence":0.7},{"id":"assignment_16","kind":"mapping","label":"Stores mediator","line":16,"detail":"_mediator = mediator","visibility":"detail-only","confidence":0.7}]},{"name":"UpdateProgress","line":19,"endLine":26,"signature":"(pageId: string, ebookId: Guid, progress: double, chapterTitle: string? , chapterIndex: int) -> Task","purpose":"Receives client progress updates, obtains the calling user id and forwards an UpdateReadingProgressCommand via MediatR when user is present.","calls":[{"targetFile":"NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs","targetMethod":"UpdateReadingProgressCommand (ctor)","callLine":24,"paramSummary":"new UpdateReadingProgressCommand(pageId, userId, ebookId, progress, chapterTitle, chapterIndex, Context.ConnectionId)"}],"actions":[{"id":"updateprogress_repository-read_21_0","kind":"repository-read","label":"Reads repository or persistence state","line":21,"detail":"var userId = Context.User?.FindFirst(ClaimTypes.NameIdentifier)?.Value;","visibility":"secondary-visible","confidence":0.86},{"id":"external-call_21","kind":"external-call","label":"Reads user id from connection context","line":21,"detail":"Context.User?.FindFirst(ClaimTypes.NameIdentifier)?.Value","visibility":"detail-only","confidence":0.7},{"id":"guard-clause_21","kind":"guard-clause","label":"Requires authenticated user id","line":21,"detail":"if (userId != null) await _mediator.Send(new UpdateReadingProgressCommand(...));","conditionSummary":"userId != null","outcomeLabels":["forward command","no-op"],"visibility":"detail-only","confidence":0.7},{"id":"updateprogress_branch_22_1","kind":"branch","label":"Evaluates branch condition","line":22,"detail":"if (userId != null)","conditionSummary":"userId != null","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"external-call_24","kind":"external-call","label":"Dispatches command to application layer","line":24,"detail":"_mediator.Send(...) (MediatR)","visibility":"detail-only","confidence":0.7},{"id":"data-flow_24","kind":"mapping","label":"Includes connection id in command","line":24,"detail":"Context.ConnectionId passed to command for correlation/notifications","visibility":"detail-only","confidence":0.7},{"id":"updateprogress_repository-read_24_2","kind":"repository-read","label":"Reads repository or persistence state","line":24,"detail":"await _mediator.Send(new UpdateReadingProgressCommand(pageId, userId, ebookId, progress, chapterTitle, chapterIndex, Context.ConnectionId));","visibility":"secondary-visible","confidence":0.86}]},{"name":"OnConnectedAsync","line":28,"endLine":36,"signature":"() -> Task","purpose":"When a client connects, adds their connection to a per-user SignalR group (User_{userId}) and calls base connection logic.","calls":[],"actions":[{"id":"external-call_30","kind":"external-call","label":"Reads Context.UserIdentifier","line":30,"detail":"var userId = Context.UserIdentifier","visibility":"detail-only","confidence":0.7},{"id":"onconnectedasync_repository-read_30_0","kind":"repository-read","label":"Reads repository or persistence state","line":30,"detail":"var userId = Context.UserIdentifier;","visibility":"secondary-visible","confidence":0.86},{"id":"onconnectedasync_branch_31_1","kind":"branch","label":"Evaluates branch condition","line":31,"detail":"if (!string.IsNullOrEmpty(userId))","conditionSummary":"!string.IsNullOrEmpty(userId)","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"guard-clause_31","kind":"guard-clause","label":"Only add to group if userId present","line":31,"detail":"if (!string.IsNullOrEmpty(userId)) await Groups.AddToGroupAsync(Context.ConnectionId, $\"User_{userId}\");","conditionSummary":"!string.IsNullOrEmpty(userId)","outcomeLabels":["AddToGroup","skip"],"visibility":"detail-only","confidence":0.7},{"id":"external-call_33","kind":"external-call","label":"Adds connection to per-user group","line":33,"detail":"Groups.AddToGroupAsync(Context.ConnectionId, $\"User_{userId}\") — framework SignalR call","visibility":"detail-only","confidence":0.7},{"id":"onconnectedasync_repository-read_33_2","kind":"repository-read","label":"Reads repository or persistence state","line":33,"detail":"await Groups.AddToGroupAsync(Context.ConnectionId, $\"User_{userId}\");","visibility":"secondary-visible","confidence":0.86},{"id":"external-call_35","kind":"external-call","label":"Invokes base OnConnectedAsync","line":35,"detail":"await base.OnConnectedAsync()","visibility":"detail-only","confidence":0.7}]},{"name":"OnDisconnectedAsync","line":38,"endLine":46,"signature":"(exception: Exception?) -> Task","purpose":"When a client disconnects, removes their connection from the per-user SignalR group and invokes base disconnect logic.","calls":[],"actions":[{"id":"external-call_40","kind":"external-call","label":"Reads Context.UserIdentifier","line":40,"detail":"var userId = Context.UserIdentifier","visibility":"detail-only","confidence":0.7},{"id":"ondisconnectedasync_repository-read_40_0","kind":"repository-read","label":"Reads repository or persistence state","line":40,"detail":"var userId = Context.UserIdentifier;","visibility":"secondary-visible","confidence":0.86},{"id":"ondisconnectedasync_branch_41_1","kind":"branch","label":"Evaluates branch condition","line":41,"detail":"if (!string.IsNullOrEmpty(userId))","conditionSummary":"!string.IsNullOrEmpty(userId)","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"guard-clause_41","kind":"guard-clause","label":"Only remove from group if userId present","line":41,"detail":"if (!string.IsNullOrEmpty(userId)) await Groups.RemoveFromGroupAsync(Context.ConnectionId, $\"User_{userId}\");","conditionSummary":"!string.IsNullOrEmpty(userId)","outcomeLabels":["RemoveFromGroup","skip"],"visibility":"detail-only","confidence":0.7},{"id":"ondisconnectedasync_repository-read_43_2","kind":"repository-read","label":"Reads repository or persistence state","line":43,"detail":"await Groups.RemoveFromGroupAsync(Context.ConnectionId, $\"User_{userId}\");","visibility":"secondary-visible","confidence":0.86},{"id":"external-call_43","kind":"external-call","label":"Removes connection from per-user group","line":43,"detail":"Groups.RemoveFromGroupAsync(Context.ConnectionId, $\"User_{userId}\") — framework SignalR call","visibility":"detail-only","confidence":0.7},{"id":"external-call_45","kind":"external-call","label":"Invokes base OnDisconnectedAsync","line":45,"detail":"await base.OnDisconnectedAsync(exception)","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"SyncHub","kind":"model","line":10,"purpose":"SignalR hub that mediates client realtime interactions for syncing reading progress and manages user groups.","fields":[{"name":"_mediator","type":"IMediator","required":true,"line":12,"description":"MediatR mediator used to send application commands (e.g., UpdateReadingProgressCommand)."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs"],"patterns":["Mediator","SignalR Hub","Per-user group (User_{userId})"],"domainConcepts":["ReadingProgress","User","Ebook","Connection/Session"],"keyDetails":"Class is [Authorize] protected; uses Context.UserIdentifier and ClaimTypes.NameIdentifier to map connections to user-specific groups and forwards updates to the application layer via MediatR command UpdateReadingProgressCommand, including Context.ConnectionId for correlation.","orchestrationMethods":[{"name":"UpdateProgress","line":19,"confidence":0.98,"reason":"Contains 5 architectural actions relevant to business execution.","actionKinds":["repository-read","external-call","guard-clause","branch","mapping"],"evidencePaths":["NexusReader.Infrastructure/RealTime/SyncHub.cs","NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs"]},{"name":"OnConnectedAsync","line":28,"confidence":0.98,"reason":"Contains 6 architectural actions relevant to business execution.","actionKinds":["external-call","repository-read","branch","guard-clause"],"evidencePaths":["NexusReader.Infrastructure/RealTime/SyncHub.cs"]},{"name":"OnDisconnectedAsync","line":38,"confidence":0.98,"reason":"Contains 6 architectural actions relevant to business execution.","actionKinds":["external-call","repository-read","branch","guard-clause"],"evidencePaths":["NexusReader.Infrastructure/RealTime/SyncHub.cs"]}],"typedContracts":[{"name":"SyncHub","kind":"model","line":10,"fieldCount":1,"evidencePaths":["NexusReader.Infrastructure/RealTime/SyncHub.cs"]}],"persistenceInteractions":[{"methodName":"UpdateProgress","line":21,"kind":"persistence-read","detail":"var userId = Context.User?.FindFirst(ClaimTypes.NameIdentifier)?.Value;","evidencePaths":["NexusReader.Infrastructure/RealTime/SyncHub.cs"]},{"methodName":"UpdateProgress","line":24,"kind":"persistence-read","detail":"await _mediator.Send(new UpdateReadingProgressCommand(pageId, userId, ebookId, progress, chapterTitle, chapterIndex, Context.ConnectionId));","evidencePaths":["NexusReader.Infrastructure/RealTime/SyncHub.cs"]},{"methodName":"OnConnectedAsync","line":30,"kind":"persistence-read","detail":"var userId = Context.UserIdentifier;","evidencePaths":["NexusReader.Infrastructure/RealTime/SyncHub.cs"]},{"methodName":"OnConnectedAsync","line":33,"kind":"persistence-read","detail":"await Groups.AddToGroupAsync(Context.ConnectionId, $\"User_{userId}\");","evidencePaths":["NexusReader.Infrastructure/RealTime/SyncHub.cs"]},{"methodName":"OnDisconnectedAsync","line":40,"kind":"persistence-read","detail":"var userId = Context.UserIdentifier;","evidencePaths":["NexusReader.Infrastructure/RealTime/SyncHub.cs"]},{"methodName":"OnDisconnectedAsync","line":43,"kind":"persistence-read","detail":"await Groups.RemoveFromGroupAsync(Context.ConnectionId, $\"User_{userId}\");","evidencePaths":["NexusReader.Infrastructure/RealTime/SyncHub.cs"]}],"externalInteractions":[{"methodName":"UpdateProgress","line":21,"kind":"external-call","detail":"Context.User?.FindFirst(ClaimTypes.NameIdentifier)?.Value","evidencePaths":["NexusReader.Infrastructure/RealTime/SyncHub.cs"]},{"methodName":"UpdateProgress","line":24,"kind":"external-call","detail":"_mediator.Send(...) (MediatR)","evidencePaths":["NexusReader.Infrastructure/RealTime/SyncHub.cs"]},{"methodName":"OnConnectedAsync","line":30,"kind":"external-call","detail":"var userId = Context.UserIdentifier","evidencePaths":["NexusReader.Infrastructure/RealTime/SyncHub.cs"]},{"methodName":"OnConnectedAsync","line":33,"kind":"external-call","detail":"Groups.AddToGroupAsync(Context.ConnectionId, $\"User_{userId}\") — framework SignalR call","evidencePaths":["NexusReader.Infrastructure/RealTime/SyncHub.cs"]},{"methodName":"OnConnectedAsync","line":35,"kind":"external-call","detail":"await base.OnConnectedAsync()","evidencePaths":["NexusReader.Infrastructure/RealTime/SyncHub.cs"]},{"methodName":"OnDisconnectedAsync","line":40,"kind":"external-call","detail":"var userId = Context.UserIdentifier","evidencePaths":["NexusReader.Infrastructure/RealTime/SyncHub.cs"]},{"methodName":"OnDisconnectedAsync","line":43,"kind":"external-call","detail":"Groups.RemoveFromGroupAsync(Context.ConnectionId, $\"User_{userId}\") — framework SignalR call","evidencePaths":["NexusReader.Infrastructure/RealTime/SyncHub.cs"]},{"methodName":"OnDisconnectedAsync","line":45,"kind":"external-call","detail":"await base.OnDisconnectedAsync(exception)","evidencePaths":["NexusReader.Infrastructure/RealTime/SyncHub.cs"]}],"evidenceAnchors":[{"kind":"orchestration-method","label":"UpdateProgress","line":19,"summary":"Contains 5 architectural actions relevant to business execution.","confidence":0.98,"evidencePaths":["NexusReader.Infrastructure/RealTime/SyncHub.cs","NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs"]},{"kind":"orchestration-method","label":"OnConnectedAsync","line":28,"summary":"Contains 6 architectural actions relevant to business execution.","confidence":0.98,"evidencePaths":["NexusReader.Infrastructure/RealTime/SyncHub.cs"]},{"kind":"orchestration-method","label":"OnDisconnectedAsync","line":38,"summary":"Contains 6 architectural actions relevant to business execution.","confidence":0.98,"evidencePaths":["NexusReader.Infrastructure/RealTime/SyncHub.cs"]},{"kind":"typed-contract","label":"SyncHub","line":10,"summary":"model with 1 fields.","confidence":0.8,"evidencePaths":["NexusReader.Infrastructure/RealTime/SyncHub.cs"]},{"kind":"persistence","label":"UpdateProgress","line":21,"summary":"var userId = Context.User?.FindFirst(ClaimTypes.NameIdentifier)?.Value;","confidence":0.82,"evidencePaths":["NexusReader.Infrastructure/RealTime/SyncHub.cs"]},{"kind":"persistence","label":"UpdateProgress","line":24,"summary":"await _mediator.Send(new UpdateReadingProgressCommand(pageId, userId, ebookId, progress, chapterTitle, chapterIndex, Context.ConnectionId));","confidence":0.82,"evidencePaths":["NexusReader.Infrastructure/RealTime/SyncHub.cs"]},{"kind":"persistence","label":"OnConnectedAsync","line":30,"summary":"var userId = Context.UserIdentifier;","confidence":0.82,"evidencePaths":["NexusReader.Infrastructure/RealTime/SyncHub.cs"]},{"kind":"external-call","label":"UpdateProgress","line":21,"summary":"Context.User?.FindFirst(ClaimTypes.NameIdentifier)?.Value","confidence":0.8,"evidencePaths":["NexusReader.Infrastructure/RealTime/SyncHub.cs"]},{"kind":"external-call","label":"UpdateProgress","line":24,"summary":"_mediator.Send(...) (MediatR)","confidence":0.8,"evidencePaths":["NexusReader.Infrastructure/RealTime/SyncHub.cs"]},{"kind":"external-call","label":"OnConnectedAsync","line":30,"summary":"var userId = Context.UserIdentifier","confidence":0.8,"evidencePaths":["NexusReader.Infrastructure/RealTime/SyncHub.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Infrastructure__Services__BillingService.cs.json b/src/.documentation/cache/summaries/NexusReader.Infrastructure__Services__BillingService.cs.json new file mode 100644 index 0000000..2effdb9 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Infrastructure__Services__BillingService.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Infrastructure/Services/BillingService.cs","purpose":"Infrastructure billing service that reacts to Stripe subscription events, maps Stripe product IDs to internal subscription plans and updates NexusUser records accordingly.","classification":{"role":"service","layer":"infrastructure","confidence":0.9,"evidence":["Service naming pattern","Application/service path heuristic","Class name BillingService in NexusReader.Infrastructure.Services","Implements IBillingService and uses IDbContextFactory, UserManager, StripeSettings"]},"className":"BillingService","methods":[{"name":"BillingService","line":20,"endLine":30,"signature":"(dbContextFactory: IDbContextFactory, userManager: UserManager, stripeSettings: IOptions, logger: ILogger) -> BillingService","purpose":"Constructor; captures and stores DI dependencies (db context factory, user manager, stripe settings, logger).","calls":[],"actions":[{"id":"assignment_26","kind":"mapping","label":"Store injected dependencies","line":26,"detail":"_dbContextFactory, _userManager, _stripeSettings, _logger assigned from ctor params","visibility":"detail-only","confidence":0.7}]},{"name":"HandleSubscriptionUpdatedAsync","line":32,"endLine":84,"signature":"(customerEmail: string, stripeProductId: string) -> Task","purpose":"Handle a subscription updated event: resolve user by email, map Stripe product ID to an internal plan and token limits, persist the plan change to the user profile, and return success/failure result.","calls":[{"targetFile":"unknown","targetMethod":"FindByEmailAsync","callLine":36,"paramSummary":"customerEmail"},{"targetFile":"unknown","targetMethod":"CreateDbContextAsync","callLine":61,"paramSummary":"no args (creates AppDbContext)"},{"targetFile":"NexusReader.Data.Persistence/AppDbContext","targetMethod":"SubscriptionPlans.FirstOrDefaultAsync","callLine":62,"paramSummary":"p => p.PlanName == targetPlanName"},{"targetFile":"unknown","targetMethod":"UpdateAsync","callLine":69,"paramSummary":"user (updated SubscriptionPlanId, AITokenLimit)"}],"actions":[{"id":"try-catch_34","kind":"mapping","label":"Wrap update flow in try/catch","line":34,"detail":"Catches Exception, logs and returns Result.Fail with caused error","visibility":"detail-only","confidence":0.7},{"id":"handlesubscriptionupdatedasync_repository-read_36_0","kind":"repository-read","label":"Reads repository or persistence state","line":36,"detail":"var user = await _userManager.FindByEmailAsync(customerEmail);","visibility":"secondary-visible","confidence":0.86},{"id":"external-call_36","kind":"external-call","label":"Resolve user by email","line":36,"detail":"Calls UserManager.FindByEmailAsync(customerEmail)","visibility":"detail-only","confidence":0.7},{"id":"handlesubscriptionupdatedasync_branch_37_1","kind":"branch","label":"Evaluates branch condition","line":37,"detail":"if (user == null)","conditionSummary":"user == null","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"guard-clause_37","kind":"guard-clause","label":"Rejects missing user","line":37,"detail":"Logs warning and returns Result.Fail if user not found","conditionSummary":"user == null","outcomeLabels":["log-warning","return-fail"],"visibility":"detail-only","confidence":0.7},{"id":"handlesubscriptionupdatedasync_log_39_2","kind":"log","label":"Logs runtime state","line":39,"detail":"_logger.LogWarning(\"Attempted to update subscription for non-existent user: {Email}\", customerEmail);","visibility":"secondary-visible","confidence":0.92},{"id":"handlesubscriptionupdatedasync_return_40_3","kind":"return","label":"Returns result","line":40,"detail":"return Result.Fail($\"User {customerEmail} not found.\");","visibility":"detail-only","confidence":0.7},{"id":"handlesubscriptionupdatedasync_branch_46_4","kind":"branch","label":"Evaluates branch condition","line":46,"detail":"if (stripeProductId == _stripeSettings.ProProductId)","conditionSummary":"stripeProductId == _stripeSettings.ProProductId","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"branch_46","kind":"branch","label":"Map Stripe product ID to internal plan and token limits","line":46,"detail":"Checks _stripeSettings.ProProductId, BasicProductId, FreeProductId and sets targetPlanName/tokenLimit accordingly","conditionSummary":"stripeProductId equals configured Pro/Basic/Free IDs","outcomeLabels":["set Pro plan (tokenLimit=50000)","set Basic plan (tokenLimit=10000)","default Free plan (tokenLimit=1000)","unrecognized -> fallback to Free with warning"],"visibility":"detail-only","confidence":0.7},{"id":"handlesubscriptionupdatedasync_branch_51_5","kind":"branch","label":"Evaluates branch condition","line":51,"detail":"else if (stripeProductId == _stripeSettings.BasicProductId)","conditionSummary":"stripeProductId == _stripeSettings.BasicProductId","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"handlesubscriptionupdatedasync_fallback_51_6","kind":"fallback","label":"Falls back to alternate path","line":51,"detail":"else if (stripeProductId == _stripeSettings.BasicProductId)","outcomeLabels":["fallback"],"visibility":"primary-visible","confidence":0.84},{"id":"handlesubscriptionupdatedasync_branch_56_7","kind":"branch","label":"Evaluates branch condition","line":56,"detail":"else if (!string.IsNullOrEmpty(stripeProductId) && stripeProductId != _stripeSettings.FreeProductId)","conditionSummary":"!string.IsNullOrEmpty(stripeProductId) && stripeProductId != _stripeSettings.FreeProductId","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"handlesubscriptionupdatedasync_fallback_56_8","kind":"fallback","label":"Falls back to alternate path","line":56,"detail":"else if (!string.IsNullOrEmpty(stripeProductId) && stripeProductId != _stripeSettings.FreeProductId)","outcomeLabels":["fallback"],"visibility":"primary-visible","confidence":0.84},{"id":"handlesubscriptionupdatedasync_log_58_9","kind":"log","label":"Logs runtime state","line":58,"detail":"_logger.LogWarning(\"Unrecognized Stripe Product ID: {ProductId} for user {Email}. Falling back to Free tier.\", stripeProductId, customerEmail);","visibility":"secondary-visible","confidence":0.92},{"id":"persistence-read_61","kind":"mapping","label":"Lookup subscription plan entity","line":61,"detail":"Creates AppDbContext and queries SubscriptionPlans for targetPlanName","visibility":"detail-only","confidence":0.7},{"id":"handlesubscriptionupdatedasync_branch_63_10","kind":"branch","label":"Evaluates branch condition","line":63,"detail":"if (plan != null)","conditionSummary":"plan != null","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"persistence-write_65","kind":"mapping","label":"Assign plan id and token limit to user entity","line":65,"detail":"Sets user.SubscriptionPlanId and user.AITokenLimit when plan found","visibility":"detail-only","confidence":0.7},{"id":"external-call_69","kind":"external-call","label":"Persist user changes","line":69,"detail":"Calls UserManager.UpdateAsync(user) and checks result.Succeeded","visibility":"detail-only","confidence":0.7},{"id":"handlesubscriptionupdatedasync_branch_70_11","kind":"branch","label":"Evaluates branch condition","line":70,"detail":"if (!result.Succeeded)","conditionSummary":"!result.Succeeded","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"log_72","kind":"log","label":"Log failure updating user","line":72,"detail":"On update failure logs error with collected error descriptions and returns Result.Fail","visibility":"detail-only","confidence":0.7},{"id":"handlesubscriptionupdatedasync_log_72_12","kind":"log","label":"Logs runtime state","line":72,"detail":"_logger.LogError(\"Failed to update user {Email} after subscription change: {Errors}\",","visibility":"secondary-visible","confidence":0.92},{"id":"handlesubscriptionupdatedasync_mapping_73_13","kind":"mapping","label":"Maps data or transforms shape","line":73,"detail":"customerEmail, string.Join(\", \", result.Errors.Select(e => e.Description)));","visibility":"detail-only","confidence":0.74},{"id":"handlesubscriptionupdatedasync_mapping_74_15","kind":"mapping","label":"Maps data or transforms shape","line":74,"detail":"return Result.Fail(result.Errors.Select(e => e.Description).FirstOrDefault() ?? \"Failed to update user profile.\");","visibility":"detail-only","confidence":0.74},{"id":"handlesubscriptionupdatedasync_repository-read_74_14","kind":"repository-read","label":"Reads repository or persistence state","line":74,"detail":"return Result.Fail(result.Errors.Select(e => e.Description).FirstOrDefault() ?? \"Failed to update user profile.\");","visibility":"secondary-visible","confidence":0.86},{"id":"handlesubscriptionupdatedasync_return_74_16","kind":"return","label":"Returns result","line":74,"detail":"return Result.Fail(result.Errors.Select(e => e.Description).FirstOrDefault() ?? \"Failed to update user profile.\");","visibility":"detail-only","confidence":0.7},{"id":"return_77","kind":"return","label":"Return success result","line":77,"detail":"Returns Result.Ok() when update succeeds","visibility":"detail-only","confidence":0.7},{"id":"handlesubscriptionupdatedasync_return_77_17","kind":"return","label":"Returns result","line":77,"detail":"return Result.Ok();","visibility":"detail-only","confidence":0.7},{"id":"log_81","kind":"log","label":"Log unexpected exception","line":81,"detail":"Logs exception and returns Result.Fail with caused error","visibility":"detail-only","confidence":0.7},{"id":"handlesubscriptionupdatedasync_log_81_18","kind":"log","label":"Logs runtime state","line":81,"detail":"_logger.LogError(ex, \"Unexpected error during subscription update for {Email}\", customerEmail);","visibility":"secondary-visible","confidence":0.92},{"id":"handlesubscriptionupdatedasync_return_82_19","kind":"return","label":"Returns result","line":82,"detail":"return Result.Fail(new Error(\"Unexpected error during subscription update.\").CausedBy(ex));","visibility":"detail-only","confidence":0.7}]},{"name":"HandleSubscriptionDeletedAsync","line":86,"endLine":120,"signature":"(customerEmail: string) -> Task","purpose":"Handle a subscription deletion event: set the user's subscription to the Free tier and reset token limits, persist changes and return success/failure.","calls":[{"targetFile":"unknown","targetMethod":"FindByEmailAsync","callLine":90,"paramSummary":"customerEmail"},{"targetFile":"unknown","targetMethod":"CreateDbContextAsync","callLine":97,"paramSummary":"no args (creates AppDbContext)"},{"targetFile":"NexusReader.Data.Persistence/AppDbContext","targetMethod":"SubscriptionPlans.FirstOrDefaultAsync","callLine":98,"paramSummary":"p => p.PlanName == SubscriptionPlan.FreeName"},{"targetFile":"unknown","targetMethod":"UpdateAsync","callLine":105,"paramSummary":"user (reset SubscriptionPlanId, AITokenLimit)"}],"actions":[{"id":"try-catch_88","kind":"mapping","label":"Wrap deletion flow in try/catch","line":88,"detail":"Catches Exception, logs and returns Result.Fail with caused error","visibility":"detail-only","confidence":0.7},{"id":"handlesubscriptiondeletedasync_repository-read_90_0","kind":"repository-read","label":"Reads repository or persistence state","line":90,"detail":"var user = await _userManager.FindByEmailAsync(customerEmail);","visibility":"secondary-visible","confidence":0.86},{"id":"external-call_90","kind":"external-call","label":"Resolve user by email","line":90,"detail":"Calls UserManager.FindByEmailAsync(customerEmail)","visibility":"detail-only","confidence":0.7},{"id":"handlesubscriptiondeletedasync_branch_91_1","kind":"branch","label":"Evaluates branch condition","line":91,"detail":"if (user == null)","conditionSummary":"user == null","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"guard-clause_91","kind":"guard-clause","label":"Rejects missing user","line":91,"detail":"Logs warning and returns Result.Fail if user not found","conditionSummary":"user == null","outcomeLabels":["log-warning","return-fail"],"visibility":"detail-only","confidence":0.7},{"id":"handlesubscriptiondeletedasync_log_93_2","kind":"log","label":"Logs runtime state","line":93,"detail":"_logger.LogWarning(\"Attempted to delete subscription for non-existent user: {Email}\", customerEmail);","visibility":"secondary-visible","confidence":0.92},{"id":"handlesubscriptiondeletedasync_return_94_3","kind":"return","label":"Returns result","line":94,"detail":"return Result.Fail($\"User {customerEmail} not found.\");","visibility":"detail-only","confidence":0.7},{"id":"persistence-read_97","kind":"mapping","label":"Lookup Free subscription plan entity","line":97,"detail":"Creates AppDbContext and queries SubscriptionPlans for Free plan","visibility":"detail-only","confidence":0.7},{"id":"handlesubscriptiondeletedasync_branch_99_4","kind":"branch","label":"Evaluates branch condition","line":99,"detail":"if (freePlan != null)","conditionSummary":"freePlan != null","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"persistence-write_101","kind":"mapping","label":"Assign Free plan id and token limit to user entity","line":101,"detail":"Sets user.SubscriptionPlanId and user.AITokenLimit from freePlan","visibility":"detail-only","confidence":0.7},{"id":"external-call_105","kind":"external-call","label":"Persist user changes","line":105,"detail":"Calls UserManager.UpdateAsync(user) and checks result.Succeeded","visibility":"detail-only","confidence":0.7},{"id":"handlesubscriptiondeletedasync_branch_106_5","kind":"branch","label":"Evaluates branch condition","line":106,"detail":"if (!result.Succeeded)","conditionSummary":"!result.Succeeded","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"log_108","kind":"log","label":"Log failure resetting user to Free tier","line":108,"detail":"On update failure logs error with collected error descriptions and returns Result.Fail","visibility":"detail-only","confidence":0.7},{"id":"handlesubscriptiondeletedasync_log_108_6","kind":"log","label":"Logs runtime state","line":108,"detail":"_logger.LogError(\"Failed to reset user {Email} to Free tier after subscription deletion: {Errors}\",","visibility":"secondary-visible","confidence":0.92},{"id":"handlesubscriptiondeletedasync_mapping_109_7","kind":"mapping","label":"Maps data or transforms shape","line":109,"detail":"customerEmail, string.Join(\", \", result.Errors.Select(e => e.Description)));","visibility":"detail-only","confidence":0.74},{"id":"handlesubscriptiondeletedasync_mapping_110_9","kind":"mapping","label":"Maps data or transforms shape","line":110,"detail":"return Result.Fail(result.Errors.Select(e => e.Description).FirstOrDefault() ?? \"Failed to reset user to free tier.\");","visibility":"detail-only","confidence":0.74},{"id":"handlesubscriptiondeletedasync_repository-read_110_8","kind":"repository-read","label":"Reads repository or persistence state","line":110,"detail":"return Result.Fail(result.Errors.Select(e => e.Description).FirstOrDefault() ?? \"Failed to reset user to free tier.\");","visibility":"secondary-visible","confidence":0.86},{"id":"handlesubscriptiondeletedasync_return_110_10","kind":"return","label":"Returns result","line":110,"detail":"return Result.Fail(result.Errors.Select(e => e.Description).FirstOrDefault() ?? \"Failed to reset user to free tier.\");","visibility":"detail-only","confidence":0.7},{"id":"return_113","kind":"return","label":"Return success result","line":113,"detail":"Returns Result.Ok() when update succeeds","visibility":"detail-only","confidence":0.7},{"id":"handlesubscriptiondeletedasync_return_113_11","kind":"return","label":"Returns result","line":113,"detail":"return Result.Ok();","visibility":"detail-only","confidence":0.7},{"id":"log_117","kind":"log","label":"Log unexpected exception","line":117,"detail":"Logs exception and returns Result.Fail with caused error","visibility":"detail-only","confidence":0.7},{"id":"handlesubscriptiondeletedasync_log_117_12","kind":"log","label":"Logs runtime state","line":117,"detail":"_logger.LogError(ex, \"Unexpected error during subscription deletion for {Email}\", customerEmail);","visibility":"secondary-visible","confidence":0.92},{"id":"handlesubscriptiondeletedasync_return_118_13","kind":"return","label":"Returns result","line":118,"detail":"return Result.Fail(new Error(\"Unexpected error during subscription deletion.\").CausedBy(ex));","visibility":"detail-only","confidence":0.7}]}],"types":[],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Application.Abstractions.Services","NexusReader.Domain.Entities","NexusReader.Infrastructure.Configuration","NexusReader.Data.Persistence"],"patterns":["Service"],"domainConcepts":["SubscriptionPlan","NexusUser","Billing"],"keyDetails":"Handles Stripe product-to-plan mapping and updates user SubscriptionPlanId and AITokenLimit; uses IDbContextFactory to read subscription plan entities and UserManager to persist changes; includes guard clauses, branching for product mapping, persistence reads/writes, and exception handling.","orchestrationMethods":[{"name":"HandleSubscriptionUpdatedAsync","line":32,"confidence":0.98,"reason":"Coordinates 4 downstream calls with 13 architectural actions.","actionKinds":["mapping","repository-read","external-call","branch","guard-clause","log","return","fallback"],"evidencePaths":["NexusReader.Infrastructure/Services/BillingService.cs","unknown","unknown","NexusReader.Data.Persistence/AppDbContext","unknown"]},{"name":"HandleSubscriptionDeletedAsync","line":86,"confidence":0.98,"reason":"Coordinates 4 downstream calls with 7 architectural actions.","actionKinds":["mapping","repository-read","external-call","branch","guard-clause","log","return"],"evidencePaths":["NexusReader.Infrastructure/Services/BillingService.cs","unknown","unknown","NexusReader.Data.Persistence/AppDbContext","unknown"]}],"typedContracts":[],"persistenceInteractions":[{"methodName":"HandleSubscriptionUpdatedAsync","line":36,"kind":"persistence-read","detail":"var user = await _userManager.FindByEmailAsync(customerEmail);","evidencePaths":["NexusReader.Infrastructure/Services/BillingService.cs"]},{"methodName":"HandleSubscriptionUpdatedAsync","line":74,"kind":"persistence-read","detail":"return Result.Fail(result.Errors.Select(e => e.Description).FirstOrDefault() ?? \"Failed to update user profile.\");","evidencePaths":["NexusReader.Infrastructure/Services/BillingService.cs"]},{"methodName":"HandleSubscriptionDeletedAsync","line":90,"kind":"persistence-read","detail":"var user = await _userManager.FindByEmailAsync(customerEmail);","evidencePaths":["NexusReader.Infrastructure/Services/BillingService.cs"]},{"methodName":"HandleSubscriptionDeletedAsync","line":110,"kind":"persistence-read","detail":"return Result.Fail(result.Errors.Select(e => e.Description).FirstOrDefault() ?? \"Failed to reset user to free tier.\");","evidencePaths":["NexusReader.Infrastructure/Services/BillingService.cs"]}],"externalInteractions":[{"methodName":"HandleSubscriptionUpdatedAsync","line":36,"kind":"external-call","detail":"Calls UserManager.FindByEmailAsync(customerEmail)","evidencePaths":["NexusReader.Infrastructure/Services/BillingService.cs"]},{"methodName":"HandleSubscriptionUpdatedAsync","line":69,"kind":"external-call","detail":"Calls UserManager.UpdateAsync(user) and checks result.Succeeded","evidencePaths":["NexusReader.Infrastructure/Services/BillingService.cs"]},{"methodName":"HandleSubscriptionDeletedAsync","line":90,"kind":"external-call","detail":"Calls UserManager.FindByEmailAsync(customerEmail)","evidencePaths":["NexusReader.Infrastructure/Services/BillingService.cs"]},{"methodName":"HandleSubscriptionDeletedAsync","line":105,"kind":"external-call","detail":"Calls UserManager.UpdateAsync(user) and checks result.Succeeded","evidencePaths":["NexusReader.Infrastructure/Services/BillingService.cs"]}],"evidenceAnchors":[{"kind":"orchestration-method","label":"HandleSubscriptionUpdatedAsync","line":32,"summary":"Coordinates 4 downstream calls with 13 architectural actions.","confidence":0.98,"evidencePaths":["NexusReader.Infrastructure/Services/BillingService.cs","unknown","unknown","NexusReader.Data.Persistence/AppDbContext","unknown"]},{"kind":"orchestration-method","label":"HandleSubscriptionDeletedAsync","line":86,"summary":"Coordinates 4 downstream calls with 7 architectural actions.","confidence":0.98,"evidencePaths":["NexusReader.Infrastructure/Services/BillingService.cs","unknown","unknown","NexusReader.Data.Persistence/AppDbContext","unknown"]},{"kind":"persistence","label":"HandleSubscriptionUpdatedAsync","line":36,"summary":"var user = await _userManager.FindByEmailAsync(customerEmail);","confidence":0.82,"evidencePaths":["NexusReader.Infrastructure/Services/BillingService.cs"]},{"kind":"persistence","label":"HandleSubscriptionUpdatedAsync","line":74,"summary":"return Result.Fail(result.Errors.Select(e => e.Description).FirstOrDefault() ?? \"Failed to update user profile.\");","confidence":0.82,"evidencePaths":["NexusReader.Infrastructure/Services/BillingService.cs"]},{"kind":"persistence","label":"HandleSubscriptionDeletedAsync","line":90,"summary":"var user = await _userManager.FindByEmailAsync(customerEmail);","confidence":0.82,"evidencePaths":["NexusReader.Infrastructure/Services/BillingService.cs"]},{"kind":"external-call","label":"HandleSubscriptionUpdatedAsync","line":36,"summary":"Calls UserManager.FindByEmailAsync(customerEmail)","confidence":0.8,"evidencePaths":["NexusReader.Infrastructure/Services/BillingService.cs"]},{"kind":"external-call","label":"HandleSubscriptionUpdatedAsync","line":69,"summary":"Calls UserManager.UpdateAsync(user) and checks result.Succeeded","confidence":0.8,"evidencePaths":["NexusReader.Infrastructure/Services/BillingService.cs"]},{"kind":"external-call","label":"HandleSubscriptionDeletedAsync","line":90,"summary":"Calls UserManager.FindByEmailAsync(customerEmail)","confidence":0.8,"evidencePaths":["NexusReader.Infrastructure/Services/BillingService.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Infrastructure__Services__BookStorageService.cs.json b/src/.documentation/cache/summaries/NexusReader.Infrastructure__Services__BookStorageService.cs.json new file mode 100644 index 0000000..cac83c0 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Infrastructure__Services__BookStorageService.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Infrastructure/Services/BookStorageService.cs","purpose":"Infrastructure service that saves ebook files and cover images to the local web root, returning web-relative paths suitable for serving from the web app.","classification":{"role":"service","layer":"infrastructure","confidence":0.95,"evidence":["Service naming pattern","Application/service path heuristic","Namespace NexusReader.Infrastructure.Services","Implements IBookStorageService (application abstraction)","Performs filesystem operations under WebRootPath"]},"className":"BookStorageService","methods":[{"name":"BookStorageService","line":14,"endLine":17,"signature":"(environment: IWebHostEnvironment) -> BookStorageService","purpose":"Constructor that stores the injected IWebHostEnvironment for later use (web root path).","calls":[],"actions":[{"id":"init_16","kind":"mapping","label":"Stores IWebHostEnvironment","line":16,"detail":"_environment = environment","visibility":"detail-only","confidence":0.7}]},{"name":"SaveEbookAsync","line":19,"endLine":23,"signature":"(data: byte[], fileName: string) -> Task","purpose":"Wrapper overload that creates a MemoryStream from byte[] and delegates to SaveEbookAsync(Stream,...).","calls":[{"targetFile":"self","targetMethod":"SaveEbookAsync","callLine":22,"paramSummary":"stream (MemoryStream over data), fileName"}],"actions":[{"id":"mapping_21","kind":"mapping","label":"Wraps byte[] into MemoryStream","line":21,"detail":"using var stream = new MemoryStream(data)","visibility":"detail-only","confidence":0.7},{"id":"delegation_22","kind":"mapping","label":"Delegates to stream-based SaveEbookAsync","line":22,"detail":"return await SaveEbookAsync(stream, fileName)","visibility":"detail-only","confidence":0.7},{"id":"saveebookasync_return_22_0","kind":"return","label":"Returns result","line":22,"detail":"return await SaveEbookAsync(stream, fileName);","visibility":"detail-only","confidence":0.7}]},{"name":"SaveEbookAsync","line":25,"endLine":41,"signature":"(data: Stream, fileName: string) -> Task","purpose":"Saves a stream to the uploads folder under web root with a GUID-prefixed unique filename and returns a web-relative path.","calls":[{"targetFile":"self","targetMethod":"EnsureDirectoryExists","callLine":28,"paramSummary":"uploadsFolder (path combined from WebRootPath and 'uploads')"}],"actions":[{"id":"io_27","kind":"mapping","label":"Compute uploads folder path","line":27,"detail":"var uploadsFolder = Path.Combine(_environment.WebRootPath, \"uploads\")","visibility":"detail-only","confidence":0.7},{"id":"guard-clause_28","kind":"guard-clause","label":"Ensure uploads directory exists","line":28,"detail":"EnsureDirectoryExists(uploadsFolder)","conditionSummary":"directory missing","outcomeLabels":["create-directory","continue"],"visibility":"detail-only","confidence":0.7},{"id":"transformation_30","kind":"mapping","label":"Generate unique filename","line":30,"detail":"var uniqueFileName = $\"{Guid.NewGuid()}_{fileName}\"","visibility":"detail-only","confidence":0.7},{"id":"persistence-write_33","kind":"mapping","label":"Create file and copy stream contents","line":33,"detail":"using FileStream(filePath, FileMode.Create) and await data.CopyToAsync(fileStream)","visibility":"detail-only","confidence":0.7},{"id":"return_40","kind":"return","label":"Return web-relative uploads path","line":40,"detail":"return \"uploads/{uniqueFileName}\" (uses forward slashes to avoid Windows backslash issue)","visibility":"detail-only","confidence":0.7},{"id":"saveebookasync_return_40_0","kind":"return","label":"Returns result","line":40,"detail":"return $\"uploads/{uniqueFileName}\";","visibility":"detail-only","confidence":0.7}]},{"name":"SaveCoverAsync","line":43,"endLine":48,"signature":"(data: byte[], fileName: string) -> Task","purpose":"Wrapper overload that validates byte[] input and delegates to SaveCoverAsync(Stream,...) or returns null for empty input.","calls":[{"targetFile":"self","targetMethod":"SaveCoverAsync","callLine":47,"paramSummary":"stream (MemoryStream over data), fileName"}],"actions":[{"id":"savecoverasync_guard-clause_45_0","kind":"guard-clause","label":"Guards early exit or rejection path","line":45,"detail":"if (data == null || data.Length == 0) return null;","conditionSummary":"data == null || data.Length == 0","outcomeLabels":["exit","continue"],"visibility":"primary-visible","confidence":0.9},{"id":"guard-clause_45","kind":"guard-clause","label":"Return null for empty data","line":45,"detail":"if (data == null || data.Length == 0) return null","conditionSummary":"data == null || data.Length == 0","outcomeLabels":["null-return","continue"],"visibility":"detail-only","confidence":0.7},{"id":"mapping_46","kind":"mapping","label":"Wraps byte[] into MemoryStream","line":46,"detail":"using var stream = new MemoryStream(data)","visibility":"detail-only","confidence":0.7},{"id":"delegation_47","kind":"mapping","label":"Delegates to stream-based SaveCoverAsync","line":47,"detail":"return await SaveCoverAsync(stream, fileName)","visibility":"detail-only","confidence":0.7},{"id":"savecoverasync_return_47_1","kind":"return","label":"Returns result","line":47,"detail":"return await SaveCoverAsync(stream, fileName);","visibility":"detail-only","confidence":0.7}]},{"name":"SaveCoverAsync","line":50,"endLine":64,"signature":"(data: Stream, fileName: string) -> Task","purpose":"Saves a cover image stream to the covers folder under web root with a GUID-prefixed filename and returns a web-relative path (or string).","calls":[{"targetFile":"self","targetMethod":"EnsureDirectoryExists","callLine":53,"paramSummary":"coversFolder (path combined from WebRootPath and 'covers')"}],"actions":[{"id":"io_52","kind":"mapping","label":"Compute covers folder path","line":52,"detail":"var coversFolder = Path.Combine(_environment.WebRootPath, \"covers\")","visibility":"detail-only","confidence":0.7},{"id":"guard-clause_53","kind":"guard-clause","label":"Ensure covers directory exists","line":53,"detail":"EnsureDirectoryExists(coversFolder)","conditionSummary":"directory missing","outcomeLabels":["create-directory","continue"],"visibility":"detail-only","confidence":0.7},{"id":"transformation_55","kind":"mapping","label":"Generate unique filename","line":55,"detail":"var uniqueFileName = $\"{Guid.NewGuid()}_{fileName}\"","visibility":"detail-only","confidence":0.7},{"id":"persistence-write_58","kind":"mapping","label":"Create file and copy stream contents","line":58,"detail":"using FileStream(filePath, FileMode.Create) and await data.CopyToAsync(fileStream)","visibility":"detail-only","confidence":0.7},{"id":"return_63","kind":"return","label":"Return web-relative covers path","line":63,"detail":"return \"covers/{uniqueFileName}\"","visibility":"detail-only","confidence":0.7},{"id":"savecoverasync_return_63_0","kind":"return","label":"Returns result","line":63,"detail":"return $\"covers/{uniqueFileName}\";","visibility":"detail-only","confidence":0.7}]},{"name":"EnsureDirectoryExists","line":66,"endLine":72,"signature":"(path: string) -> void","purpose":"Checks for directory existence and creates it if missing.","calls":[],"actions":[{"id":"guard-clause_68","kind":"guard-clause","label":"Check directory existence","line":68,"detail":"if (!Directory.Exists(path)) { Directory.CreateDirectory(path); }","conditionSummary":"!Directory.Exists(path)","outcomeLabels":["create-directory","noop"],"visibility":"detail-only","confidence":0.7},{"id":"ensuredirectoryexists_branch_68_0","kind":"branch","label":"Evaluates branch condition","line":68,"detail":"if (!Directory.Exists(path))","conditionSummary":"!Directory.Exists(path)","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"persistence-write_70","kind":"mapping","label":"Create directory","line":70,"detail":"Directory.CreateDirectory(path)","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"BookStorageService","kind":"model","line":10,"purpose":"Concrete infrastructure implementation of IBookStorageService that persists ebook and cover bytes to filesystem under the web root.","fields":[{"name":"_environment","type":"IWebHostEnvironment","required":true,"line":12,"description":"Injected web host environment used to resolve WebRootPath for storage"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Application.Abstractions.Services (IBookStorageService)","Microsoft.AspNetCore.Hosting (IWebHostEnvironment)"],"patterns":["Storage Service","Filesystem Persistence","Wrapper Overload Delegation"],"domainConcepts":["Book (ebook file)","Cover (cover image)","Web-root relative static asset paths (uploads, covers)"],"keyDetails":"Writes files under WebRootPath/uploads and WebRootPath/covers using GUID-prefixed filenames; returns web-relative paths using forward slashes to avoid Windows backslash issues; Validate empty cover bytes in byte[] overload and return null.","orchestrationMethods":[{"name":"EnsureDirectoryExists","line":66,"confidence":0.57,"reason":"Contains 1 architectural actions relevant to business execution.","actionKinds":["guard-clause","branch","mapping"],"evidencePaths":["NexusReader.Infrastructure/Services/BookStorageService.cs"]}],"typedContracts":[{"name":"BookStorageService","kind":"model","line":10,"fieldCount":1,"evidencePaths":["NexusReader.Infrastructure/Services/BookStorageService.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"orchestration-method","label":"EnsureDirectoryExists","line":66,"summary":"Contains 1 architectural actions relevant to business execution.","confidence":0.57,"evidencePaths":["NexusReader.Infrastructure/Services/BookStorageService.cs"]},{"kind":"typed-contract","label":"BookStorageService","line":10,"summary":"model with 1 fields.","confidence":0.8,"evidencePaths":["NexusReader.Infrastructure/Services/BookStorageService.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Infrastructure__Services__EpubMetadataExtractor.cs.json b/src/.documentation/cache/summaries/NexusReader.Infrastructure__Services__EpubMetadataExtractor.cs.json new file mode 100644 index 0000000..a93324e --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Infrastructure__Services__EpubMetadataExtractor.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs","purpose":"Infrastructure service that reads an EPUB stream to extract title, author, description and cover image for pre-ingestion preview without persisting data.","classification":{"role":"service","layer":"infrastructure","confidence":0.9,"evidence":["Service naming pattern","Application/service path heuristic","namespace NexusReader.Infrastructure.Services","class implements IEpubMetadataExtractor and uses VersOne.Epub to open/read EPUB streams","Method extracts metadata for UI ingestion preview (no persistence)"]},"className":"EpubMetadataExtractor","methods":[{"name":"ExtractMetadataAsync","line":15,"endLine":30,"signature":"(epubStream: Stream) -> Task>","purpose":"Opens an EPUB stream, reads title/author/description/cover and returns a Result-wrapped LocalEpubMetadata or an error on failure.","calls":[{"targetFile":"unknown","targetMethod":"EpubReader.OpenBookAsync","callLine":19,"paramSummary":"epubStream (Stream) to open the EPUB book asynchronously"},{"targetFile":"unknown","targetMethod":"EpubBookReference.ReadCoverAsync","callLine":23,"paramSummary":"no params; reads cover image bytes from opened book reference"}],"actions":[{"id":"try-catch_17","kind":"mapping","label":"Wrap extraction to catch any exception and convert to Result.Fail","line":17,"detail":"try { ... } catch (Exception ex) { return Result.Fail(...).CausedBy(ex); }","visibility":"detail-only","confidence":0.7},{"id":"resource-disposal_19","kind":"mapping","label":"Dispose opened EPUB book reference after use","line":19,"detail":"using var bookRef = await EpubReader.OpenBookAsync(epubStream); ensures bookRef disposal","visibility":"detail-only","confidence":0.7},{"id":"guard-clause_20","kind":"guard-clause","label":"Default title when null","line":20,"detail":"var title = bookRef.Title ?? \"Unknown Title\";","conditionSummary":"bookRef.Title == null","outcomeLabels":["use 'Unknown Title'","use actual title"],"visibility":"detail-only","confidence":0.7},{"id":"guard-clause_21","kind":"guard-clause","label":"Default author when null","line":21,"detail":"var author = bookRef.Author ?? \"Unknown Author\";","conditionSummary":"bookRef.Author == null","outcomeLabels":["use 'Unknown Author'","use actual author"],"visibility":"detail-only","confidence":0.7},{"id":"external-call_23","kind":"external-call","label":"Read cover image bytes","line":23,"detail":"await bookRef.ReadCoverAsync(); may return null or byte[]","visibility":"detail-only","confidence":0.7},{"id":"mapping_24","kind":"mapping","label":"Compose LocalEpubMetadata DTO","line":24,"detail":"new LocalEpubMetadata { Title = title, Author = author, CoverImage = cover, Description = description }","visibility":"detail-only","confidence":0.7},{"id":"return-success_24","kind":"mapping","label":"Return successful Result with metadata","line":24,"detail":"Result.Ok(LocalEpubMetadata)","visibility":"detail-only","confidence":0.7},{"id":"extractmetadataasync_return_24_0","kind":"return","label":"Returns result","line":24,"detail":"return Result.Ok(new LocalEpubMetadata { Title = title, Author = author, CoverImage = cover, Description = description });","visibility":"detail-only","confidence":0.7},{"id":"return-failure_28","kind":"mapping","label":"Return failure Result on exception","line":28,"detail":"Result.Fail(new Error(...)).CausedBy(ex)","visibility":"detail-only","confidence":0.7},{"id":"extractmetadataasync_return_28_1","kind":"return","label":"Returns result","line":28,"detail":"return Result.Fail(new Error($\"Failed to extract EPUB metadata locally: {ex.Message}\").CausedBy(ex));","visibility":"detail-only","confidence":0.7}]}],"types":[],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Application.Abstractions.Services (IEpubMetadataExtractor)","NexusReader.Application.Queries.Reader (LocalEpubMetadata)","VersOne.Epub (EpubReader / bookRef)"],"patterns":["Infrastructure Service","Adapter (wraps third-party EPUB lib for app)"],"domainConcepts":["Epub","Metadata","Ingestion/Preview"],"keyDetails":"Synchronous orchestration is simple: open EPUB, map fields with null-coalescing defaults, read cover bytes, return Result.Ok on success or Result.Fail with causal exception on any error. No persistence, no logging in this file.","orchestrationMethods":[{"name":"ExtractMetadataAsync","line":15,"confidence":0.73,"reason":"Coordinates 2 downstream calls with 1 architectural actions.","actionKinds":["mapping","guard-clause","external-call","return"],"evidencePaths":["NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs","unknown","unknown"]}],"typedContracts":[],"persistenceInteractions":[],"externalInteractions":[{"methodName":"ExtractMetadataAsync","line":23,"kind":"external-call","detail":"await bookRef.ReadCoverAsync(); may return null or byte[]","evidencePaths":["NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs"]}],"evidenceAnchors":[{"kind":"orchestration-method","label":"ExtractMetadataAsync","line":15,"summary":"Coordinates 2 downstream calls with 1 architectural actions.","confidence":0.73,"evidencePaths":["NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs","unknown","unknown"]},{"kind":"external-call","label":"ExtractMetadataAsync","line":23,"summary":"await bookRef.ReadCoverAsync(); may return null or byte[]","confidence":0.8,"evidencePaths":["NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs"]}]} \ No newline at end of file diff --git a/src/.documentation/cache/summaries/NexusReader.Infrastructure__Services__EpubReaderService.cs.json b/src/.documentation/cache/summaries/NexusReader.Infrastructure__Services__EpubReaderService.cs.json new file mode 100644 index 0000000..98d7a55 --- /dev/null +++ b/src/.documentation/cache/summaries/NexusReader.Infrastructure__Services__EpubReaderService.cs.json @@ -0,0 +1 @@ +{"path":"NexusReader.Infrastructure/Services/EpubReaderService.cs","purpose":"Service that locates EPUB files recorded in the database, parses a requested chapter, splits the chapter into sanitized content blocks, injects AI-action trigger blocks at thresholds, and returns a ReaderPageViewModel for consumption by the application.","classification":{"role":"service","layer":"infrastructure","confidence":0.9,"evidence":["Service naming pattern","Application/service path heuristic","Namespace NexusReader.Infrastructure.Services","Implements IEpubReader and uses IDbContextFactory","Performs file resolution, DB lookup and EPUB parsing (infrastructure-level I/O and integration)"]},"className":"EpubReaderService","methods":[{"name":"GetEpubContentAsync","line":30,"endLine":118,"signature":"(ebookId: Guid, chapterIndex: int, userId: string? = null, cancellationToken: CancellationToken = default) -> Task>","purpose":"Primary orchestration method: resolves ebook file path from DB, parses the EPUB, extracts and sanitizes paragraphs into content blocks, injects AI trigger blocks based on word thresholds, and returns a ReaderPageViewModel; wraps work in try/catch and logs failures.","calls":[{"targetFile":"unknown","targetMethod":"IDbContextFactory.CreateDbContextAsync","callLine":39,"paramSummary":"cancellationToken"},{"targetFile":"unknown","targetMethod":"DbSet.FirstOrDefaultAsync","callLine":41,"paramSummary":"predicate: e => e.Id == ebookId && (userId == null || e.UserId == userId), cancellationToken"},{"targetFile":"self","targetMethod":"ResolvePath","callLine":54,"paramSummary":"ebook.FilePath (web-relative path)"},{"targetFile":"unknown","targetMethod":"File.Exists","callLine":55,"paramSummary":"fullPath"},{"targetFile":"unknown","targetMethod":"VersOne.Epub.EpubReader.OpenBookAsync","callLine":62,"paramSummary":"fullPath"},{"targetFile":"unknown","targetMethod":"EpubBookRef.GetReadingOrder","callLine":63,"paramSummary":"bookRef"},{"targetFile":"self","targetMethod":"FindTitleInNavigation","callLine":77,"paramSummary":"navigation, chapterRef.FilePath"},{"targetFile":"unknown","targetMethod":"Path.GetFileNameWithoutExtension","callLine":78,"paramSummary":"chapterRef.FilePath"},{"targetFile":"unknown","targetMethod":"EpubTextContentFileRef.ReadContentAsTextAsync","callLine":81,"paramSummary":"chapterRef"},{"targetFile":"self","targetMethod":"ExtractParagraphs","callLine":88,"paramSummary":"chapterContent (html string)"},{"targetFile":"self","targetMethod":"SanitizeParagraph","callLine":91,"paramSummary":"individual paragraph html"},{"targetFile":"self","targetMethod":"CountWords","callLine":96,"paramSummary":"sanitized paragraph text"},{"targetFile":"self","targetMethod":"CreateAiTrigger","callLine":101,"paramSummary":"generated trigger id string"},{"targetFile":"NexusReader.Application/Queries/Reader","targetMethod":"ReaderPageViewModel.ctor","callLine":111,"paramSummary":"blocks, chapterIndex, readingOrder.Count, chapterTitle, ebook.Id"},{"targetFile":"unknown","targetMethod":"ILogger.LogError","callLine":57,"paramSummary":"error message with ebookId, ebook.FilePath"},{"targetFile":"unknown","targetMethod":"ILogger.LogError","callLine":115,"paramSummary":"exception and ebookId"}],"actions":[{"id":"error-handling_36","kind":"mapping","label":"Top-level try/catch","line":36,"detail":"Catches Exception, logs, and returns Result.Fail with wrapped Error","visibility":"detail-only","confidence":0.7},{"id":"db-read_39","kind":"mapping","label":"Load ebook record","line":39,"detail":"Reads Ebooks DbSet with user guard in predicate","visibility":"detail-only","confidence":0.7},{"id":"getepubcontentasync_repository-read_41_0","kind":"repository-read","label":"Reads repository or persistence state","line":41,"detail":"var ebook = await context.Ebooks","visibility":"secondary-visible","confidence":0.86},{"id":"guard-clause_47","kind":"guard-clause","label":"Ebook existence check","line":47,"detail":"Return Result.Fail if not found","conditionSummary":"ebook == null","outcomeLabels":["fail","continue"],"visibility":"detail-only","confidence":0.7},{"id":"getepubcontentasync_branch_47_1","kind":"branch","label":"Evaluates branch condition","line":47,"detail":"if (ebook == null)","conditionSummary":"ebook == null","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"getepubcontentasync_return_49_2","kind":"return","label":"Returns result","line":49,"detail":"return Result.Fail($\"Ebook '{ebookId}' not found for user '{userId}'.\");","visibility":"detail-only","confidence":0.7},{"id":"file-check_54","kind":"mapping","label":"Resolve and validate EPUB file path","line":54,"detail":"ResolvePath then File.Exists; logs and fails if missing","visibility":"detail-only","confidence":0.7},{"id":"getepubcontentasync_branch_55_3","kind":"branch","label":"Evaluates branch condition","line":55,"detail":"if (fullPath == null || !File.Exists(fullPath))","conditionSummary":"fullPath == null || !File.Exists(fullPath)","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"getepubcontentasync_log_57_4","kind":"log","label":"Logs runtime state","line":57,"detail":"_logger.LogError(\"EPUB file for ebook {EbookId} not found at path '{FilePath}'.\", ebookId, ebook.FilePath);","visibility":"secondary-visible","confidence":0.92},{"id":"getepubcontentasync_return_58_5","kind":"return","label":"Returns result","line":58,"detail":"return Result.Fail($\"The EPUB file for this book could not be found on the server.\");","visibility":"detail-only","confidence":0.7},{"id":"external-call_62","kind":"external-call","label":"Open EPUB and read reading order","line":62,"detail":"Calls EpubReader.OpenBookAsync and GetReadingOrder; fails if no readable content","visibility":"detail-only","confidence":0.7},{"id":"getepubcontentasync_branch_65_6","kind":"branch","label":"Evaluates branch condition","line":65,"detail":"if (readingOrder == null || !readingOrder.Any())","conditionSummary":"readingOrder == null || !readingOrder.Any()","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"guard-clause_65","kind":"guard-clause","label":"ReadingOrder empty check","line":65,"conditionSummary":"readingOrder == null || !readingOrder.Any()","outcomeLabels":["fail","continue"],"visibility":"detail-only","confidence":0.7},{"id":"getepubcontentasync_return_67_7","kind":"return","label":"Returns result","line":67,"detail":"return Result.Fail(\"The EPUB has no readable content files in ReadingOrder.\");","visibility":"detail-only","confidence":0.7},{"id":"index-sanitization_70","kind":"mapping","label":"Clamp chapterIndex","line":70,"detail":"If invalid, set chapterIndex = 0","conditionSummary":"chapterIndex out of range","outcomeLabels":["reset to 0","keep"],"visibility":"detail-only","confidence":0.7},{"id":"getepubcontentasync_branch_70_8","kind":"branch","label":"Evaluates branch condition","line":70,"detail":"if (chapterIndex < 0 || chapterIndex >= readingOrder.Count)","conditionSummary":"chapterIndex < 0 || chapterIndex >= readingOrder.Count","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"navigation-lookup_76","kind":"mapping","label":"Find chapter title","line":76,"detail":"Resolve title from navigation or fallback to filename or 'Chapter N'","visibility":"detail-only","confidence":0.7},{"id":"getepubcontentasync_repository-read_77_9","kind":"repository-read","label":"Reads repository or persistence state","line":77,"detail":"var chapterTitle = FindTitleInNavigation(navigation, chapterRef.FilePath)","visibility":"secondary-visible","confidence":0.86},{"id":"loop_89","kind":"loop","label":"Paragraph -> block building loop","line":89,"detail":"Iterates paragraphs, sanitizes, counts words, adds TextSegmentBlock and injects AI triggers when threshold reached","visibility":"detail-only","confidence":0.7},{"id":"getepubcontentasync_loop_89_10","kind":"loop","label":"Repeats work over a collection or condition","line":89,"detail":"foreach (var p in paragraphs)","conditionSummary":"var p in paragraphs","loopTargetLine":89,"loopExitSummary":"Leaves the loop when the condition no longer holds.","visibility":"primary-visible","confidence":0.86},{"id":"getepubcontentasync_guard-clause_92_11","kind":"guard-clause","label":"Guards early exit or rejection path","line":92,"detail":"if (string.IsNullOrWhiteSpace(sanitizedContent)) continue;","conditionSummary":"string.IsNullOrWhiteSpace(sanitizedContent)","outcomeLabels":["exit","continue"],"visibility":"primary-visible","confidence":0.9},{"id":"getepubcontentasync_branch_99_12","kind":"branch","label":"Evaluates branch condition","line":99,"detail":"if (totalWordCount >= WordThreshold)","conditionSummary":"totalWordCount >= WordThreshold","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"threshold-trigger_99","kind":"mapping","label":"Inject AI trigger on WordThreshold","line":99,"detail":"When cumulative words >= WordThreshold, add CreateAiTrigger and reset counter","visibility":"detail-only","confidence":0.7},{"id":"post-condition_106","kind":"mapping","label":"Ensure trailing AI trigger","line":106,"detail":"If last block is not AiActionTriggerBlock, append one","visibility":"detail-only","confidence":0.7},{"id":"getepubcontentasync_branch_106_13","kind":"branch","label":"Evaluates branch condition","line":106,"detail":"if (blocks.Any() && blocks.Last() is not AiActionTriggerBlock)","conditionSummary":"blocks.Any() && blocks.Last() is not AiActionTriggerBlock","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"getepubcontentasync_return_111_14","kind":"return","label":"Returns result","line":111,"detail":"return Result.Ok(new ReaderPageViewModel(blocks, chapterIndex, readingOrder.Count, chapterTitle, ebook.Id));","visibility":"detail-only","confidence":0.7},{"id":"getepubcontentasync_log_115_15","kind":"log","label":"Logs runtime state","line":115,"detail":"_logger.LogError(ex, \"Failed to process EPUB for ebook {EbookId}.\", ebookId);","visibility":"secondary-visible","confidence":0.92},{"id":"getepubcontentasync_return_116_16","kind":"return","label":"Returns result","line":116,"detail":"return Result.Fail(new Error($\"Failed to process EPUB: {ex.Message}\").CausedBy(ex));","visibility":"detail-only","confidence":0.7}]},{"name":"ResolvePath","line":124,"endLine":143,"signature":"(relativePath: string) -> string?","purpose":"Resolve a web-relative storage path to an absolute filesystem path by searching upward from the app base directory and trying both production (wwwroot) and development (src/NexusReader.Web/wwwroot) layouts.","calls":[{"targetFile":"unknown","targetMethod":"Path.Combine","callLine":132,"paramSummary":"currentDir.FullName, \"wwwroot\", normalized"},{"targetFile":"unknown","targetMethod":"File.Exists","callLine":133,"paramSummary":"candidate"},{"targetFile":"unknown","targetMethod":"Path.Combine","callLine":136,"paramSummary":"currentDir.FullName, \"src\", \"NexusReader.Web\", \"wwwroot\", normalized"},{"targetFile":"unknown","targetMethod":"File.Exists","callLine":137,"paramSummary":"devCandidate"}],"actions":[{"id":"normalization_126","kind":"mapping","label":"Normalize separators","line":126,"detail":"Replace forward slashes with OS directory separator","visibility":"detail-only","confidence":0.7},{"id":"loop_129","kind":"loop","label":"Search upward through parent directories","line":129,"detail":"While currentDir != null try candidate and devCandidate paths; return first match","visibility":"detail-only","confidence":0.7},{"id":"resolvepath_loop_130_0","kind":"loop","label":"Repeats work over a collection or condition","line":130,"detail":"while (currentDir != null)","conditionSummary":"currentDir != null","loopTargetLine":130,"loopExitSummary":"Leaves the loop when the condition no longer holds.","visibility":"primary-visible","confidence":0.86},{"id":"resolvepath_guard-clause_133_1","kind":"guard-clause","label":"Guards early exit or rejection path","line":133,"detail":"if (File.Exists(candidate)) return candidate;","conditionSummary":"File.Exists(candidate)","outcomeLabels":["exit","continue"],"visibility":"primary-visible","confidence":0.9},{"id":"resolvepath_guard-clause_137_2","kind":"guard-clause","label":"Guards early exit or rejection path","line":137,"detail":"if (File.Exists(devCandidate)) return devCandidate;","conditionSummary":"File.Exists(devCandidate)","outcomeLabels":["exit","continue"],"visibility":"primary-visible","confidence":0.9},{"id":"fallback_142","kind":"fallback","label":"Return null if not found","line":142,"detail":"If search exhausts, return null","visibility":"detail-only","confidence":0.7},{"id":"resolvepath_return_142_3","kind":"return","label":"Returns result","line":142,"detail":"return null;","visibility":"detail-only","confidence":0.7}]},{"name":"ExtractParagraphs","line":145,"endLine":164,"signature":"(html: string) -> List","purpose":"Extracts paragraphs and block-level elements from an HTML string; falls back to splitting on
or blank lines if no blocks are found.","calls":[{"targetFile":"unknown","targetMethod":"Regex.Match","callLine":147,"paramSummary":"body regex against html"},{"targetFile":"unknown","targetMethod":"Regex.Matches","callLine":151,"paramSummary":"pattern matching p, headings, lists, blockquote, pre, hr"}],"actions":[{"id":"regex-parse_147","kind":"mapping","label":"Extract content if present","line":147,"detail":"Use Regex.Match to get inner body or use full html","visibility":"detail-only","confidence":0.7},{"id":"collection-build_153","kind":"mapping","label":"Collect block matches","line":153,"detail":"Enumerate matches and add to paragraphs list","visibility":"detail-only","confidence":0.7},{"id":"extractparagraphs_loop_153_0","kind":"loop","label":"Repeats work over a collection or condition","line":153,"detail":"foreach (Match match in matches)","conditionSummary":"Match match in matches","loopTargetLine":153,"loopExitSummary":"Leaves the loop when the condition no longer holds.","visibility":"primary-visible","confidence":0.86},{"id":"extractparagraphs_branch_158_1","kind":"branch","label":"Evaluates branch condition","line":158,"detail":"if (paragraphs.Count == 0)","conditionSummary":"paragraphs.Count == 0","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"fallback_158","kind":"fallback","label":"Split by breaks if no blocks found","line":158,"detail":"Split on
, double-newlines","visibility":"detail-only","confidence":0.7},{"id":"extractparagraphs_return_163_2","kind":"return","label":"Returns result","line":163,"detail":"return paragraphs;","visibility":"detail-only","confidence":0.7}]},{"name":"SanitizeParagraph","line":166,"endLine":173,"signature":"(html: string) -> string","purpose":"Sanitizes HTML paragraph content to a minimal allowed set of tags, strips scripts/styles, decodes HTML entities and trims whitespace.","calls":[{"targetFile":"unknown","targetMethod":"Regex.Replace","callLine":168,"paramSummary":"remove