This commit is contained in:
2026-02-21 19:44:47 -05:00
parent 74737b0f70
commit eb347d6b01
3 changed files with 298 additions and 94 deletions

View File

@@ -417,13 +417,44 @@ def _strip_cache_controls(history: list[dict]):
if isinstance(block, dict): if isinstance(block, dict):
block.pop("cache_control", None) block.pop("cache_control", None)
def _repair_anthropic_history(history: list[dict]):
"""
If history ends with an assistant message that contains tool_use blocks
without a following user tool_result message, append a synthetic tool_result
message so the history is valid before the next request.
"""
if not history:
return
last = history[-1]
if last.get("role") != "assistant":
return
content = last.get("content", [])
# Find tool_use blocks (content may be a list of dicts or SDK objects)
tool_use_ids = []
for block in content:
if isinstance(block, dict):
if block.get("type") == "tool_use":
tool_use_ids.append(block["id"])
else:
# SDK object
if getattr(block, "type", None) == "tool_use":
tool_use_ids.append(block.id)
if not tool_use_ids:
return
# Append a synthetic tool_result for each dangling tool_use
history.append({
"role": "user",
"content": [
{
"type": "tool_result",
"tool_use_id": tid,
"content": "Tool call was not completed (session interrupted).",
}
for tid in tool_use_ids
],
})
def _send_anthropic(md_content: str, user_message: str, base_dir: str) -> str: def _send_anthropic(md_content: str, user_message: str, base_dir: str) -> str:
"""
Send via Anthropic using chunked inline text.
Context is split into <=_ANTHROPIC_CHUNK_SIZE char blocks with
cache_control:ephemeral on the last block, then the user message is appended.
"""
try: try:
_ensure_anthropic_client() _ensure_anthropic_client()
@@ -434,6 +465,7 @@ def _send_anthropic(md_content: str, user_message: str, base_dir: str) -> str:
] ]
_strip_cache_controls(_anthropic_history) _strip_cache_controls(_anthropic_history)
_repair_anthropic_history(_anthropic_history)
_anthropic_history.append({"role": "user", "content": user_content}) _anthropic_history.append({"role": "user", "content": user_content})
n_chunks = len(context_blocks) n_chunks = len(context_blocks)
@@ -513,9 +545,25 @@ def _send_anthropic(md_content: str, user_message: str, base_dir: str) -> str:
"tool_use_id": block.id, "tool_use_id": block.id,
"content": output, "content": output,
}) })
elif block.type == "tool_use":
# Unknown tool - return an error result so history stays valid
tool_results.append({
"type": "tool_result",
"tool_use_id": block.id,
"content": f"ERROR: unknown tool '{block.name}'",
})
# Always append tool_results when stop_reason was tool_use,
# even if the list is somehow empty (shouldn't happen, but be safe)
if not tool_results: if not tool_results:
break # Synthesise a result for every tool_use block to keep history valid
for block in response.content:
if block.type == "tool_use":
tool_results.append({
"type": "tool_result",
"tool_use_id": block.id,
"content": "ERROR: tool could not be executed.",
})
_anthropic_history.append({ _anthropic_history.append({
"role": "user", "role": "user",

View File

@@ -1,8 +1,58 @@
[projects] [output]
namespace = "manual_slop"
output_dir = "./md_gen"
[files]
base_dir = "C:/projects/manual_slop"
paths = [ paths = [
"config.toml",
"ai_client.py",
"aggregate.py",
"gemini.py",
"gui.py",
"pyproject.toml",
"MainContext.md",
"C:/projects/manual_slop/shell_runner.py",
"C:/projects/manual_slop/session_logger.py",
"C:/projects/manual_slop/file_cache.py",
"C:/projects/manual_slop/theme.py",
"C:/projects/manual_slop/project_manager.py",
"C:/projects/manual_slop/manual_slop.toml", "C:/projects/manual_slop/manual_slop.toml",
] ]
active = "C:/projects/manual_slop/manual_slop.toml"
[screenshots]
base_dir = "C:/Users/Ed/scoop/apps/sharex/current/ShareX/Screenshots/2026-02"
paths = [
"C:/Users/Ed/scoop/apps/sharex/current/ShareX/Screenshots/2026-02/2026-02-21_19-40-16.png",
]
[discussion]
history = [
"User:\nOk it seems fixed now... (themeing for fonts, nice job). \nNow lets do those adjustments to discussion history:\nIt'd also be nice if we can collapse the discussion entries indvidual and with a collapse/expand all button.\nAlso there is no way right now for me to define new roles for the discussion other than by editing the source.\nShould at least be configurable frm the config.toml...",
"AI:\nGood, I have a clear picture. Here's the plan:\n\n**Changes needed:**\n1. **`config.toml`** — add `[discussion] roles = [...]` so roles are configurable\n2. **`gui.py`** — 4 targeted edits:\n - `DISC_ROLES` becomes a module-level fallback; the real list comes from config at load time and lives on `App`\n - `_parse_history_entries()` takes `roles` as a parameter\n - `_rebuild_disc_list()` — add collapse/expand per entry (using a `bool` `collapsed` flag in each dict), Collapse All / Expand All buttons in the toolbar\n - Add a \"Roles\" sub-section in the Discussion window for adding/removing role names from the config list, and wire it into `_flush_to_config()`\n\nI'll do this as a Python patch script to avoid PowerShell string escaping issues:",
"User:\nSure, go ahead and make to those change patches and apply them.",
"AI:\nAll 16 checks pass. Now update `MainContext.md` and clean up the patch file:\n(Note from user: the AI did so!)",
"User:\nLets add multiple project support. currently this project would be the \"manual_slop\" project. \nI need to make a separate \"manual_slop.toml\" for this and offload things that would be within a per project to it.\nI also want to have several discussion histories that I can label. \nThis would allow me to stash and continue separate effort's histories..\nIt would be important if these discussions saved the last git commit they were on. (I'll need a buton to manually update it).\nAnd timestamps on each discussion entry to give an idea of the duration involved and \nhow the project has evolved since the discussion stream's effort was last done.\nBasically preserve context so ai can use that as valuable information in its working memory.\n\nTo load a project I'll need to hoist it into the config by providing the path.\nMaybe allow multiple project tomls to be specified path wise in the array.",
"AI:\nAnnotated by user:\nNo response from AI, taking sceenshot of scripts run... and directory's state",
"User:\nHey it seems like you were not done want to continue?",
"AI:\nDid work, No response from AI (this is an annotated entry by the user), made project_manager.py, adding it to md context.",
"User:\ncontinue. You made a file but no changes have been made yet to gui.py. Still in progress to add all the multiple project support wishlist from user message earlier.",
"AI:\nNo response yet again maybe the response box is broken (User annotated)",
"User:\ncontinue. Sending multiple project wishlist more concise here:\n- Adding multiple project support. \n- Currently this project would be the \"manual_slop\" project. \n- Make a separate \"manual_slop.toml\" for this and offload things that would be within a per project to it.\n- Want to have several discussion histories that I can label. \n- This would allow me to stash and continue separate effort's histories..\n- It would be important if these discussions saved the last git commit they were on. (I'll need a buton to manually update it).\n- And timestamps on each discussion entry to give an idea of the duration involved and indicate if the project has evolved since the discussion stream's effort was last done.\n - Basically preserve context so ai can use that as valuable information in its working memory.\n- To load a project I'll need to hoist it into the config by providing the path.\n- Maybe allow multiple project tomls to be specified path wise in the array.",
"AI:\n(No response from ai again as a final message, most likely bugged...)",
"User:\ncontinue. You made a backup of gui.py before patching among other misc changes. (See screenshots)",
"Vendor API:\nERROR: Error code: 400 - {'type': 'error', 'error': {'type': 'invalid_request_error', 'message': 'messages.36: `tool_use` ids were found without `tool_result` blocks immediately after: toolu_01EhYwL9u1XRe2561myVh6pG. Each `tool_use` block must have a corresponding `tool_result` block in the next message.'}, 'request_id': 'req_011CYNASDjd17PQzS6dGWDEN'}",
"User:\ncontinue. we got an error last messaage still working on multiple project support.",
"AI:\nGood. I have a complete picture. Here's the plan:\n\n**What we need to do:**\n\n1. **Create `manual_slop.toml`** — the per-project file, migrated from `config.toml`, with the new project structure (`project_manager.default_project` shape)\n2. **Update `config.toml`** — strip out project-specific sections, add `[projects]` array pointing to `manual_slop.toml`, keep `[ai]` and `[theme]` here as \"global\" app config\n3. **Rewrite `gui.py`** with a Python patch script that adds:\n - Project loading/switching panel (load from path, list of loaded projects, active project indicator)\n - Discussion switcher (list discussions by label, new/rename/delete discussion)\n - Git commit display + \"Update Commit\" button per discussion\n - Timestamps on entries (wired to `project_manager.entry_to_str/str_to_entry`)\n - All save/flush operations target the active project `.toml` via `project_manager.save_project()`\n - `App` state restructured: `self.proj` (active project dict), `self.proj_path`, `self.active_disc_name`\n\nI'll use a Python patch script to avoid PowerShell escaping issues. Let me write it:",
"User:\nPlan of action sounds good, go for it!",
"AI:\nGood. Now I'll write the Python patch script. This is a large change so I'll write it to a file and run it:",
]
roles = [
"User",
"AI",
"Vendor API",
"System",
]
[ai] [ai]
provider = "anthropic" provider = "anthropic"

View File

@@ -10,15 +10,15 @@ Collapsed=0
[Window][###22] [Window][###22]
Pos=0,0 Pos=0,0
Size=394,326 Size=498,253
Collapsed=0 Collapsed=0
DockId=0x0000002F,0 DockId=0x00000039,0
[Window][###30] [Window][###30]
Pos=0,654 Pos=0,654
Size=394,696 Size=498,853
Collapsed=0 Collapsed=0
DockId=0x00000027,0 DockId=0x0000003B,0
[Window][###66] [Window][###66]
Pos=0,1491 Pos=0,1491
@@ -63,7 +63,7 @@ Collapsed=0
[Window][###126] [Window][###126]
Pos=396,0 Pos=396,0
Size=1367,2137 Size=783,2137
Collapsed=0 Collapsed=0
DockId=0x00000031,0 DockId=0x00000031,0
@@ -104,17 +104,17 @@ DockId=0x00000014,0
Pos=2531,0 Pos=2531,0
Size=1309,1690 Size=1309,1690
Collapsed=0 Collapsed=0
DockId=0x00000032,0 DockId=0x0000001F,0
[Window][###106] [Window][###106]
Pos=601,0 Pos=601,0
Size=922,2137 Size=922,2137
Collapsed=0 Collapsed=0
DockId=0x00000012,0 DockId=0x00000037,0
[Window][###100] [Window][###100]
Pos=396,0 Pos=396,0
Size=1367,2137 Size=783,2137
Collapsed=0 Collapsed=0
DockId=0x00000031,1 DockId=0x00000031,1
@@ -147,11 +147,11 @@ Collapsed=0
Pos=376,0 Pos=376,0
Size=942,2137 Size=942,2137
Collapsed=0 Collapsed=0
DockId=0x00000012,2 DockId=0x00000037,2
[Window][###78] [Window][###78]
Pos=0,1422 Pos=0,1422
Size=549,715 Size=498,715
Collapsed=0 Collapsed=0
DockId=0x0000001E,0 DockId=0x0000001E,0
@@ -165,7 +165,7 @@ DockId=0x00000015,0
Pos=551,0 Pos=551,0
Size=1060,2137 Size=1060,2137
Collapsed=0 Collapsed=0
DockId=0x00000032,1 DockId=0x0000001F,1
[Window][###110] [Window][###110]
Pos=2438,0 Pos=2438,0
@@ -174,10 +174,10 @@ Collapsed=0
DockId=0x00000016,0 DockId=0x00000016,0
[Window][###112] [Window][###112]
Pos=376,0 Pos=500,0
Size=942,2137 Size=745,2137
Collapsed=0 Collapsed=0
DockId=0x00000012,1 DockId=0x00000037,0
[Window][###145] [Window][###145]
Pos=1578,868 Pos=1578,868
@@ -213,7 +213,7 @@ Collapsed=0
Pos=351,0 Pos=351,0
Size=645,1548 Size=645,1548
Collapsed=0 Collapsed=0
DockId=0x00000012,0 DockId=0x00000037,0
[Window][###75] [Window][###75]
Pos=0,1352 Pos=0,1352
@@ -222,16 +222,16 @@ Collapsed=0
DockId=0x00000022,0 DockId=0x00000022,0
[Window][###85] [Window][###85]
Pos=1765,0 Pos=1181,0
Size=808,2137 Size=1224,2137
Collapsed=0 Collapsed=0
DockId=0x00000032,0 DockId=0x0000001F,0
[Window][###92] [Window][###92]
Pos=376,0 Pos=376,0
Size=942,2137 Size=942,2137
Collapsed=0 Collapsed=0
DockId=0x00000012,0 DockId=0x00000037,0
[Window][###107] [Window][###107]
Pos=1525,1414 Pos=1525,1414
@@ -240,10 +240,10 @@ Collapsed=0
DockId=0x0000001A,0 DockId=0x0000001A,0
[Window][###109] [Window][###109]
Pos=351,0 Pos=500,0
Size=645,1548 Size=858,2137
Collapsed=0 Collapsed=0
DockId=0x00000012,2 DockId=0x00000037,0
[Window][###142] [Window][###142]
Pos=0,328 Pos=0,328
@@ -302,19 +302,19 @@ DockId=0x00000028,0
Pos=998,0 Pos=998,0
Size=853,602 Size=853,602
Collapsed=0 Collapsed=0
DockId=0x00000032,0 DockId=0x0000001F,0
[Window][###89] [Window][###89]
Pos=351,0 Pos=351,0
Size=645,1548 Size=645,1548
Collapsed=0 Collapsed=0
DockId=0x00000012,1 DockId=0x00000037,1
[Window][###97] [Window][###97]
Pos=998,604 Pos=1247,0
Size=1745,944 Size=1055,2137
Collapsed=0 Collapsed=0
DockId=0x00000020,0 DockId=0x00000031,0
[Window][###139] [Window][###139]
Pos=1578,868 Pos=1578,868
@@ -472,8 +472,8 @@ Size=700,440
Collapsed=0 Collapsed=0
[Window][###108] [Window][###108]
Pos=2575,0 Pos=2407,0
Size=1265,966 Size=1433,968
Collapsed=0 Collapsed=0
DockId=0x0000002B,0 DockId=0x0000002B,0
@@ -559,16 +559,16 @@ Size=700,440
Collapsed=0 Collapsed=0
[Window][###116] [Window][###116]
Pos=2575,968 Pos=2407,970
Size=1265,1169 Size=1433,1167
Collapsed=0 Collapsed=0
DockId=0x0000002C,0 DockId=0x0000002C,0
[Window][###120] [Window][###120]
Pos=396,0 Pos=2304,1071
Size=1367,2137 Size=1536,1066
Collapsed=0 Collapsed=0
DockId=0x00000031,2 DockId=0x00000020,0
[Window][###12467] [Window][###12467]
Pos=1578,868 Pos=1578,868
@@ -655,47 +655,153 @@ Pos=1578,868
Size=700,440 Size=700,440
Collapsed=0 Collapsed=0
[Window][###151]
Pos=0,255
Size=498,397
Collapsed=0
DockId=0x00000034,0
[Window][###94]
Pos=1360,0
Size=621,2137
Collapsed=0
DockId=0x00000038,0
[Window][###117]
Pos=1983,0
Size=1857,1171
Collapsed=0
DockId=0x00000035,0
[Window][###125]
Pos=1983,1173
Size=1857,964
Collapsed=0
DockId=0x0000001F,0
[Window][###129]
Pos=500,0
Size=858,2137
Collapsed=0
DockId=0x00000037,2
[Window][###135]
Pos=500,0
Size=858,2137
Collapsed=0
DockId=0x00000037,1
[Window][###341]
Pos=1578,868
Size=700,440
Collapsed=0
[Window][###416]
Pos=1578,868
Size=700,440
Collapsed=0
[Window][###506]
Pos=1578,868
Size=700,440
Collapsed=0
[Window][###589]
Pos=1578,868
Size=700,440
Collapsed=0
[Window][###154]
Pos=0,412
Size=498,240
Collapsed=0
DockId=0x0000003A,0
[Window][###81]
Pos=0,1509
Size=498,628
Collapsed=0
DockId=0x0000003C,0
[Window][###128]
Pos=2304,0
Size=1536,1069
Collapsed=0
DockId=0x0000001F,0
[Window][###132]
Pos=500,0
Size=745,2137
Collapsed=0
DockId=0x00000037,2
[Window][###138]
Pos=500,0
Size=745,2137
Collapsed=0
DockId=0x00000037,1
[Window][###358]
Pos=1578,868
Size=700,440
Collapsed=0
[Window][###458]
Pos=1578,868
Size=700,440
Collapsed=0
[Docking][Data] [Docking][Data]
DockSpace ID=0x7C6B3D9B Window=0xA87D555D Pos=0,0 Size=3840,2137 Split=X Selected=0x40484D8F DockSpace ID=0x7C6B3D9B Window=0xA87D555D Pos=0,0 Size=3840,2137 Split=X Selected=0x40484D8F
DockNode ID=0x00000003 Parent=0x7C6B3D9B SizeRef=394,1161 Split=Y Selected=0xEE087978 DockNode ID=0x00000003 Parent=0x7C6B3D9B SizeRef=498,1161 Split=Y Selected=0xEE087978
DockNode ID=0x00000005 Parent=0x00000003 SizeRef=235,354 Split=Y Selected=0xEE087978 DockNode ID=0x00000005 Parent=0x00000003 SizeRef=235,354 Split=Y Selected=0xEE087978
DockNode ID=0x0000002D Parent=0x00000005 SizeRef=374,239 Split=Y Selected=0xEE087978 DockNode ID=0x0000002D Parent=0x00000005 SizeRef=374,239 Split=Y Selected=0xEE087978
DockNode ID=0x0000002F Parent=0x0000002D SizeRef=374,326 Selected=0xEE087978 DockNode ID=0x0000002F Parent=0x0000002D SizeRef=374,326 Split=Y Selected=0xEE087978
DockNode ID=0x00000033 Parent=0x0000002F SizeRef=394,253 Split=Y Selected=0xEE087978
DockNode ID=0x00000039 Parent=0x00000033 SizeRef=498,410 Selected=0xEE087978
DockNode ID=0x0000003A Parent=0x00000033 SizeRef=498,240 Selected=0x2DE5F58C
DockNode ID=0x00000034 Parent=0x0000002F SizeRef=394,397 Selected=0xE5057AFC
DockNode ID=0x00000030 Parent=0x0000002D SizeRef=374,324 Selected=0x69F9D389 DockNode ID=0x00000030 Parent=0x0000002D SizeRef=374,324 Selected=0x69F9D389
DockNode ID=0x0000002E Parent=0x00000005 SizeRef=374,411 Selected=0xFBBC1691 DockNode ID=0x0000002E Parent=0x00000005 SizeRef=374,411 Selected=0xFBBC1691
DockNode ID=0x00000006 Parent=0x00000003 SizeRef=235,805 Split=Y Selected=0x5F94F9BD DockNode ID=0x00000006 Parent=0x00000003 SizeRef=235,805 Split=Y Selected=0x5F94F9BD
DockNode ID=0x00000009 Parent=0x00000006 SizeRef=235,453 Split=Y Selected=0x5F94F9BD DockNode ID=0x00000009 Parent=0x00000006 SizeRef=235,453 Split=Y Selected=0x5F94F9BD
DockNode ID=0x0000001D Parent=0x00000009 SizeRef=364,766 Split=Y Selected=0x5F94F9BD DockNode ID=0x0000001D Parent=0x00000009 SizeRef=364,766 Split=Y Selected=0x5F94F9BD
DockNode ID=0x00000021 Parent=0x0000001D SizeRef=549,696 Split=Y Selected=0x5F94F9BD DockNode ID=0x00000021 Parent=0x0000001D SizeRef=549,696 Split=Y Selected=0x5F94F9BD
DockNode ID=0x00000027 Parent=0x00000021 SizeRef=549,793 Selected=0x5F94F9BD DockNode ID=0x00000027 Parent=0x00000021 SizeRef=549,793 Split=Y Selected=0x5F94F9BD
DockNode ID=0x0000003B Parent=0x00000027 SizeRef=498,853 Selected=0x5F94F9BD
DockNode ID=0x0000003C Parent=0x00000027 SizeRef=498,628 Selected=0x083320CE
DockNode ID=0x00000028 Parent=0x00000021 SizeRef=549,688 Selected=0xBEC5E8CB DockNode ID=0x00000028 Parent=0x00000021 SizeRef=549,688 Selected=0xBEC5E8CB
DockNode ID=0x00000022 Parent=0x0000001D SizeRef=549,785 Selected=0x0CE534DB DockNode ID=0x00000022 Parent=0x0000001D SizeRef=549,785 Selected=0x0CE534DB
DockNode ID=0x0000001E Parent=0x00000009 SizeRef=364,715 Selected=0xF475F06A DockNode ID=0x0000001E Parent=0x00000009 SizeRef=364,715 Selected=0xF475F06A
DockNode ID=0x0000000A Parent=0x00000006 SizeRef=235,350 Selected=0x80199DAE DockNode ID=0x0000000A Parent=0x00000006 SizeRef=235,350 Selected=0x80199DAE
DockNode ID=0x00000004 Parent=0x7C6B3D9B SizeRef=3444,1161 Split=X DockNode ID=0x00000004 Parent=0x7C6B3D9B SizeRef=3340,1161 Split=X
DockNode ID=0x00000001 Parent=0x00000004 SizeRef=1060,1161 Split=Y Selected=0x40484D8F DockNode ID=0x00000001 Parent=0x00000004 SizeRef=1060,1161 Split=Y Selected=0x40484D8F
DockNode ID=0x00000007 Parent=0x00000001 SizeRef=595,492 Selected=0xBA13FCDE DockNode ID=0x00000007 Parent=0x00000001 SizeRef=595,492 Selected=0xBA13FCDE
DockNode ID=0x00000008 Parent=0x00000001 SizeRef=595,1643 Split=X Selected=0x40484D8F DockNode ID=0x00000008 Parent=0x00000001 SizeRef=595,1643 Split=X Selected=0x40484D8F
DockNode ID=0x0000000F Parent=0x00000008 SizeRef=942,2137 Split=Y Selected=0x07E8375F DockNode ID=0x0000000F Parent=0x00000008 SizeRef=1481,2137 Split=Y Selected=0x07E8375F
DockNode ID=0x00000011 Parent=0x0000000F SizeRef=835,425 Selected=0x72F373AE DockNode ID=0x00000011 Parent=0x0000000F SizeRef=835,425 Selected=0x72F373AE
DockNode ID=0x00000012 Parent=0x0000000F SizeRef=835,1710 Selected=0x73845A9B DockNode ID=0x00000012 Parent=0x0000000F SizeRef=835,1710 Split=X Selected=0xC6DC3F21
DockNode ID=0x00000010 Parent=0x00000008 SizeRef=2520,2137 Split=Y Selected=0xCE7F911A DockNode ID=0x00000037 Parent=0x00000012 SizeRef=858,2137 Selected=0xC6DC3F21
DockNode ID=0x00000038 Parent=0x00000012 SizeRef=621,2137 Selected=0x0B8F7C1B
DockNode ID=0x00000010 Parent=0x00000008 SizeRef=1857,2137 Split=Y Selected=0xCE7F911A
DockNode ID=0x00000013 Parent=0x00000010 SizeRef=1967,1690 Split=X Selected=0xCE7F911A DockNode ID=0x00000013 Parent=0x00000010 SizeRef=1967,1690 Split=X Selected=0xCE7F911A
DockNode ID=0x00000017 Parent=0x00000013 SizeRef=1314,1749 Selected=0x4B454E0B DockNode ID=0x00000017 Parent=0x00000013 SizeRef=1314,1749 Selected=0x4B454E0B
DockNode ID=0x00000018 Parent=0x00000013 SizeRef=1309,1749 Split=Y Selected=0x88A8C2FF DockNode ID=0x00000018 Parent=0x00000013 SizeRef=1309,1749 Split=Y Selected=0x88A8C2FF
DockNode ID=0x00000019 Parent=0x00000018 SizeRef=2440,1412 Split=X Selected=0x88A8C2FF DockNode ID=0x00000019 Parent=0x00000018 SizeRef=2440,1412 Split=X Selected=0x88A8C2FF
DockNode ID=0x00000023 Parent=0x00000019 SizeRef=2177,737 Split=Y Selected=0x4F935A1E DockNode ID=0x00000023 Parent=0x00000019 SizeRef=2009,737 Split=Y Selected=0x4F935A1E
DockNode ID=0x0000001F Parent=0x00000023 SizeRef=2315,1191 Split=Y Selected=0x4F935A1E DockNode ID=0x00000025 Parent=0x00000023 SizeRef=2315,1244 Split=X Selected=0x4F935A1E
DockNode ID=0x00000025 Parent=0x0000001F SizeRef=2315,1244 Split=X Selected=0x4F935A1E
DockNode ID=0x00000029 Parent=0x00000025 SizeRef=853,1867 Split=X Selected=0xFDB3860E DockNode ID=0x00000029 Parent=0x00000025 SizeRef=853,1867 Split=X Selected=0xFDB3860E
DockNode ID=0x00000031 Parent=0x00000029 SizeRef=1367,2137 Selected=0x4A209654 DockNode ID=0x00000031 Parent=0x00000029 SizeRef=1055,2137 Selected=0x4C2F06CB
DockNode ID=0x00000032 Parent=0x00000029 SizeRef=808,2137 CentralNode=1 Selected=0xFDB3860E DockNode ID=0x00000032 Parent=0x00000029 SizeRef=1536,2137 Split=Y Selected=0x0D80EC84
DockNode ID=0x00000035 Parent=0x00000032 SizeRef=2500,1171 Selected=0xF1D4CD4A
DockNode ID=0x00000036 Parent=0x00000032 SizeRef=2500,964 Split=Y Selected=0xF5102835
DockNode ID=0x0000001F Parent=0x00000036 SizeRef=1325,1069 CentralNode=1 Selected=0x0D80EC84
DockNode ID=0x00000020 Parent=0x00000036 SizeRef=1325,1066 Selected=0xC56063F4
DockNode ID=0x0000002A Parent=0x00000025 SizeRef=890,1867 Selected=0x40484D8F DockNode ID=0x0000002A Parent=0x00000025 SizeRef=890,1867 Selected=0x40484D8F
DockNode ID=0x00000026 Parent=0x0000001F SizeRef=2315,621 Selected=0x7D28643F DockNode ID=0x00000026 Parent=0x00000023 SizeRef=2315,621 Selected=0x7D28643F
DockNode ID=0x00000020 Parent=0x00000023 SizeRef=2315,944 Selected=0x4C2F06CB DockNode ID=0x00000024 Parent=0x00000019 SizeRef=1433,737 Split=Y Selected=0xB8D8893E
DockNode ID=0x00000024 Parent=0x00000019 SizeRef=1265,737 Split=Y Selected=0xB8D8893E DockNode ID=0x0000002B Parent=0x00000024 SizeRef=1153,968 Selected=0xB8D8893E
DockNode ID=0x0000002B Parent=0x00000024 SizeRef=1153,966 Selected=0xB8D8893E DockNode ID=0x0000002C Parent=0x00000024 SizeRef=1153,1167 Selected=0xCCB4E4FA
DockNode ID=0x0000002C Parent=0x00000024 SizeRef=1153,1169 Selected=0xCCB4E4FA
DockNode ID=0x0000001A Parent=0x00000018 SizeRef=2440,723 Selected=0x3A881EEF DockNode ID=0x0000001A Parent=0x00000018 SizeRef=2440,723 Selected=0x3A881EEF
DockNode ID=0x00000014 Parent=0x00000010 SizeRef=1967,445 Selected=0xC36FF36B DockNode ID=0x00000014 Parent=0x00000010 SizeRef=1967,445 Selected=0xC36FF36B
DockNode ID=0x00000002 Parent=0x00000004 SizeRef=2227,1161 Split=X Selected=0x714F2F7B DockNode ID=0x00000002 Parent=0x00000004 SizeRef=2227,1161 Split=X Selected=0x714F2F7B