ai-ctrl-plane 0.3.1__py3-none-any.whl

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.
@@ -0,0 +1,6 @@
1
+ """AI Session Log Viewer — browse agent session logs in a web UI."""
2
+
3
+ try:
4
+ from ._version import __version__
5
+ except ImportError: # editable install without build
6
+ __version__ = "0.0.0.dev0"
@@ -0,0 +1,121 @@
1
+ """Entry point: ``ai-ctrl-plane`` or ``python -m ai_ctrl_plane``."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import argparse
6
+ from pathlib import Path
7
+
8
+ from . import __version__
9
+ from .app import create_app
10
+ from .claude_parser import _default_claude_dir
11
+ from .claude_parser import discover_sessions as claude_discover
12
+ from .parser import _default_copilot_dir
13
+ from .parser import discover_sessions as copilot_discover
14
+ from .vscode_parser import _default_vscode_dir
15
+ from .vscode_parser import discover_sessions as vscode_discover
16
+
17
+
18
+ def main(argv: list[str] | None = None) -> None:
19
+ parser = argparse.ArgumentParser(
20
+ prog="ai-ctrl-plane",
21
+ description="Browse AI agent session logs (GitHub Copilot, Claude Code, and VS Code Chat) in a local web UI.",
22
+ )
23
+ parser.add_argument(
24
+ "log_dir",
25
+ nargs="?",
26
+ default=None,
27
+ help=f"Directory containing Copilot session log folders (default: {_default_copilot_dir()})",
28
+ )
29
+ parser.add_argument(
30
+ "--copilot-dir",
31
+ default=None,
32
+ help="Directory containing Copilot session log folders (overrides positional arg)",
33
+ )
34
+ parser.add_argument(
35
+ "--claude-dir",
36
+ default=None,
37
+ help=f"Directory containing Claude Code session logs (default: {_default_claude_dir()})",
38
+ )
39
+ parser.add_argument(
40
+ "--vscode-dir",
41
+ default=None,
42
+ help=f"Directory containing VS Code Chat session logs (default: {_default_vscode_dir()})",
43
+ )
44
+ parser.add_argument(
45
+ "-p",
46
+ "--port",
47
+ type=int,
48
+ default=5000,
49
+ help="Port to listen on (default: 5000)",
50
+ )
51
+ parser.add_argument(
52
+ "--host",
53
+ default="127.0.0.1",
54
+ help="Host to bind to (default: 127.0.0.1)",
55
+ )
56
+ parser.add_argument(
57
+ "--debug",
58
+ action="store_true",
59
+ default=False,
60
+ help="Run in Flask debug mode (do NOT use in production)",
61
+ )
62
+ parser.add_argument(
63
+ "-V",
64
+ "--version",
65
+ action="version",
66
+ version=f"%(prog)s {__version__}",
67
+ )
68
+ args = parser.parse_args(argv)
69
+
70
+ # Resolve Copilot directory
71
+ copilot_dir = args.copilot_dir or args.log_dir
72
+ if copilot_dir is None:
73
+ default = _default_copilot_dir()
74
+ copilot_dir = str(default) if default.is_dir() else "."
75
+ copilot_path = Path(copilot_dir).resolve()
76
+
77
+ # Resolve Claude directory
78
+ claude_dir = args.claude_dir
79
+ if claude_dir is None:
80
+ claude_dir = str(_default_claude_dir())
81
+ claude_path = Path(claude_dir).resolve()
82
+
83
+ # Resolve VS Code directory
84
+ vscode_dir = args.vscode_dir
85
+ if vscode_dir is None:
86
+ vscode_dir = str(_default_vscode_dir())
87
+ vscode_path = Path(vscode_dir).resolve()
88
+
89
+ copilot_sessions = copilot_discover(copilot_path) if copilot_path.is_dir() else []
90
+ claude_sessions = claude_discover(claude_path) if claude_path.is_dir() else []
91
+ vscode_sessions = vscode_discover(vscode_path) if vscode_path.is_dir() else []
92
+
93
+ print(f"AI Control Plane v{__version__}")
94
+ print()
95
+ print(f"Copilot: {copilot_path} ({len(copilot_sessions)} sessions)")
96
+ for s in copilot_sessions[:5]:
97
+ print(f" - {s['summary']} ({s['id'][:8]}...)")
98
+ if len(copilot_sessions) > 5:
99
+ print(f" ... and {len(copilot_sessions) - 5} more")
100
+ print()
101
+ print(f"Claude: {claude_path} ({len(claude_sessions)} sessions)")
102
+ for s in claude_sessions[:5]:
103
+ print(f" - {s['summary']} ({s['id'][:8]}...)")
104
+ if len(claude_sessions) > 5:
105
+ print(f" ... and {len(claude_sessions) - 5} more")
106
+ print()
107
+ print(f"VS Code: {vscode_path} ({len(vscode_sessions)} sessions)")
108
+ for s in vscode_sessions[:5]:
109
+ print(f" - {s['summary']} ({s['id'][:8]}...)")
110
+ if len(vscode_sessions) > 5:
111
+ print(f" ... and {len(vscode_sessions) - 5} more")
112
+ print()
113
+ print(f"Open http://{args.host}:{args.port} in your browser")
114
+ print()
115
+
116
+ app = create_app(copilot_path, claude_path, vscode_path)
117
+ app.run(host=args.host, port=args.port, debug=args.debug)
118
+
119
+
120
+ if __name__ == "__main__":
121
+ main()
@@ -0,0 +1,34 @@
1
+ # file generated by setuptools-scm
2
+ # don't change, don't track in version control
3
+
4
+ __all__ = [
5
+ "__version__",
6
+ "__version_tuple__",
7
+ "version",
8
+ "version_tuple",
9
+ "__commit_id__",
10
+ "commit_id",
11
+ ]
12
+
13
+ TYPE_CHECKING = False
14
+ if TYPE_CHECKING:
15
+ from typing import Tuple
16
+ from typing import Union
17
+
18
+ VERSION_TUPLE = Tuple[Union[int, str], ...]
19
+ COMMIT_ID = Union[str, None]
20
+ else:
21
+ VERSION_TUPLE = object
22
+ COMMIT_ID = object
23
+
24
+ version: str
25
+ __version__: str
26
+ __version_tuple__: VERSION_TUPLE
27
+ version_tuple: VERSION_TUPLE
28
+ commit_id: COMMIT_ID
29
+ __commit_id__: COMMIT_ID
30
+
31
+ __version__ = version = '0.3.1'
32
+ __version_tuple__ = version_tuple = (0, 3, 1)
33
+
34
+ __commit_id__ = commit_id = None