From 72000c18d5721f915b9a438f697a9f88f33bc456 Mon Sep 17 00:00:00 2001 From: Ed_ Date: Mon, 2 Mar 2026 22:00:47 -0500 Subject: [PATCH] chore(conductor): Archive tech debt track and cleanup registry --- .../index.md | 0 .../metadata.json | 0 .../plan.md | 0 .../spec.md | 0 conductor/tracks.md | 2 +- conductor/tracks/track-1/state.toml | 18 ---- config.toml | 4 +- gui_2.py | 90 +++++++++++++++++++ project_history.toml | 2 +- 9 files changed, 94 insertions(+), 22 deletions(-) rename conductor/{tracks => archive}/tech_debt_and_test_cleanup_20260302/index.md (100%) rename conductor/{tracks => archive}/tech_debt_and_test_cleanup_20260302/metadata.json (100%) rename conductor/{tracks => archive}/tech_debt_and_test_cleanup_20260302/plan.md (100%) rename conductor/{tracks => archive}/tech_debt_and_test_cleanup_20260302/spec.md (100%) delete mode 100644 conductor/tracks/track-1/state.toml diff --git a/conductor/tracks/tech_debt_and_test_cleanup_20260302/index.md b/conductor/archive/tech_debt_and_test_cleanup_20260302/index.md similarity index 100% rename from conductor/tracks/tech_debt_and_test_cleanup_20260302/index.md rename to conductor/archive/tech_debt_and_test_cleanup_20260302/index.md diff --git a/conductor/tracks/tech_debt_and_test_cleanup_20260302/metadata.json b/conductor/archive/tech_debt_and_test_cleanup_20260302/metadata.json similarity index 100% rename from conductor/tracks/tech_debt_and_test_cleanup_20260302/metadata.json rename to conductor/archive/tech_debt_and_test_cleanup_20260302/metadata.json diff --git a/conductor/tracks/tech_debt_and_test_cleanup_20260302/plan.md b/conductor/archive/tech_debt_and_test_cleanup_20260302/plan.md similarity index 100% rename from conductor/tracks/tech_debt_and_test_cleanup_20260302/plan.md rename to conductor/archive/tech_debt_and_test_cleanup_20260302/plan.md diff --git a/conductor/tracks/tech_debt_and_test_cleanup_20260302/spec.md b/conductor/archive/tech_debt_and_test_cleanup_20260302/spec.md similarity index 100% rename from conductor/tracks/tech_debt_and_test_cleanup_20260302/spec.md rename to conductor/archive/tech_debt_and_test_cleanup_20260302/spec.md diff --git a/conductor/tracks.md b/conductor/tracks.md index 525a9d5..405cc48 100644 --- a/conductor/tracks.md +++ b/conductor/tracks.md @@ -11,7 +11,7 @@ This file tracks all major tracks for the project. Each track has its own detail ## Completed / Archived - [x] **Track: Tech Debt & Test Discipline Cleanup** -*Link: [./tracks/tech_debt_and_test_cleanup_20260302/](./tracks/tech_debt_and_test_cleanup_20260302/)* +*Link: [./archive/tech_debt_and_test_cleanup_20260302/](./archive/tech_debt_and_test_cleanup_20260302/)* - [x] **Track: Conductor Workflow Improvements** *Link: [./archive/conductor_workflow_improvements_20260302/](./archive/conductor_workflow_improvements_20260302/)* diff --git a/conductor/tracks/track-1/state.toml b/conductor/tracks/track-1/state.toml deleted file mode 100644 index a994887..0000000 --- a/conductor/tracks/track-1/state.toml +++ /dev/null @@ -1,18 +0,0 @@ -discussion = [] - -[metadata] -id = "track-1" -name = "Test Track" -status = "idle" -created_at = "2026-03-02T21:03:18.362973" -updated_at = "2026-03-02T21:04:22.986795" - -[[tasks]] -id = "T-001" -description = "desc" -status = "todo" -assigned_to = "tier3-worker" -context_requirements = [] -depends_on = [] -step_mode = false -retry_count = 0 diff --git a/config.toml b/config.toml index 746ada0..d5b6a7f 100644 --- a/config.toml +++ b/config.toml @@ -1,6 +1,6 @@ [ai] provider = "gemini_cli" -model = "gemini-2.0-flash" +model = "gemini-2.5-flash-lite" temperature = 0.0 max_tokens = 8192 history_trunc_limit = 8000 @@ -15,7 +15,7 @@ paths = [ "C:\\projects\\manual_slop\\tests\\artifacts\\temp_livetoolssim.toml", "C:\\projects\\manual_slop\\tests\\artifacts\\temp_liveexecutionsim.toml", ] -active = "C:\\projects\\manual_slop\\tests\\artifacts\\temp_project.toml" +active = "C:\\projects\\manual_slop\\tests\\artifacts\\temp_livetoolssim.toml" [gui.show_windows] "Context Hub" = true diff --git a/gui_2.py b/gui_2.py index 79876f6..c08a6d0 100644 --- a/gui_2.py +++ b/gui_2.py @@ -161,6 +161,7 @@ class GenerateRequest(BaseModel): class ConfirmRequest(BaseModel): approved: bool + script: Optional[str] = None class App: """The main ImGui interface orchestrator for Manual Slop.""" @@ -460,6 +461,21 @@ class App: return header_key raise HTTPException(status_code=403, detail="Could not validate API Key") + @api.get("/health") + def health() -> dict[str, str]: + """Returns the health status of the API.""" + return {"status": "ok"} + + @api.get("/status", dependencies=[Depends(get_api_key)]) + def status() -> dict[str, Any]: + """Returns the current status of the application.""" + return { + "provider": self.current_provider, + "model": self.current_model, + "status": self.ai_status, + "usage": self.session_usage + } + @api.post("/api/v1/generate", dependencies=[Depends(get_api_key)]) def generate(req: GenerateRequest) -> dict[str, Any]: """Triggers an AI generation request using the current project context.""" @@ -523,6 +539,77 @@ class App: """Placeholder for streaming AI generation responses (Not yet implemented).""" raise HTTPException(status_code=501, detail="Streaming endpoint (/api/v1/stream) is not yet supported in this version.") + @api.get("/api/v1/pending_actions", dependencies=[Depends(get_api_key)]) + def pending_actions() -> list[dict[str, Any]]: + """Lists all pending PowerShell scripts awaiting confirmation.""" + with self._pending_dialog_lock: + return [ + {"action_id": uid, "script": diag._script, "base_dir": diag._base_dir} + for uid, diag in self._pending_actions.items() + ] + + @api.post("/api/v1/confirm/{action_id}", dependencies=[Depends(get_api_key)]) + def confirm_action(action_id: str, req: ConfirmRequest) -> dict[str, str]: + """Approves or rejects a pending action.""" + with self._pending_dialog_lock: + if action_id not in self._pending_actions: + raise HTTPException(status_code=404, detail="Action not found") + dialog = self._pending_actions.pop(action_id) + if req.script is not None: + dialog._script = req.script + with dialog._condition: + dialog._approved = req.approved + dialog._done = True + dialog._condition.notify_all() + return {"status": "confirmed" if req.approved else "rejected"} + + @api.get("/api/v1/sessions", dependencies=[Depends(get_api_key)]) + def list_sessions() -> list[str]: + """Lists all session log files.""" + log_dir = Path("logs") + if not log_dir.exists(): + return [] + return [f.name for f in log_dir.glob("*.log")] + + @api.get("/api/v1/sessions/{session_id}", dependencies=[Depends(get_api_key)]) + def get_session(session_id: str) -> dict[str, Any]: + """Returns the content of a specific session log.""" + log_path = Path("logs") / session_id + if not log_path.exists(): + raise HTTPException(status_code=404, detail="Session log not found") + return {"id": session_id, "content": log_path.read_text(encoding="utf-8", errors="replace")} + + @api.delete("/api/v1/sessions/{session_id}", dependencies=[Depends(get_api_key)]) + def delete_session(session_id: str) -> dict[str, str]: + """Deletes a specific session log.""" + log_path = Path("logs") / session_id + if not log_path.exists(): + raise HTTPException(status_code=404, detail="Session log not found") + log_path.unlink() + return {"status": "deleted"} + + @api.get("/api/v1/context", dependencies=[Depends(get_api_key)]) + def get_context() -> dict[str, Any]: + """Returns the current aggregated project context.""" + try: + md, path, file_items, stable_md, disc_text = self._do_generate() + # Pull current screenshots if available in project + screenshots = self.project.get("screenshots", {}).get("paths", []) + return { + "files": [f.get("path") if isinstance(f, dict) else str(f) for f in file_items], + "screenshots": screenshots, + "files_base_dir": self.ui_files_base_dir, + "markdown": md, + "discussion": disc_text + } + except Exception as e: + raise HTTPException(status_code=500, detail=f"Context aggregation failure: {e}") + + @api.get("/api/v1/token_stats", dependencies=[Depends(get_api_key)]) + def token_stats() -> dict[str, Any]: + """Returns current token usage and budget statistics.""" + return self._token_stats + return api # ---------------------------------------------------------------- project loading @@ -1290,6 +1377,9 @@ class App: self.session_usage["last_latency"] = payload["latency"] self._recalculate_session_usage() + if md_content is not None: + self._token_stats = ai_client.get_token_stats(md_content) + cache_stats = payload.get("cache_stats") if cache_stats: count = cache_stats.get("cache_count", 0) diff --git a/project_history.toml b/project_history.toml index 7f191f4..8955a2d 100644 --- a/project_history.toml +++ b/project_history.toml @@ -8,5 +8,5 @@ active = "main" [discussions.main] git_commit = "" -last_updated = "2026-03-02T21:32:02" +last_updated = "2026-03-02T21:58:42" history = []