netcodex-agent-exporter 0.3.0__tar.gz → 0.3.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/.gitignore +3 -0
  2. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/PKG-INFO +70 -29
  3. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/README.md +69 -28
  4. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/pyproject.toml +4 -1
  5. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/__init__.py +1 -1
  6. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/cli.py +69 -1
  7. netcodex_agent_exporter-0.3.2/src/netcodex/sources/locations.py +565 -0
  8. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/web/api.py +65 -22
  9. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/404/index.html +1 -0
  10. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/404.html +1 -0
  11. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/__next.__PAGE__.txt +9 -0
  12. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/__next._full.txt +17 -0
  13. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/__next._head.txt +5 -0
  14. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/__next._index.txt +5 -0
  15. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/__next._tree.txt +2 -0
  16. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/I0mRqzUWWnK0TU4TefL86/_buildManifest.js +11 -0
  17. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/I0mRqzUWWnK0TU4TefL86/_clientMiddlewareManifest.js +1 -0
  18. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/I0mRqzUWWnK0TU4TefL86/_ssgManifest.js +1 -0
  19. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/05-c3ty_6dwfk.js +1 -0
  20. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/0cz1d0mv5g_q7.js +1 -0
  21. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/0xs948yx7egqf.js +1 -0
  22. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/0y-qmi6py9vt0.js +2 -0
  23. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/14mrh2-p_w84d.js +1 -0
  24. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/15orcrkp-_9ct.js +4 -0
  25. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/16x2ab5tjuq8p.js +1 -0
  26. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/1rxncug86bump.js +1 -0
  27. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/1zrw-wzjvs1a7.js +1 -0
  28. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/1zz7ddvqh9xr5.js +1 -0
  29. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/24w1ykbgdtn0d.js +1 -0
  30. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/27gsbatdo0vgh.js +10 -0
  31. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/2cnskixvc-f-1.js +1 -0
  32. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/2nykiepra7i1k.js +1 -0
  33. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/2wfuz7opg3uv2.js +20 -0
  34. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/3rbfc1m17ic0f.css +1 -0
  35. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/3z5q_p4msz2ha.js +31 -0
  36. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/turbopack-1_6kmb9wb6nxy.js +1 -0
  37. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_not-found/__next._full.txt +15 -0
  38. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_not-found/__next._head.txt +5 -0
  39. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_not-found/__next._index.txt +5 -0
  40. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_not-found/__next._not-found.__PAGE__.txt +5 -0
  41. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_not-found/__next._not-found.txt +5 -0
  42. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_not-found/__next._tree.txt +2 -0
  43. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_not-found/index.html +1 -0
  44. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_not-found/index.txt +15 -0
  45. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/app/__next._full.txt +19 -0
  46. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/app/__next._head.txt +5 -0
  47. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/app/__next._index.txt +5 -0
  48. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/app/__next._tree.txt +2 -0
  49. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/app/__next.app.__PAGE__.txt +9 -0
  50. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/app/__next.app.txt +5 -0
  51. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/app/index.html +1 -0
  52. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/app/index.txt +19 -0
  53. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/brand/netcodex-logo-v2-icon.png +0 -0
  54. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/brand/netcodex-logo-v2.png +0 -0
  55. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/brand/netcodex-logo.png +0 -0
  56. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/index.html +1 -0
  57. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/index.txt +17 -0
  58. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/install/__next._full.txt +25 -0
  59. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/install/__next._head.txt +5 -0
  60. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/install/__next._index.txt +5 -0
  61. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/install/__next._tree.txt +3 -0
  62. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/install/__next.install.__PAGE__.txt +7 -0
  63. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/install/__next.install.txt +5 -0
  64. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/install/index.html +5 -0
  65. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/install/index.txt +25 -0
  66. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/where/__next._full.txt +16 -0
  67. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/where/__next._head.txt +5 -0
  68. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/where/__next._index.txt +5 -0
  69. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/where/__next._tree.txt +2 -0
  70. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/where/__next.where.__PAGE__.txt +6 -0
  71. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/where/__next.where.txt +5 -0
  72. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/where/index.html +1 -0
  73. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/where/index.txt +16 -0
  74. netcodex_agent_exporter-0.3.2/src/netcodex/web/local_api.py +267 -0
  75. netcodex_agent_exporter-0.3.2/src/netcodex/web/local_ui.py +107 -0
  76. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/golden/claude-conversation.md +1 -1
  77. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/golden/claude-v2.md +1 -1
  78. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/golden/codex-conversation.md +1 -1
  79. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/golden/codex-v2-full.md +1 -1
  80. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/golden/codex-v2.md +1 -1
  81. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/test_local_ui.py +75 -2
  82. netcodex_agent_exporter-0.3.2/tests/test_locations.py +211 -0
  83. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/test_web_api.py +1 -0
  84. netcodex_agent_exporter-0.3.0/src/netcodex/web/local_ui.py +0 -190
  85. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/LICENSE +0 -0
  86. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/scripts/netcodex_entry.py +0 -0
  87. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/incremental.py +0 -0
  88. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/models.py +0 -0
  89. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/renderers/__init__.py +0 -0
  90. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/renderers/markdown.py +0 -0
  91. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/renderers/quarkdown.py +0 -0
  92. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/security/__init__.py +0 -0
  93. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/security/redaction.py +0 -0
  94. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/services.py +0 -0
  95. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/sources/__init__.py +0 -0
  96. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/sources/aider.py +0 -0
  97. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/sources/antigravity.py +0 -0
  98. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/sources/claude.py +0 -0
  99. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/sources/claude_ai.py +0 -0
  100. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/sources/cline.py +0 -0
  101. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/sources/codex.py +0 -0
  102. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/sources/common.py +0 -0
  103. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/sources/continue_dev.py +0 -0
  104. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/sources/copilot_chat.py +0 -0
  105. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/sources/copilot_cli.py +0 -0
  106. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/sources/cursor.py +0 -0
  107. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/sources/encrypted.py +0 -0
  108. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/sources/gemini_cli.py +0 -0
  109. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/sources/paths.py +0 -0
  110. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/sources/registry.py +0 -0
  111. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/web/__init__.py +0 -0
  112. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/web/static/local.html +0 -0
  113. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/conftest.py +0 -0
  114. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/claude/normal-session.jsonl +0 -0
  115. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/claude/session-fixture.jsonl +0 -0
  116. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/claude_v2/home/.claude/projects/C--Users-Example-app/aaaaaaaa-1111-4222-8333-444444444444/subagents/agent-a1b2.jsonl +0 -0
  117. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/claude_v2/home/.claude/projects/C--Users-Example-app/aaaaaaaa-1111-4222-8333-444444444444/subagents/agent-a1b2.meta.json +0 -0
  118. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/claude_v2/home/.claude/projects/C--Users-Example-app/aaaaaaaa-1111-4222-8333-444444444444.jsonl +0 -0
  119. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/claude_v2/home/.claude/projects/C--Users-Example-app/bbbbbbbb-1111-4222-8333-444444444444.jsonl +0 -0
  120. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/claude_v2/home/AppData/Roaming/Claude/claude-code-sessions/acct-1/org-1/local_d1.json +0 -0
  121. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/claude_v2/home/AppData/Roaming/Claude/local-agent-mode-sessions/acct-1/org-1/local_c1/.claude/projects/-sessions-keen-gauss/cccccccc-1111-4222-8333-444444444444.jsonl +0 -0
  122. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/claude_v2/home/AppData/Roaming/Claude/local-agent-mode-sessions/acct-1/org-1/local_c1.json +0 -0
  123. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/codex/sessions/2026/06/07/rollout-fixture.jsonl +0 -0
  124. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/codex_v2/archived_sessions/rollout-2026-06-01T09-00-00-99999999-8888-4777-8666-555555555555.jsonl +0 -0
  125. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/codex_v2/session_index.jsonl +0 -0
  126. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/codex_v2/sessions/2026/06/08/rollout-2026-06-08T10-00-00-11111111-2222-4333-8444-555555555555.jsonl +0 -0
  127. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/codex_v2/sessions/2026/06/08/rollout-2026-06-08T10-00-10-66666666-7777-4888-9999-aaaaaaaaaaaa.jsonl +0 -0
  128. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/golden/claude-conversation.qd +0 -0
  129. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/sources_v3/appdata/Code/User/globalStorage/kilocode.kilo-code/tasks/1781000100000/api_conversation_history.json +0 -0
  130. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/sources_v3/appdata/Code/User/globalStorage/kilocode.kilo-code/tasks/1781000100000/ui_messages.json +0 -0
  131. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/sources_v3/appdata/Code/User/workspaceStorage/0a1b2c3d/chatSessions/copilot-session-1.jsonl +0 -0
  132. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/sources_v3/appdata/Code/User/workspaceStorage/0a1b2c3d/chatSessions/empty-session.json +0 -0
  133. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/sources_v3/appdata/Code/User/workspaceStorage/0a1b2c3d/chatSessions/legacy-session.json +0 -0
  134. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/sources_v3/appdata/Code/User/workspaceStorage/0a1b2c3d/workspace.json +0 -0
  135. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/sources_v3/home/.continue/sessions/continue-1.json +0 -0
  136. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/sources_v3/home/.continue/sessions/sessions.json +0 -0
  137. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/sources_v3/home/.copilot/session-state/cli-session-1/events.jsonl +0 -0
  138. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/sources_v3/home/.copilot/session-state/cli-session-1/workspace.yaml +0 -0
  139. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/sources_v3/home/.gemini/tmp/projhash1/chats/session-2026-06-13T10-00-abc.json +0 -0
  140. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/sources_v3/home/.gemini/tmp/projhash2/logs.json +0 -0
  141. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/sources_v3/home/Downloads/claude-export/conversations.json +0 -0
  142. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/sources_v3/home/code/webshop/.aider.chat.history.md +0 -0
  143. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/test_cli.py +0 -0
  144. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/test_export_layout.py +0 -0
  145. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/test_golden_outputs.py +0 -0
  146. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/test_incremental.py +0 -0
  147. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/test_redaction.py +0 -0
  148. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/test_registry_export_all.py +0 -0
  149. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/test_renderers.py +0 -0
  150. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/test_sources.py +0 -0
  151. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/test_sources_antigravity.py +0 -0
  152. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/test_sources_cli_tools.py +0 -0
  153. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/test_sources_v2.py +0 -0
  154. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/test_sources_vscode_family.py +0 -0
  155. {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/test_workflow_manifest.py +0 -0
@@ -30,3 +30,6 @@ docs/architecture/generated/
30
30
  # PyInstaller
31
31
  *.spec
32
32
  binaries/
33
+
34
+ # Built export desk (generated by npm run desk:build, shipped in the wheel)
35
+ src/netcodex/web/desk/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: netcodex-agent-exporter
3
- Version: 0.3.0
3
+ Version: 0.3.2
4
4
  Summary: Local-first exporter for AI agent conversations (Codex, Claude Code, Copilot, Cline, Cursor, Gemini CLI and more) to Markdown.
5
5
  Project-URL: Homepage, https://gitlab.com/netcodex-tech/agent-conversation-exporter
6
6
  Project-URL: Repository, https://gitlab.com/netcodex-tech/agent-conversation-exporter
@@ -41,24 +41,44 @@ and Codex into Markdown, Quarkdown and PDF.
41
41
 
42
42
  ## Status
43
43
 
44
- Version 0.2 ("correct exports"). Supported sources:
45
-
46
- | Source | Where it is read from | Client labels (`tool`) |
47
- | --- | --- | --- |
48
- | Codex CLI / VS Code extension / Codex Desktop | `$CODEX_HOME` or `~/.codex`: newest `state_*.sqlite` (`threads`, `thread_spawn_edges`), `session_index.jsonl` titles, rollout JSONL in `sessions/` and `archived_sessions/` | `codex-cli`, `codex-vscode`, `codex-desktop` |
49
- | Claude Code CLI / VS Code | `$CLAUDE_CONFIG_DIR/projects` or `~/.claude/projects/**/<session>.jsonl`; subagents in `<session>/subagents/agent-*.jsonl` are grouped under their parent | `claude-code-cli`, `claude-code-vscode` |
50
- | Claude desktop "Code" tab | Same JSONL, titled from `%APPDATA%/Claude/claude-code-sessions/**/local_*.json` | `claude-desktop` |
51
- | Claude desktop Cowork | `%APPDATA%/Claude/local-agent-mode-sessions/**/local_<id>.json` + `local_<id>/.claude/projects/**/*.jsonl` | `claude-cowork` |
52
- | GitHub Copilot Chat (`copilot-chat`) | `<editor>/User/workspaceStorage/*/chatSessions/*.jsonl` (operation log) or `.json`, `globalStorage/emptyWindowChatSessions` in every VS Code-family editor | `copilot-chat-<editor>` |
53
- | Cline / Roo Code / Kilo Code (`cline`) | `<editor>/User/globalStorage/<extension>/tasks/<id>/api_conversation_history.json` | `cline-*`, `roo-code-*`, `kilo-code-*` |
54
- | Cursor (`cursor`) | `Cursor/User/globalStorage/state.vscdb` (`cursorDiskKV` composer + bubbles) | `cursor` |
55
- | GitHub Copilot CLI (`copilot-cli`) | `~/.copilot/session-state/<id>/events.jsonl` | `copilot-cli` |
56
- | Gemini CLI (`gemini-cli`) | `~/.gemini/tmp/<hash>/chats/session-*.json`, `logs.json` | `gemini-cli` |
57
- | Continue (`continue`) | `~/.continue/sessions/*.json` | `continue` |
58
- | Aider (`aider`) | `.aider.chat.history.md` in repos under `NETCODEX_AIDER_PATHS` or the home folder (depth 3) | `aider` |
59
- | claude.ai chats (`claude-ai`) | Official export ZIP / `conversations.json` from `NETCODEX_CLAUDE_AI_EXPORT` or `~/Downloads` | `claude-ai` |
60
- | Google Antigravity (`antigravity`) | `~/.gemini/antigravity/conversation_summaries.db` + `conversations/*.db` (schemaless protobuf, best effort; legacy encrypted `.pb` skipped) | `antigravity` |
61
- | Trae, Windsurf (`trae`, `windsurf`) | Encrypted stores: reported by `netcodex sources`, not exported | - |
44
+ Version 0.3. Supported tools, where each one keeps its chats, and how to import them
45
+ (`netcodex where` prints the same table with the paths that exist on your machine).
46
+
47
+ ### Where are my chats?
48
+
49
+ <!-- netcodex:where:start (generated by scripts/export_locations.py) -->
50
+ | Tool | Status | Windows | macOS / Linux | Import via |
51
+ | --- | --- | --- | --- | --- |
52
+ | Codex CLI / VS Code / Desktop | supported; override: `CODEX_HOME` | `%USERPROFILE%\.codex\sessions\YYYY\MM\DD\rollout-*.jsonl`<br>`%USERPROFILE%\.codex\archived_sessions\rollout-*.jsonl`<br>`%USERPROFILE%\.codex\state_*.sqlite`<br>`%USERPROFILE%\.codex\session_index.jsonl` | `~/.codex/sessions/YYYY/MM/DD/rollout-*.jsonl`<br>`~/.codex/archived_sessions/rollout-*.jsonl`<br>`~/.codex/state_*.sqlite`<br>`~/.codex/session_index.jsonl` | Upload files, Local sources, CLI |
53
+ | Claude Code CLI / VS Code | supported; override: `CLAUDE_CONFIG_DIR` | `%USERPROFILE%\.claude\projects\<project>\<session>.jsonl` | `~/.claude/projects/<project>/<session>.jsonl` | Upload files, Local sources, CLI |
54
+ | Claude Desktop (Code tab) | supported; override: `CLAUDE_CONFIG_DIR` | `%APPDATA%\Claude\claude-code-sessions\**\local_*.json`<br>`%USERPROFILE%\.claude\projects\<project>\<session>.jsonl` | `<config>/Claude/claude-code-sessions/**/local_*.json`<br>`~/.claude/projects/<project>/<session>.jsonl` | Local sources, CLI |
55
+ | Claude Cowork | supported | `%APPDATA%\Claude\local-agent-mode-sessions\**\local_<id>.json`<br>`%APPDATA%\Claude\local-agent-mode-sessions\**\local_<id>\.claude\projects\**\*.jsonl` | `<config>/Claude/local-agent-mode-sessions/**/local_<id>.json`<br>`<config>/Claude/local-agent-mode-sessions/**/local_<id>/.claude/projects/**/*.jsonl` | Local sources, CLI |
56
+ | Claude.ai (official data export) | supported; override: `NETCODEX_CLAUDE_AI_EXPORT` | `%USERPROFILE%\Downloads\data-*.zip`<br>`%USERPROFILE%\Downloads\<folder>\conversations.json` | `~/Downloads/data-*.zip`<br>`~/Downloads/<folder>/conversations.json` | Local sources, CLI |
57
+ | GitHub Copilot Chat | supported | `%APPDATA%\<editor>\User\workspaceStorage\<hash>\chatSessions\*.jsonl`<br>`%APPDATA%\<editor>\User\workspaceStorage\<hash>\chatSessions\*.json`<br>`%APPDATA%\<editor>\User\globalStorage\emptyWindowChatSessions\*.json` | `<config>/<editor>/User/workspaceStorage/<hash>/chatSessions/*.jsonl`<br>`<config>/<editor>/User/workspaceStorage/<hash>/chatSessions/*.json`<br>`<config>/<editor>/User/globalStorage/emptyWindowChatSessions/*.json` | Local sources, CLI |
58
+ | GitHub Copilot CLI | supported | `%USERPROFILE%\.copilot\session-state\<id>\events.jsonl` | `~/.copilot/session-state/<id>/events.jsonl` | Local sources, CLI |
59
+ | Cline / Roo Code / Kilo Code | supported | `%APPDATA%\<editor>\User\globalStorage\saoudrizwan.claude-dev\tasks\<id>\api_conversation_history.json`<br>`%APPDATA%\<editor>\User\globalStorage\rooveterinaryinc.roo-cline\tasks\<id>\api_conversation_history.json`<br>`%APPDATA%\<editor>\User\globalStorage\kilocode.kilo-code\tasks\<id>\api_conversation_history.json` | `<config>/<editor>/User/globalStorage/saoudrizwan.claude-dev/tasks/<id>/api_conversation_history.json`<br>`<config>/<editor>/User/globalStorage/rooveterinaryinc.roo-cline/tasks/<id>/api_conversation_history.json`<br>`<config>/<editor>/User/globalStorage/kilocode.kilo-code/tasks/<id>/api_conversation_history.json` | Local sources, CLI |
60
+ | Cursor | supported | `%APPDATA%\Cursor\User\globalStorage\state.vscdb` | `<config>/Cursor/User/globalStorage/state.vscdb` | Local sources, CLI |
61
+ | Gemini CLI | supported | `%USERPROFILE%\.gemini\tmp\<hash>\chats\session-*.json`<br>`%USERPROFILE%\.gemini\tmp\<hash>\logs.json` | `~/.gemini/tmp/<hash>/chats/session-*.json`<br>`~/.gemini/tmp/<hash>/logs.json` | Local sources, CLI |
62
+ | Continue | supported | `%USERPROFILE%\.continue\sessions\*.json` | `~/.continue/sessions/*.json` | Local sources, CLI |
63
+ | Aider | supported; override: `NETCODEX_AIDER_PATHS` | `<repo>\.aider.chat.history.md` | `<repo>/.aider.chat.history.md` | Local sources, CLI |
64
+ | Google Antigravity | best effort | `%USERPROFILE%\.gemini\antigravity\conversation_summaries.db`<br>`%USERPROFILE%\.gemini\antigravity\conversations\*.db` | `~/.gemini/antigravity/conversation_summaries.db`<br>`~/.gemini/antigravity/conversations/*.db` | Local sources, CLI |
65
+ | Trae | encrypted, not supported | `%APPDATA%\Trae\ModularData\ai-agent\database.db`<br>`%APPDATA%\Trae CN\ModularData\ai-agent\database.db` | `<config>/Trae/ModularData/ai-agent/database.db`<br>`<config>/Trae CN/ModularData/ai-agent/database.db` | - |
66
+ | Windsurf | encrypted, not supported | `%USERPROFILE%\.codeium\windsurf\cascade\*.pb` | `~/.codeium/windsurf/cascade/*.pb` | - |
67
+
68
+ `<config>` is `~/Library/Application Support` on macOS and `~/.config` on Linux. `<editor>` is any VS Code-family editor: Code, Code - Insiders, VSCodium, Cursor, Windsurf, Trae, Trae CN, Antigravity, Kiro, Positron.
69
+ <!-- netcodex:where:end -->
70
+
71
+ Find them on your machine with `netcodex where` (`--json`, `--patterns`), or open the desk
72
+ (`netcodex ui`) and click **Where are my chats?**: it lists every tool with its status, the
73
+ resolved folder on this computer (Copy path / Open folder) and what to import. Encrypted
74
+ stores (current Trae, Windsurf) are reported but cannot be exported. claude.ai chats are not
75
+ stored locally: request the official data export (Settings > Privacy > Export data) and save
76
+ the `data-*.zip` / `conversations.json` in Downloads or point `NETCODEX_CLAUDE_AI_EXPORT` at it.
77
+
78
+ Client labels written to the `tool` field: `codex-cli`, `codex-vscode`, `codex-desktop`,
79
+ `claude-code-cli`, `claude-code-vscode`, `claude-desktop`, `claude-cowork`,
80
+ `copilot-chat-<editor>`, `cline-*`, `roo-code-*`, `kilo-code-*`, `cursor`, `copilot-cli`,
81
+ `gemini-cli`, `continue`, `aider`, `claude-ai`, `antigravity`.
62
82
 
63
83
  All parsers map to one canonical model (`Conversation` -> `Turn` -> `MessagePart`
64
84
  with `text`, `tool_call`, `tool_result`, `reasoning`, `image`, `attachment`,
@@ -86,19 +106,33 @@ v0.3.0). Extras: `[ui]` (alias `[web]`) adds FastAPI/uvicorn for `netcodex ui` a
86
106
  upload API; the core CLI only needs Pydantic and Typer. PDF export needs the external
87
107
  [Quarkdown](https://github.com/iamgio/quarkdown) binary on `PATH` (no Python extra).
88
108
 
89
- ### Local UI
109
+ ### Local UI: the Conversation export desk
90
110
 
91
111
  ```powershell
92
- netcodex ui # opens http://127.0.0.1:<port>/#token=... in your browser
112
+ netcodex ui # opens http://127.0.0.1:<port>/app/#token=... in your browser
93
113
  netcodex ui --port 8765 --out D:\exports --no-open
114
+ netcodex --version
94
115
  ```
95
116
 
96
- The UI lists every detected source and its conversations, previews the Markdown
97
- (reasoning / tool output / system context toggles) and exports the selected or all
98
- conversations to a folder you choose, incrementally. It binds to 127.0.0.1 only;
99
- `--host` with a non-loopback address is refused unless `--allow-remote` is given.
100
- Every API call needs the per-launch token from the URL, and requests whose `Host` is
101
- not a loopback name are rejected.
117
+ `netcodex ui` serves the full export desk from your own machine: an upload rail for
118
+ JSONL/SQLite/ZIP files with source auto-detection, a **Local sources** tab that reads the
119
+ detected tools directly (Codex, Claude Code, Copilot, Cline, Cursor, Gemini CLI, ...),
120
+ MD/QD/PDF formats with Quarkdown templates, the Upload > Analyze > Review > Export > Done
121
+ tracker, a system activity log, the preview and the export summary with the ZIP download.
122
+ The preview shows the Quarkdown HTML for QD/PDF exports and a rendered (sanitized) Markdown
123
+ view for Markdown-only exports, plus the Markdown source tab. **Where are my chats?** (header
124
+ button and Upload rail link) lists every supported tool with its status, the folder found on
125
+ this computer (Copy path / Open folder) and what to import. QD and PDF need the Quarkdown CLI;
126
+ the desk says so when it is missing.
127
+
128
+ Everything runs on 127.0.0.1: `--host` with a non-loopback address is refused unless
129
+ `--allow-remote` is given, API calls need the per-launch token from the URL (exchanged
130
+ for an HttpOnly, SameSite=Strict session cookie), and requests whose `Host` is not a
131
+ loopback name are rejected. Nothing is sent to a NetCodex server.
132
+
133
+ The desk is the Next.js app in `web/`, built as a static site by `npm run desk:build`
134
+ (`scripts/build-desk.mjs`) into `src/netcodex/web/desk/` and shipped in the wheel. A
135
+ source checkout without that build falls back to a minimal built-in page.
102
136
 
103
137
  ## License
104
138
 
@@ -115,6 +149,8 @@ uv run netcodex --help
115
149
 
116
150
  ```powershell
117
151
  uv run netcodex sources # registered sources, found / not found
152
+ uv run netcodex where # where each tool keeps its chats, and what is on this machine
153
+ uv run netcodex where --json # same, machine-readable (also: sources --paths)
118
154
  uv run netcodex scan --sources all
119
155
  uv run netcodex analyze --source auto --json
120
156
  uv run netcodex export --all --out exports # every available source, every session
@@ -145,6 +181,11 @@ uv run netcodex watch --out exports --interval 60 # Ctrl+C to stop
145
181
 
146
182
  Large exports use worker processes (`--jobs`, default automatic, up to 4).
147
183
 
184
+ The "Where are my chats?" table above, `netcodex where`, the desk help panel and the public
185
+ `/where` page all come from `netcodex.sources.locations`. After changing it, regenerate the
186
+ README table and `web/lib/chat-locations.json` with `uv run python scripts/export_locations.py`
187
+ (a test fails while they are out of date).
188
+
148
189
  Sources live in a registry (`netcodex.sources.registry`). Store locations come
149
190
  from a per-platform path matrix (`netcodex.sources.paths`: Windows
150
191
  `%APPDATA%`, macOS `~/Library/Application Support`, Linux `~/.config`) that also
@@ -225,8 +266,8 @@ npm run api:dev
225
266
  npm run web:dev
226
267
  ```
227
268
 
228
- The web UI reads `NEXT_PUBLIC_API_URL`; when it is not set, it uses
229
- `http://localhost:8000`. The MVP web flow accepts `.jsonl`, `.sqlite`, and
269
+ In development (`npm run dev`) the desk reads `NEXT_PUBLIC_API_URL` (default
270
+ `http://localhost:8000`) and the dev API also serves the local-sources endpoints. The MVP web flow accepts `.jsonl`, `.sqlite`, and
230
271
  `.zip` uploads, analyzes detected Claude/Codex sessions, previews Markdown,
231
272
  and downloads generated artifacts plus `netcodex-manifest.json` as a ZIP.
232
273
 
@@ -5,24 +5,44 @@ and Codex into Markdown, Quarkdown and PDF.
5
5
 
6
6
  ## Status
7
7
 
8
- Version 0.2 ("correct exports"). Supported sources:
9
-
10
- | Source | Where it is read from | Client labels (`tool`) |
11
- | --- | --- | --- |
12
- | Codex CLI / VS Code extension / Codex Desktop | `$CODEX_HOME` or `~/.codex`: newest `state_*.sqlite` (`threads`, `thread_spawn_edges`), `session_index.jsonl` titles, rollout JSONL in `sessions/` and `archived_sessions/` | `codex-cli`, `codex-vscode`, `codex-desktop` |
13
- | Claude Code CLI / VS Code | `$CLAUDE_CONFIG_DIR/projects` or `~/.claude/projects/**/<session>.jsonl`; subagents in `<session>/subagents/agent-*.jsonl` are grouped under their parent | `claude-code-cli`, `claude-code-vscode` |
14
- | Claude desktop "Code" tab | Same JSONL, titled from `%APPDATA%/Claude/claude-code-sessions/**/local_*.json` | `claude-desktop` |
15
- | Claude desktop Cowork | `%APPDATA%/Claude/local-agent-mode-sessions/**/local_<id>.json` + `local_<id>/.claude/projects/**/*.jsonl` | `claude-cowork` |
16
- | GitHub Copilot Chat (`copilot-chat`) | `<editor>/User/workspaceStorage/*/chatSessions/*.jsonl` (operation log) or `.json`, `globalStorage/emptyWindowChatSessions` in every VS Code-family editor | `copilot-chat-<editor>` |
17
- | Cline / Roo Code / Kilo Code (`cline`) | `<editor>/User/globalStorage/<extension>/tasks/<id>/api_conversation_history.json` | `cline-*`, `roo-code-*`, `kilo-code-*` |
18
- | Cursor (`cursor`) | `Cursor/User/globalStorage/state.vscdb` (`cursorDiskKV` composer + bubbles) | `cursor` |
19
- | GitHub Copilot CLI (`copilot-cli`) | `~/.copilot/session-state/<id>/events.jsonl` | `copilot-cli` |
20
- | Gemini CLI (`gemini-cli`) | `~/.gemini/tmp/<hash>/chats/session-*.json`, `logs.json` | `gemini-cli` |
21
- | Continue (`continue`) | `~/.continue/sessions/*.json` | `continue` |
22
- | Aider (`aider`) | `.aider.chat.history.md` in repos under `NETCODEX_AIDER_PATHS` or the home folder (depth 3) | `aider` |
23
- | claude.ai chats (`claude-ai`) | Official export ZIP / `conversations.json` from `NETCODEX_CLAUDE_AI_EXPORT` or `~/Downloads` | `claude-ai` |
24
- | Google Antigravity (`antigravity`) | `~/.gemini/antigravity/conversation_summaries.db` + `conversations/*.db` (schemaless protobuf, best effort; legacy encrypted `.pb` skipped) | `antigravity` |
25
- | Trae, Windsurf (`trae`, `windsurf`) | Encrypted stores: reported by `netcodex sources`, not exported | - |
8
+ Version 0.3. Supported tools, where each one keeps its chats, and how to import them
9
+ (`netcodex where` prints the same table with the paths that exist on your machine).
10
+
11
+ ### Where are my chats?
12
+
13
+ <!-- netcodex:where:start (generated by scripts/export_locations.py) -->
14
+ | Tool | Status | Windows | macOS / Linux | Import via |
15
+ | --- | --- | --- | --- | --- |
16
+ | Codex CLI / VS Code / Desktop | supported; override: `CODEX_HOME` | `%USERPROFILE%\.codex\sessions\YYYY\MM\DD\rollout-*.jsonl`<br>`%USERPROFILE%\.codex\archived_sessions\rollout-*.jsonl`<br>`%USERPROFILE%\.codex\state_*.sqlite`<br>`%USERPROFILE%\.codex\session_index.jsonl` | `~/.codex/sessions/YYYY/MM/DD/rollout-*.jsonl`<br>`~/.codex/archived_sessions/rollout-*.jsonl`<br>`~/.codex/state_*.sqlite`<br>`~/.codex/session_index.jsonl` | Upload files, Local sources, CLI |
17
+ | Claude Code CLI / VS Code | supported; override: `CLAUDE_CONFIG_DIR` | `%USERPROFILE%\.claude\projects\<project>\<session>.jsonl` | `~/.claude/projects/<project>/<session>.jsonl` | Upload files, Local sources, CLI |
18
+ | Claude Desktop (Code tab) | supported; override: `CLAUDE_CONFIG_DIR` | `%APPDATA%\Claude\claude-code-sessions\**\local_*.json`<br>`%USERPROFILE%\.claude\projects\<project>\<session>.jsonl` | `<config>/Claude/claude-code-sessions/**/local_*.json`<br>`~/.claude/projects/<project>/<session>.jsonl` | Local sources, CLI |
19
+ | Claude Cowork | supported | `%APPDATA%\Claude\local-agent-mode-sessions\**\local_<id>.json`<br>`%APPDATA%\Claude\local-agent-mode-sessions\**\local_<id>\.claude\projects\**\*.jsonl` | `<config>/Claude/local-agent-mode-sessions/**/local_<id>.json`<br>`<config>/Claude/local-agent-mode-sessions/**/local_<id>/.claude/projects/**/*.jsonl` | Local sources, CLI |
20
+ | Claude.ai (official data export) | supported; override: `NETCODEX_CLAUDE_AI_EXPORT` | `%USERPROFILE%\Downloads\data-*.zip`<br>`%USERPROFILE%\Downloads\<folder>\conversations.json` | `~/Downloads/data-*.zip`<br>`~/Downloads/<folder>/conversations.json` | Local sources, CLI |
21
+ | GitHub Copilot Chat | supported | `%APPDATA%\<editor>\User\workspaceStorage\<hash>\chatSessions\*.jsonl`<br>`%APPDATA%\<editor>\User\workspaceStorage\<hash>\chatSessions\*.json`<br>`%APPDATA%\<editor>\User\globalStorage\emptyWindowChatSessions\*.json` | `<config>/<editor>/User/workspaceStorage/<hash>/chatSessions/*.jsonl`<br>`<config>/<editor>/User/workspaceStorage/<hash>/chatSessions/*.json`<br>`<config>/<editor>/User/globalStorage/emptyWindowChatSessions/*.json` | Local sources, CLI |
22
+ | GitHub Copilot CLI | supported | `%USERPROFILE%\.copilot\session-state\<id>\events.jsonl` | `~/.copilot/session-state/<id>/events.jsonl` | Local sources, CLI |
23
+ | Cline / Roo Code / Kilo Code | supported | `%APPDATA%\<editor>\User\globalStorage\saoudrizwan.claude-dev\tasks\<id>\api_conversation_history.json`<br>`%APPDATA%\<editor>\User\globalStorage\rooveterinaryinc.roo-cline\tasks\<id>\api_conversation_history.json`<br>`%APPDATA%\<editor>\User\globalStorage\kilocode.kilo-code\tasks\<id>\api_conversation_history.json` | `<config>/<editor>/User/globalStorage/saoudrizwan.claude-dev/tasks/<id>/api_conversation_history.json`<br>`<config>/<editor>/User/globalStorage/rooveterinaryinc.roo-cline/tasks/<id>/api_conversation_history.json`<br>`<config>/<editor>/User/globalStorage/kilocode.kilo-code/tasks/<id>/api_conversation_history.json` | Local sources, CLI |
24
+ | Cursor | supported | `%APPDATA%\Cursor\User\globalStorage\state.vscdb` | `<config>/Cursor/User/globalStorage/state.vscdb` | Local sources, CLI |
25
+ | Gemini CLI | supported | `%USERPROFILE%\.gemini\tmp\<hash>\chats\session-*.json`<br>`%USERPROFILE%\.gemini\tmp\<hash>\logs.json` | `~/.gemini/tmp/<hash>/chats/session-*.json`<br>`~/.gemini/tmp/<hash>/logs.json` | Local sources, CLI |
26
+ | Continue | supported | `%USERPROFILE%\.continue\sessions\*.json` | `~/.continue/sessions/*.json` | Local sources, CLI |
27
+ | Aider | supported; override: `NETCODEX_AIDER_PATHS` | `<repo>\.aider.chat.history.md` | `<repo>/.aider.chat.history.md` | Local sources, CLI |
28
+ | Google Antigravity | best effort | `%USERPROFILE%\.gemini\antigravity\conversation_summaries.db`<br>`%USERPROFILE%\.gemini\antigravity\conversations\*.db` | `~/.gemini/antigravity/conversation_summaries.db`<br>`~/.gemini/antigravity/conversations/*.db` | Local sources, CLI |
29
+ | Trae | encrypted, not supported | `%APPDATA%\Trae\ModularData\ai-agent\database.db`<br>`%APPDATA%\Trae CN\ModularData\ai-agent\database.db` | `<config>/Trae/ModularData/ai-agent/database.db`<br>`<config>/Trae CN/ModularData/ai-agent/database.db` | - |
30
+ | Windsurf | encrypted, not supported | `%USERPROFILE%\.codeium\windsurf\cascade\*.pb` | `~/.codeium/windsurf/cascade/*.pb` | - |
31
+
32
+ `<config>` is `~/Library/Application Support` on macOS and `~/.config` on Linux. `<editor>` is any VS Code-family editor: Code, Code - Insiders, VSCodium, Cursor, Windsurf, Trae, Trae CN, Antigravity, Kiro, Positron.
33
+ <!-- netcodex:where:end -->
34
+
35
+ Find them on your machine with `netcodex where` (`--json`, `--patterns`), or open the desk
36
+ (`netcodex ui`) and click **Where are my chats?**: it lists every tool with its status, the
37
+ resolved folder on this computer (Copy path / Open folder) and what to import. Encrypted
38
+ stores (current Trae, Windsurf) are reported but cannot be exported. claude.ai chats are not
39
+ stored locally: request the official data export (Settings > Privacy > Export data) and save
40
+ the `data-*.zip` / `conversations.json` in Downloads or point `NETCODEX_CLAUDE_AI_EXPORT` at it.
41
+
42
+ Client labels written to the `tool` field: `codex-cli`, `codex-vscode`, `codex-desktop`,
43
+ `claude-code-cli`, `claude-code-vscode`, `claude-desktop`, `claude-cowork`,
44
+ `copilot-chat-<editor>`, `cline-*`, `roo-code-*`, `kilo-code-*`, `cursor`, `copilot-cli`,
45
+ `gemini-cli`, `continue`, `aider`, `claude-ai`, `antigravity`.
26
46
 
27
47
  All parsers map to one canonical model (`Conversation` -> `Turn` -> `MessagePart`
28
48
  with `text`, `tool_call`, `tool_result`, `reasoning`, `image`, `attachment`,
@@ -50,19 +70,33 @@ v0.3.0). Extras: `[ui]` (alias `[web]`) adds FastAPI/uvicorn for `netcodex ui` a
50
70
  upload API; the core CLI only needs Pydantic and Typer. PDF export needs the external
51
71
  [Quarkdown](https://github.com/iamgio/quarkdown) binary on `PATH` (no Python extra).
52
72
 
53
- ### Local UI
73
+ ### Local UI: the Conversation export desk
54
74
 
55
75
  ```powershell
56
- netcodex ui # opens http://127.0.0.1:<port>/#token=... in your browser
76
+ netcodex ui # opens http://127.0.0.1:<port>/app/#token=... in your browser
57
77
  netcodex ui --port 8765 --out D:\exports --no-open
78
+ netcodex --version
58
79
  ```
59
80
 
60
- The UI lists every detected source and its conversations, previews the Markdown
61
- (reasoning / tool output / system context toggles) and exports the selected or all
62
- conversations to a folder you choose, incrementally. It binds to 127.0.0.1 only;
63
- `--host` with a non-loopback address is refused unless `--allow-remote` is given.
64
- Every API call needs the per-launch token from the URL, and requests whose `Host` is
65
- not a loopback name are rejected.
81
+ `netcodex ui` serves the full export desk from your own machine: an upload rail for
82
+ JSONL/SQLite/ZIP files with source auto-detection, a **Local sources** tab that reads the
83
+ detected tools directly (Codex, Claude Code, Copilot, Cline, Cursor, Gemini CLI, ...),
84
+ MD/QD/PDF formats with Quarkdown templates, the Upload > Analyze > Review > Export > Done
85
+ tracker, a system activity log, the preview and the export summary with the ZIP download.
86
+ The preview shows the Quarkdown HTML for QD/PDF exports and a rendered (sanitized) Markdown
87
+ view for Markdown-only exports, plus the Markdown source tab. **Where are my chats?** (header
88
+ button and Upload rail link) lists every supported tool with its status, the folder found on
89
+ this computer (Copy path / Open folder) and what to import. QD and PDF need the Quarkdown CLI;
90
+ the desk says so when it is missing.
91
+
92
+ Everything runs on 127.0.0.1: `--host` with a non-loopback address is refused unless
93
+ `--allow-remote` is given, API calls need the per-launch token from the URL (exchanged
94
+ for an HttpOnly, SameSite=Strict session cookie), and requests whose `Host` is not a
95
+ loopback name are rejected. Nothing is sent to a NetCodex server.
96
+
97
+ The desk is the Next.js app in `web/`, built as a static site by `npm run desk:build`
98
+ (`scripts/build-desk.mjs`) into `src/netcodex/web/desk/` and shipped in the wheel. A
99
+ source checkout without that build falls back to a minimal built-in page.
66
100
 
67
101
  ## License
68
102
 
@@ -79,6 +113,8 @@ uv run netcodex --help
79
113
 
80
114
  ```powershell
81
115
  uv run netcodex sources # registered sources, found / not found
116
+ uv run netcodex where # where each tool keeps its chats, and what is on this machine
117
+ uv run netcodex where --json # same, machine-readable (also: sources --paths)
82
118
  uv run netcodex scan --sources all
83
119
  uv run netcodex analyze --source auto --json
84
120
  uv run netcodex export --all --out exports # every available source, every session
@@ -109,6 +145,11 @@ uv run netcodex watch --out exports --interval 60 # Ctrl+C to stop
109
145
 
110
146
  Large exports use worker processes (`--jobs`, default automatic, up to 4).
111
147
 
148
+ The "Where are my chats?" table above, `netcodex where`, the desk help panel and the public
149
+ `/where` page all come from `netcodex.sources.locations`. After changing it, regenerate the
150
+ README table and `web/lib/chat-locations.json` with `uv run python scripts/export_locations.py`
151
+ (a test fails while they are out of date).
152
+
112
153
  Sources live in a registry (`netcodex.sources.registry`). Store locations come
113
154
  from a per-platform path matrix (`netcodex.sources.paths`: Windows
114
155
  `%APPDATA%`, macOS `~/Library/Application Support`, Linux `~/.config`) that also
@@ -189,8 +230,8 @@ npm run api:dev
189
230
  npm run web:dev
190
231
  ```
191
232
 
192
- The web UI reads `NEXT_PUBLIC_API_URL`; when it is not set, it uses
193
- `http://localhost:8000`. The MVP web flow accepts `.jsonl`, `.sqlite`, and
233
+ In development (`npm run dev`) the desk reads `NEXT_PUBLIC_API_URL` (default
234
+ `http://localhost:8000`) and the dev API also serves the local-sources endpoints. The MVP web flow accepts `.jsonl`, `.sqlite`, and
194
235
  `.zip` uploads, analyzes detected Claude/Codex sessions, previews Markdown,
195
236
  and downloads generated artifacts plus `netcodex-manifest.json` as a ZIP.
196
237
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "netcodex-agent-exporter"
3
- version = "0.3.0"
3
+ version = "0.3.2"
4
4
  description = "Local-first exporter for AI agent conversations (Codex, Claude Code, Copilot, Cline, Cursor, Gemini CLI and more) to Markdown."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -68,9 +68,12 @@ testpaths = ["tests"]
68
68
 
69
69
  [tool.hatch.build.targets.wheel]
70
70
  packages = ["src/netcodex"]
71
+ # The static export desk is generated (npm run desk:build) and git-ignored; ship it anyway.
72
+ artifacts = ["src/netcodex/web/desk/**"]
71
73
 
72
74
  [tool.hatch.build.targets.sdist]
73
75
  include = ["src/netcodex", "tests", "README.md", "LICENSE", "pyproject.toml", "scripts/netcodex_entry.py"]
76
+ artifacts = ["src/netcodex/web/desk/**"]
74
77
 
75
78
  [build-system]
76
79
  requires = ["hatchling>=1.27"]
@@ -2,5 +2,5 @@
2
2
 
3
3
  __all__ = ["__version__"]
4
4
 
5
- __version__ = "0.3.0"
5
+ __version__ = "0.3.2"
6
6
 
@@ -7,6 +7,7 @@ from pathlib import Path
7
7
 
8
8
  import typer
9
9
 
10
+ from netcodex import __version__
10
11
  from netcodex.renderers import DEFAULT_TEMPLATE_ID, MarkdownOptions
11
12
  from netcodex.sources.paths import current_platform, path_matrix
12
13
  from netcodex.sources.registry import create_source, registered
@@ -24,6 +25,26 @@ from netcodex.services import (
24
25
  app = typer.Typer(help="Export local agent conversations to Markdown, Quarkdown and PDF.")
25
26
 
26
27
 
28
+ def _print_version(value: bool) -> None:
29
+ if value:
30
+ typer.echo(f"netcodex {__version__}")
31
+ raise typer.Exit()
32
+
33
+
34
+ @app.callback()
35
+ def main(
36
+ version: bool = typer.Option(
37
+ False,
38
+ "--version",
39
+ "-V",
40
+ callback=_print_version,
41
+ is_eager=True,
42
+ help="Show the installed version and exit.",
43
+ ),
44
+ ) -> None:
45
+ """Export local agent conversations to Markdown, Quarkdown and PDF."""
46
+
47
+
27
48
  @app.command()
28
49
  def scan(
29
50
  sources: str = typer.Option("all", help="Comma-separated sources, or all."),
@@ -70,12 +91,58 @@ def analyze(
70
91
  typer.echo(f"warning: {warning}")
71
92
 
72
93
 
94
+ @app.command("where")
95
+ def where(
96
+ json_output: bool = typer.Option(False, "--json", help="Print machine-readable JSON."),
97
+ counts: bool = typer.Option(True, "--count/--no-count", help="Count the conversations found in each place."),
98
+ patterns: bool = typer.Option(False, "--patterns", help="Also print the generic path patterns for this OS."),
99
+ markdown: bool = typer.Option(False, "--markdown", help="Print the machine-independent Markdown table."),
100
+ ) -> None:
101
+ """Where are my chats? Storage folder of every supported tool, and what exists on this machine."""
102
+
103
+ from netcodex.sources.locations import STATUS_LABELS, machine_payload, markdown_table
104
+
105
+ if markdown:
106
+ typer.echo(markdown_table(), nl=False)
107
+ return
108
+ payload = machine_payload(with_counts=counts)
109
+ if json_output:
110
+ typer.echo(json.dumps(payload, indent=2))
111
+ return
112
+ platform = payload["platform"]
113
+ rows = []
114
+ for tool in payload["tools"]:
115
+ found = [item["path"] for item in tool["resolved"]]
116
+ detected = "" if tool["detected"] is None else str(tool["detected"])
117
+ rows.append((tool["name"], STATUS_LABELS[tool["status"]], detected, found, tool))
118
+ name_width = max(len(row[0]) for row in rows)
119
+ status_width = max(len(row[1]) for row in rows)
120
+ count_width = max(len("found"), *(len(row[2]) for row in rows))
121
+ typer.echo(f"{'tool':<{name_width}} {'status':<{status_width}} {'found':>{count_width}} path on this machine")
122
+ for name, status, detected, found, tool in rows:
123
+ first = found[0] if found else "(not found)"
124
+ typer.echo(f"{name:<{name_width}} {status:<{status_width}} {detected:>{count_width}} {first}")
125
+ indent = " " * (name_width + status_width + count_width + 6)
126
+ for extra in found[1:]:
127
+ typer.echo(f"{indent}{extra}")
128
+ if patterns:
129
+ for pattern in tool["patterns"][platform]:
130
+ typer.echo(f"{indent}pattern: {pattern}")
131
+ if payload["env_set"]:
132
+ typer.echo(f"overrides in effect: {', '.join(payload['env_set'])}")
133
+ typer.echo("found = conversations detected (encrypted tools: encrypted files). Details: netcodex where --json")
134
+
135
+
73
136
  @app.command("sources")
74
137
  def list_sources(
75
138
  json_output: bool = typer.Option(False, "--json", help="Print machine-readable JSON."),
139
+ paths: bool = typer.Option(False, "--paths", help="Show where each tool stores its chats (same as `where`)."),
76
140
  ) -> None:
77
141
  """List registered sources, whether their local store exists, and where they are read from."""
78
142
 
143
+ if paths:
144
+ where(json_output=json_output, counts=True, patterns=False, markdown=False)
145
+ return
79
146
  matrix = path_matrix()
80
147
  payload = []
81
148
  for info in registered():
@@ -301,7 +368,8 @@ def ui(
301
368
  token = secrets.token_urlsafe(24)
302
369
  application = create_local_app(out.resolve(), token=token, allow_remote=allow_remote)
303
370
  shown_host = f"[{host}]" if ":" in host else host
304
- url = f"http://{shown_host}:{port}/#token={token}"
371
+ page = "/app/" if application.state.desk_dir is not None else "/"
372
+ url = f"http://{shown_host}:{port}{page}#token={token}"
305
373
  typer.echo(f"NetCodex UI: {url}")
306
374
  typer.echo("Press Ctrl+C to stop.")
307
375
  if open_browser: