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.
- ai_ctrl_plane/__init__.py +6 -0
- ai_ctrl_plane/__main__.py +121 -0
- ai_ctrl_plane/_version.py +34 -0
- ai_ctrl_plane/app.py +656 -0
- ai_ctrl_plane/claude_parser.py +741 -0
- ai_ctrl_plane/config_readers/__init__.py +16 -0
- ai_ctrl_plane/config_readers/_common.py +217 -0
- ai_ctrl_plane/config_readers/claude_config.py +273 -0
- ai_ctrl_plane/config_readers/copilot_config.py +78 -0
- ai_ctrl_plane/config_readers/vscode_config.py +123 -0
- ai_ctrl_plane/parser.py +342 -0
- ai_ctrl_plane/templates/agents.html +217 -0
- ai_ctrl_plane/templates/base.html +428 -0
- ai_ctrl_plane/templates/index.html +453 -0
- ai_ctrl_plane/templates/session.html +980 -0
- ai_ctrl_plane/templates/sessions.html +302 -0
- ai_ctrl_plane/templates/skill_detail.html +197 -0
- ai_ctrl_plane/templates/skills.html +231 -0
- ai_ctrl_plane/templates/tool_detail.html +588 -0
- ai_ctrl_plane/templates/tools.html +164 -0
- ai_ctrl_plane/vscode_parser.py +715 -0
- ai_ctrl_plane-0.3.1.dist-info/METADATA +312 -0
- ai_ctrl_plane-0.3.1.dist-info/RECORD +26 -0
- ai_ctrl_plane-0.3.1.dist-info/WHEEL +4 -0
- ai_ctrl_plane-0.3.1.dist-info/entry_points.txt +2 -0
- ai_ctrl_plane-0.3.1.dist-info/licenses/LICENSE +21 -0
|
@@ -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
|