[{"data":1,"prerenderedAt":405},["ShallowReactive",2],{"$fYEPvi2ePTCuFHljtQ6rhGEBMUyEk2VhCyjVo79GqSlo":3},{"newThing":4,"project":5,"cycle":9,"sections":23,"threads":357,"otherDocs":358,"documents":360,"images":363,"archiveItems":402,"links":403},"One agent session as an entity-type topology (QMapAgentSession)",{"id":6,"label":7,"liveBase":8},"qmap","Qmap",null,{"id":10,"num":11,"dir":12,"name":13,"title":13,"focus":14,"status":15,"statusNote":8,"created":16,"completed":8,"mode":8,"report":8,"recordless":17,"thumbnail":18,"imageCount":19,"artifactCount":20,"lastActivity":21,"hasPickup":17,"hasInitialPrompt":22},"c21",21,"c21.ai-session-map","ai-session-map","Visualize a single AI agent session as a qmap entity-type topology","active","2026-04-03",false,"\u002Fcycles\u002Fqmap\u002Fc21-ai-session-map.png",9,1,"2026-08-15",true,[24,43,103,133],{"key":25,"title":26,"empty":17,"ast":27},"why","Why",{"type":28,"children":29},"root",[30,38],{"type":31,"tag":32,"props":33,"children":34},"element","p",{},[35],{"type":36,"value":37},"text","AI agent monitoring produces rich session data — every MCP server called, every file read or written, every external host contacted, every skill spun up. This data is currently expressed as tables. qmap's grouping system can make the structural shape of a session immediately legible: entity-type rugs (MCP Servers, Files, Skills, External Hosts) surrounding a central agent actor, with flows weighted by call volume.",{"type":31,"tag":32,"props":39,"children":40},{},[41],{"type":36,"value":42},"Companion to c33 (design) which built 2D session graphs in qflow\u002FPixiJS. This explores the 3D isometric angle.",{"key":44,"title":45,"empty":17,"ast":46},"objective","Objective",{"type":28,"children":47},[48,62],{"type":31,"tag":32,"props":49,"children":50},{},[51,53,60],{"type":36,"value":52},"One runnable experiment (",{"type":31,"tag":54,"props":55,"children":57},"code",{"className":56},[],[58],{"type":36,"value":59},"ExperimentsApp.vue",{"type":36,"value":61},") that:",{"type":31,"tag":63,"props":64,"children":65},"ul",{},[66,72,93,98],{"type":31,"tag":67,"props":68,"children":69},"li",{},[70],{"type":36,"value":71},"Maps a large synthetic AI session to qmap's actor\u002Fdataflow schema",{"type":31,"tag":67,"props":73,"children":74},{},[75,77,83,85,91],{"type":36,"value":76},"Uses ",{"type":31,"tag":54,"props":78,"children":80},{"className":79},[],[81],{"type":36,"value":82},"entityType",{"type":36,"value":84}," tag + ",{"type":31,"tag":54,"props":86,"children":88},{"className":87},[],[89],{"type":36,"value":90},"level1",{"type":36,"value":92}," grouping to organize actors into category rugs",{"type":31,"tag":67,"props":94,"children":95},{},[96],{"type":36,"value":97},"Wires a DevConfigurator control to switch between entity-type, flat, and actor-type grouping modes",{"type":31,"tag":67,"props":99,"children":100},{},[101],{"type":36,"value":102},"Stress-tests the layout with a rich dataset (~35 actors, ~50 flows)",{"key":104,"title":105,"empty":17,"ast":106},"scope","Scope",{"type":28,"children":107},[108],{"type":31,"tag":63,"props":109,"children":110},{},[111,122],{"type":31,"tag":67,"props":112,"children":113},{},[114,120],{"type":31,"tag":54,"props":115,"children":117},{"className":116},[],[118],{"type":36,"value":119},"dev\u002Fexperiments\u002Fc21.ai-session-map\u002FExperimentsApp.vue",{"type":36,"value":121}," — runnable experiment (copied from c20, then rewritten)",{"type":31,"tag":67,"props":123,"children":124},{},[125,131],{"type":31,"tag":54,"props":126,"children":128},{"className":127},[],[129],{"type":36,"value":130},"cycles\u002Fc21.ai-session-map\u002F",{"type":36,"value":132}," — this cycle metadata",{"key":134,"title":135,"empty":17,"ast":136},"key-changes","Key Changes",{"type":28,"children":137},[138,199,206,211,241,270,291,335],{"type":31,"tag":63,"props":139,"children":140},{},[141,186],{"type":31,"tag":67,"props":142,"children":143},{},[144,153,155,160,162,168,170,176,178,184],{"type":31,"tag":145,"props":146,"children":147},"strong",{},[148],{"type":31,"tag":54,"props":149,"children":151},{"className":150},[],[152],{"type":36,"value":119},{"type":36,"value":154}," — Large synthetic session dataset (42 actors, 42 flows). Actors tagged with ",{"type":31,"tag":54,"props":156,"children":158},{"className":157},[],[159],{"type":36,"value":82},{"type":36,"value":161}," (User, AI Agent, MCP Server, Skill, File, External Host). Four grouping modes wired to a header button bar: Entity Type (",{"type":31,"tag":54,"props":163,"children":165},{"className":164},[],[166],{"type":36,"value":167},"level1: entityType",{"type":36,"value":169},"), File Access (",{"type":31,"tag":54,"props":171,"children":173},{"className":172},[],[174],{"type":36,"value":175},"level1: entityType, level2: access",{"type":36,"value":177},"), Actor Type (via ",{"type":31,"tag":54,"props":179,"children":181},{"className":180},[],[182],{"type":36,"value":183},"computeGrouping(..., 'group')",{"type":36,"value":185},"), and Flat. DevConfigurator overlay added for live visual tuning.",{"type":31,"tag":67,"props":187,"children":188},{},[189,197],{"type":31,"tag":145,"props":190,"children":191},{},[192],{"type":31,"tag":54,"props":193,"children":195},{"className":194},[],[196],{"type":36,"value":130},{"type":36,"value":198}," — Cycle metadata (this file + initial-prompt.md)",{"type":31,"tag":200,"props":201,"children":203},"h3",{"id":202},"session-2-2026-04-03",[204],{"type":36,"value":205},"Session 2 — 2026-04-03",{"type":31,"tag":32,"props":207,"children":208},{},[209],{"type":36,"value":210},"Architectural refactor: flow objects now own their visual config.",{"type":31,"tag":32,"props":212,"children":213},{},[214,223,225,231,233,239],{"type":31,"tag":145,"props":215,"children":216},{},[217],{"type":31,"tag":54,"props":218,"children":220},{"className":219},[],[221],{"type":36,"value":222},"src\u002Fflows\u002FLineFlow.js",{"type":36,"value":224}," — Added ",{"type":31,"tag":54,"props":226,"children":228},{"className":227},[],[229],{"type":36,"value":230},"applyConfig(config)",{"type":36,"value":232},". Accepts flat visual config, reconciles line properties via existing setters, and dynamically adds\u002Fremoves ArrowIndicator\u002FPulseIndicator (always dispose + recreate). Re-applies current flow state after indicator recreation so colors stay consistent. Removed indicator creation from constructor — ",{"type":31,"tag":54,"props":234,"children":236},{"className":235},[],[237],{"type":36,"value":238},"applyConfig",{"type":36,"value":240}," is now the only path.",{"type":31,"tag":32,"props":242,"children":243},{},[244,253,255,261,263,268],{"type":31,"tag":145,"props":245,"children":246},{},[247],{"type":31,"tag":54,"props":248,"children":250},{"className":249},[],[251],{"type":36,"value":252},"src\u002Fflows\u002Findex.js",{"type":36,"value":254}," — Removed arrows\u002Fpulse from ",{"type":31,"tag":54,"props":256,"children":258},{"className":257},[],[259],{"type":36,"value":260},"createFlow",{"type":36,"value":262},"; indicators come exclusively through ",{"type":31,"tag":54,"props":264,"children":266},{"className":265},[],[267],{"type":36,"value":238},{"type":36,"value":269},".",{"type":31,"tag":32,"props":271,"children":272},{},[273,282,283,289],{"type":31,"tag":145,"props":274,"children":275},{},[276],{"type":31,"tag":54,"props":277,"children":279},{"className":278},[],[280],{"type":36,"value":281},"src\u002Fcomponents\u002FQMap.vue",{"type":36,"value":224},{"type":31,"tag":54,"props":284,"children":286},{"className":285},[],[287],{"type":36,"value":288},"flowConfig",{"type":36,"value":290}," computed as single source of truth for all flow visual config. Replaced individual prop getters and ~40 lines of per-property flow watchers. QMap now has no knowledge of how flows render.",{"type":31,"tag":32,"props":292,"children":293},{},[294,311,313,318,320,325,327,333],{"type":31,"tag":145,"props":295,"children":296},{},[297,303,305],{"type":31,"tag":54,"props":298,"children":300},{"className":299},[],[301],{"type":36,"value":302},"useActorSelection",{"type":36,"value":304}," + ",{"type":31,"tag":54,"props":306,"children":308},{"className":307},[],[309],{"type":36,"value":310},"useHighlightedDataflows",{"type":36,"value":312}," — Accept ",{"type":31,"tag":54,"props":314,"children":316},{"className":315},[],[317],{"type":36,"value":288},{"type":36,"value":319}," ref. On flow creation: immediate ",{"type":31,"tag":54,"props":321,"children":323},{"className":322},[],[324],{"type":36,"value":238},{"type":36,"value":326}," call + ",{"type":31,"tag":54,"props":328,"children":330},{"className":329},[],[331],{"type":36,"value":332},"watch(flowConfig, config => flow.applyConfig(config))",{"type":36,"value":334},". Stop functions managed alongside flow disposal.",{"type":31,"tag":32,"props":336,"children":337},{},[338,347,349,355],{"type":31,"tag":145,"props":339,"children":340},{},[341],{"type":31,"tag":54,"props":342,"children":344},{"className":343},[],[345],{"type":36,"value":346},"src\u002Fflows\u002FArrowIndicator.js",{"type":36,"value":348}," — Direction-aware cone orientation: tangent negated when ",{"type":31,"tag":54,"props":350,"children":352},{"className":351},[],[353],{"type":36,"value":354},"_flowDirection \u003C 0",{"type":36,"value":356}," so tip always points in the direction of travel. Sliding mode trail offset also flips direction so the trail always sits behind the lead cone.",[],[359],"initial-prompt.md",[361],{"file":359,"title":362},"AI Session Map",[364,371,375,379,383,387,391,395,399],{"src":365,"kind":366,"order":367,"caption":368,"capturedAt":369,"route":370},"\u002Fcycles\u002Fqmap\u002Fc21-full-entity.png","hero",43,"Full session, entity-type grouping","2026-08-15T23:43:05.086Z","\u002Fexperiments\u002Fc21.ai-session-map\u002F",{"src":372,"kind":366,"order":373,"caption":374,"capturedAt":369,"route":370},"\u002Fcycles\u002Fqmap\u002Fc21-full-fileaccess.png",44,"Grouped by file access",{"src":376,"kind":366,"order":377,"caption":378,"capturedAt":369,"route":370},"\u002Fcycles\u002Fqmap\u002Fc21-full-actortype.png",45,"Grouped by actor type",{"src":380,"kind":366,"order":381,"caption":382,"capturedAt":369,"route":370},"\u002Fcycles\u002Fqmap\u002Fc21-full-flat.png",46,"Flat — the raw session graph",{"src":384,"kind":366,"order":385,"caption":386,"capturedAt":369,"route":370},"\u002Fcycles\u002Fqmap\u002Fc21-simple.png",47,"Simple session — the minimal story",{"src":388,"kind":366,"order":389,"caption":390,"capturedAt":369,"route":370},"\u002Fcycles\u002Fqmap\u002Fc21-fileheavy.png",48,"File Heavy session — the file wall",{"src":392,"kind":366,"order":393,"caption":394,"capturedAt":369,"route":370},"\u002Fcycles\u002Fqmap\u002Fc21-fileheavy-files.png",49,"File Heavy grouped by file access",{"src":396,"kind":366,"order":397,"caption":398,"capturedAt":369,"route":370},"\u002Fcycles\u002Fqmap\u002Fc21-topdown.png",50,"Full session from above",{"src":18,"kind":366,"order":400,"capturedAt":401,"route":370},4999,"2026-08-15T16:38:26.312Z",[],[404],{"route":370,"href":8},1794599431807]