Commit Graph
880 Commits
Author SHA1 Message Date
ed 394020e50c reading throuogh gui_2.py (still reading) 2026-06-13 10:27:48 -04:00
ed 26b1ec77a4 curation pass on gui_2.py 2026-06-12 23:38:31 -04:00
ed d4fbcb16d9 more diagrams (claude on agy) 2026-06-12 22:48:09 -04:00
ed aafdf3acc6 Docstrings: SSDL + ASCII Layout Map for Misc Tools and remaining MMA sub-functions 2026-06-12 22:38:38 -04:00
ed dd1fe466cb Docstrings: SSDL + ASCII Layout Map for all Operations Monitor region functions 2026-06-12 22:35:36 -04:00
ed f6e4df0cf6 Docstrings: SSDL + ASCII Layout Map for all Discussions region functions 2026-06-12 22:33:03 -04:00
ed 6e59782d2b Docstrings: remove State Mutations section, add ASCII Layout Maps to Context Management and MMA groups 2026-06-12 22:30:19 -04:00
ed 443f02a744 more ascii (gemini ran out already...)v 2026-06-12 22:26:07 -04:00
ed fc2171a40f Add SSDL-style docstrings to MMA Orchestrator Panel group functions 2026-06-12 22:18:59 -04:00
ed e376cc99a8 Add SSDL-style docstrings to Core Interaction Loop panels (comms history, message input, response stream, tool calls, and script approval) 2026-06-12 22:16:06 -04:00
ed 1feb9102f4 Add SSDL-style docstrings to base prompt diff modal, add context files modal, save workspace profile modal, context modals, and context preview window 2026-06-12 22:10:40 -04:00
ed 00099bceaa remove old call tracking comments. 2026-06-12 22:09:49 -04:00
ed 42af7db7f9 Add SSDL-style docstrings to preset manager and persona editor functions, and fix embedded call delegation bug 2026-06-12 22:01:36 -04:00
ed c3edbd9543 Add SSDL-style docstrings to context helper widgets (files and media, batch actions, presets, screenshots, snapshot tab) 2026-06-12 21:55:20 -04:00
ed 06b6d4794f Add SSDL-style docstrings to History and Telemetry functions and fix missing rendering/profiling in session insights panel 2026-06-12 21:54:16 -04:00
ed 924d720c76 Add SSDL-style docstrings to cache, usage, tool analytics, token budget, and log management panels 2026-06-12 21:52:48 -04:00
ed eefada9a3d Add SSDL-style docstrings to RAG, System Prompts, Provider, and Persona selector panels 2026-06-12 21:52:21 -04:00
ed 6f33d57750 Fix render_paths_panel scoping bug and nest render_path_field 2026-06-12 21:51:42 -04:00
ed b521b4523c Refactor docstrings to resolve DAG Context with SSDL shape and remove Threading sections
Keeps the ASCII layout map previews, baseline summaries, and state mutation blocks, while cleanly removing Threading & Safety sections and replacing DAG references with SSDL Shape notations.
2026-06-12 21:47:21 -04:00
ed 56e1950b4b Document settings hubs and diagnostics in gui_2.py and complete track
Add SQLite-style inline docstrings to render_ai_settings_hub, render_agent_tools_panel, and render_diagnostics_panel under simplified granularity per user request. Mark track sqlite_docs_gui_2_20260612 as complete.
2026-06-12 21:30:47 -04:00
ed 92cff70543 docs(gui_2): Document context composition, context files table, and ast inspector 2026-06-12 21:27:44 -04:00
ed 8c7b287553 docs(gui_2): Document render_discussion_entry_read_mode 2026-06-12 21:24:59 -04:00
ed 2d8e166bc5 docs(gui_2): Document render_discussion_entry and render_discussion_entry_controls 2026-06-12 21:24:21 -04:00
ed 6d408c4d03 docs(gui_2): Document App snapshot, profile, and history/undo/redo managers 2026-06-12 21:21:25 -04:00
ed 3b4b55698c docs(gui_2): Add SQLite-granularity docstrings for App init, run, _gui_func, and shutdown 2026-06-12 21:18:18 -04:00
ed 6aafac5d2f starting human review of ai_client 2026-06-12 20:51:55 -04:00
ed 6f5b5f91c4 restore comment 2026-06-12 20:26:48 -04:00
ed ee3c90b865 refactor(rag_engine): Result API + NilRAGState (_init_vector_store, _validate_collection_dim, _get_state) 2026-06-12 20:14:40 -04:00
ed 64b787b881 refactor(ai_client): remove ProviderError class; ErrorInfo is the new error type 2026-06-12 19:41:41 -04:00
ed 73cf321cdf feat(ai_client): mark send() @deprecated; rewire to call send_result() 2026-06-12 19:22:27 -04:00
ed 9f86b2bee3 feat(ai_client): add send_result() public API returning Result[str] 2026-06-12 19:01:50 -04:00
ed d4d7d1ab14 refactor(ai_client): _send_llama_native_result() returns Result[str] 2026-06-12 18:47:14 -04:00
ed 6665152950 refactor(ai_client): _send_llama_result() returns Result[str] 2026-06-12 18:46:29 -04:00
ed 64d6ba2db5 refactor(ai_client): _send_qwen_result() returns Result[str] 2026-06-12 18:45:23 -04:00
ed e384afce9c refactor(ai_client): _send_minimax_result() returns Result[str] 2026-06-12 18:44:33 -04:00
ed 87cac3808f refactor(ai_client): _send_grok_result() returns Result[str] 2026-06-12 18:43:47 -04:00
ed 49923f9b43 refactor(ai_client): _send_deepseek_result() returns Result[str] 2026-06-12 18:42:53 -04:00
ed f840dbe85e refactor(ai_client): _send_anthropic_result() returns Result[str] 2026-06-12 18:41:15 -04:00
ed 943a21bfdc refactor(ai_client): _send_gemini_cli_result() returns Result[str] 2026-06-12 18:39:43 -04:00
ed 0282f9ff61 refactor(ai_client): _send_gemini_result() returns Result[str] 2026-06-12 18:38:43 -04:00
ed 0cad1e161f refactor(ai_client): classifier functions return ErrorInfo instead of ProviderError
The 6 error-classifier functions in ai_client.py, openai_compatible.py,
and qwen_adapter.py now return ErrorInfo (data-oriented) instead of
ProviderError. Each takes a source: str parameter for telemetry
provenance. ProviderError class is still used in production code paths
(Task 3.4) and will be removed in Task 3.7.
2026-06-12 18:32:05 -04:00
ed cf5e7b9925 feat(mcp): add Result-returning variants of resolve, read, list, search
Strictly additive: existing _resolve_and_check, read_file, list_directory,
and search_files are unchanged. The new variants return Result[Path] or
Result[str] using the data-oriented ErrorInfo/ErrorKind convention.
2026-06-12 17:44:55 -04:00
ed 46089e3649 feat(result_types): add Result, ErrorInfo, ErrorKind, NilPath, NilRAGState, OK 2026-06-12 16:38:09 -04:00
ed d7c6d67f69 feat(ai_client): wire v2 matrix fields into old vendor send functions
The matrix has v2 fields (reasoning, web_search, x_search)
populated for the old vendors (minimax-M2.5/M2.7, grok-*),
but the send functions didn't consult them. This commit
makes the code path actually USE the matrix:

  _send_minimax: gate reasoning_extractor on caps.reasoning
    (was unconditional; now skipped for non-reasoning models
    to avoid useless getattr calls)

  _send_grok: populate OpenAICompatibleRequest.extra_body with
    search_parameters when caps.web_search or caps.x_search is
    True. caps.web_search -> {mode: auto}; caps.x_search ->
    {sources: [{type: x}]} per the xAI Live Search spec

  OpenAICompatibleRequest: added extra_body field. Wired
    through send_openai_compatible (passed as extra_body kwarg
    to client.chat.completions.create).

Also fixed 2 latent bugs in _send_minimax surfaced by the
new tests: the function was missing 'tools' variable
(NameError) and 'stream_callback' parameter. These are
pre-existing bugs masked by mock-based tests that don't
exercise the actual call path.

Also cancelled t5_6/7/8 (the invented 'deferred tool-loop
conversion' work). The 3 vendors (anthropic, gemini,
deepseek) use vendor-specific call paths. Their inline
loops are NOT defects. The '3-5 days' / '1-2 weeks'
estimates were made up by the agent. The audit script's
DEFERRED_VENDORS exclusion is permanent.

Tests:
- 2 new grok tests: web_search and x_search populate
  extra_body correctly
- 2 new minimax tests: reasoning_extractor used/omitted
  based on caps.reasoning
- 122/122 vendor+tool+provider+import-isolation tests pass
  (no regressions; +4 new tests this commit)
- 3 audit scripts pass
2026-06-11 22:27:42 -04:00
ed c9135b0565 feat(gui): add v2 capability badges in provider panel
Phase 5 t5_4 (UI adaptations for 11 v2 fields): the simplest
honest adaptation — render small colored badges for the 11
v2 fields where the active vendor+model supports them. Each
badge has a tooltip showing the field name.

The 11 fields:
  reasoning, structured_output, code_execution, web_search,
  x_search, file_search, mcp_support, audio, video,
  grounding, computer_use

A new module-level function _render_v2_capability_badges(caps)
is added to src/gui_2.py (per the HARD RULE on no new
src/<thing>.py files). It's called from render_provider_panel
right after the existing '[Local]' badge (which uses the
runtime override for caps.local).

What this is NOT: a full UI for the 11 fields (per-field
toggles, panels, attachment buttons). Those are design-heavy
work and need their own track. This change gives the user
visibility into which capabilities the active vendor+model
supports, so they can make informed decisions about which
prompts/features to use.

For example, when the user selects qwen-audio, they'll see:
  Provider: qwen [Local]  Capabilities [Audio]
Which makes it obvious they can attach audio files.

Tests:
- 2 new tests in tests/test_vendor_capabilities.py:
  * All 11 v2 fields are present in the helper (drift guard)
  * Helper is a no-op on empty caps (no fields True)
- 118/118 vendor+tool+provider+import-isolation tests pass
  (no regressions; +2 new tests this commit)
- 3 audit scripts pass
2026-06-11 21:46:41 -04:00
ed 7fee76f491 feat(capability_matrix): add anthropic, gemini, deepseek registry entries
Phase 5 t5_1, t5_2, t5_3: populate the v2 capability matrix
for the 3 vendors that had no registry entries. Previously,
get_capabilities('anthropic', ...) raised KeyError and the
GUI fell back to the 'unregistered' defaults. Now all 8
vendors in PROVIDERS are on the matrix.

Entries added:

  anthropic/*  (12 entries)
    - wildcard + 8 sonnet/opus variants + haiku-4-5 + claude-fable-5
    - caching=True, structured_output=True, file_search=True,
      mcp_support=True, computer_use=True (per Claude 3.5+ docs)
    - cost: sonnet=\/\, opus=\/\, haiku=\/\
    - context_window=200000 (Claude 3+ standard)

  gemini/*  (5 entries)
    - wildcard + 3.1-pro-preview + 3-flash-preview + 2.5-flash + 2.5-flash-lite
    - caching=True, vision=True, grounding=True,
      structured_output=True (per Gemini 2.5+ docs)
    - video=True, audio=True (for 2.5+ and 3.x; lite has no video/audio)
    - cost: 3.1-pro=\.50/\.50, 3-flash=\.15/\.60,
      2.5-flash=\.15/\.60, 2.5-flash-lite=\.075/\.30
    - context_window=1000000 (Gemini 2.5+ standard)

  deepseek/*  (4 entries)
    - wildcard + deepseek-v3 + deepseek-reasoner + deepseek-r1
    - reasoning=True (for r1/reasoner; v3 has structured_output=True only)
    - structured_output=True (all)
    - cost: v3=\.27/\.10, r1=\.55/\.19
    - context_window=32768

Tests:
- 9 new tests in tests/test_vendor_capabilities.py:
  * anthropic: sonnet/opus/haiku/wildcard entry tests
  * gemini: pro-preview + vision + wildcard tests
  * deepseek: reasoner + wildcard tests
- 116/116 vendor+tool+provider+import-isolation tests pass
  (no regressions; +9 new tests this commit)
- 3 audit scripts pass
2026-06-11 21:35:32 -04:00
ed 7d60e8f5ab feat(capability_matrix): populate v2 fields per-model; add runtime local override
Updates per-model registry entries to populate the 12 v2
fields where the capability is genuinely supported:

  minimax-M2.5/M2.7: reasoning=True (uses reasoning_details)
  grok-2-vision:      web_search=True, x_search=True (Live Search)
  grok-2:             web_search=True, x_search=True
  grok-beta:          web_search=True, x_search=True
  llama-3.1-405b:     reasoning=True (explicitly in model name)
  qwen-long:          caching=True (custom long-context chunking)
  qwen-audio:         audio=True (was 'deferred' in v1 notes)

Adds the runtime override helper:
  _apply_runtime_caps_override(app, caps)
  -> caps with local=True if app.current_provider=='llama'
     AND _llama_base_url contains 'localhost' or '127.0.0.1'

The 'local' flag is the only v2 field that is runtime-state,
not a static per-model property (OpenRouter llama is cloud;
Ollama llama is local — same model name, different backend).
The override uses dataclasses.replace() to mutate the
frozen dataclass. Implemented in src/gui_2.py (per the
HARD RULE on no new src/*.py files).

The override is wired into App._get_active_capabilities()
so the GUI sees caps.local=True when the active backend
is Ollama and caps.local=False otherwise.

Also: cost panel in src/gui_2.py (per-tier + session-total
columns) now renders 'Free (local)' when caps.local=True
(both the per-tier cost column and the session-total line).
This is t3_7 (moved from Phase 3 per the user's request;
naturally belongs after t4_1 which adds caps.local).

Tests:
- 3 new tests in tests/test_vendor_capabilities.py:
  * per-model population (reasoning, audio, caching, vision)
  * runtime override for llama+localhost
  * runtime override does NOT touch other vendors
- 107/107 vendor+tool+provider+import-isolation tests pass
  (no regressions; +4 new tests this commit)
- 3 audit scripts pass
2026-06-11 21:04:36 -04:00
ed 49d516042e feat(gui): add 'Local Model' badge in provider panel for local backends
When the active vendor+model has caps.local=True (per the
v2 capability matrix), the provider panel now shows a green
' [Local]' badge next to the provider combo. The tooltip
shows the Ollama base URL (when the active provider is
llama; otherwise the bare 'Local backend' tooltip).

Implements t4_4 of qwen_llama_grok_followup_20260611
Phase 4. Future use: Phase 4 t3_7 (moved from Phase 3)
will use caps.local to render 'Free (local)' in the cost
column.

The badge uses theme.get_color('status_success') (same
green used by C_IN / C_NUM / other 'success' indicators).
Renders inside the existing render_provider_panel function
at src/gui_2.py:2308.

Verification:
- import src.gui_2 OK (no syntax errors)
- 44/44 vendor+capability+provider tests pass (no regressions)
- 4 audit scripts pass
2026-06-11 20:50:13 -04:00
ed 25baa6fe25 feat(ai_client): add native Ollama adapter; route localhost to it
When _llama_base_url is localhost/127.0.0.1, _send_llama now
calls _send_llama_native (the native /api/chat adapter)
instead of the OpenAI-compat path. The native adapter
supports Ollama's vendor-specific fields: think, images,
thinking.

Functions added (in src/ai_client.py, per the naming
convention HARD RULE on no new src/*.py files):

  ollama_chat(model, messages, *, think='low', images=None,
              tools=None, base_url=OLLAMA_DEFAULT_BASE_URL)
    -> dict[str, Any]

  _send_llama_native(md_content, user_message, base_dir,
                     file_items=None, discussion_history='',
                     stream=False, ...callbacks) -> str

  OLLAMA_DEFAULT_BASE_URL: str = 'http://localhost:11434'

Implementation notes:
- requests loaded via _require_warmed('requests') (local
  scope; preserves startup_speedup_20260606 invariant that
  heavy SDKs are warmed on _io_pool, not imported at module
  level)
- _send_llama dispatches based on 'localhost' in
  _llama_base_url (same check already used by
  _get_llama_cost_tracking at line 2500)
- Removed orphan def stub at the old _send_llama body (the
  dead 'def _build_llama_request' that was overwritten by
  the real one — a known session issue with stale set_file_slice
  edits)
- Native adapter appends the 'thinking' field to history so
  subsequent rounds preserve the reasoning chain

Tests:
- 7 new tests in tests/test_llama_ollama_native.py:
  * ollama_chat hits /api/chat (not /v1/chat/completions)
  * ollama_chat includes 'think' param in payload
  * ollama_chat includes 'images' in payload
  * _send_llama_native wraps ollama_chat
  * _send_llama_native preserves 'thinking' field
  * _send_llama routes localhost to native (no openai client)
  * _send_llama keeps openai path for non-local (no POST)
- Updated test_send_llama_ollama_backend in test_llama_provider.py
  to mock the native path (was: mocked openai-compat; now:
  mocked requests.post)
- 103/103 vendor+tool+provider+import-isolation tests pass
  (no regressions; +7 new tests this commit)
- 4 audit scripts pass
2026-06-11 20:45:08 -04:00
ed 0a9e277564 feat(capability_matrix): add 12 v2 fields to VendorCapabilities
The 7 v1 fields (vision, tool_calling, caching, streaming,
model_discovery, context_window, cost_tracking) plus 2 cost
fields and notes are now extended by 12 v2 fields:

  local, reasoning, structured_output, code_execution,
  web_search, x_search, file_search, mcp_support,
  audio, video, grounding, computer_use

All default to False. Registry entries continue to work
unchanged (backward compatible). t4_1 of Phase 4.

Tests:
- 12 parameterized 'default is False' tests
- 12 parameterized 'round-trip to True' tests
- 3 'local flag' tests: per-model, wildcard fallback,
  vendor isolation
- 3 pre-existing registry tests still pass
- 96/96 vendor+tool+provider+import-isolation tests pass
  (no regressions; +27 new tests this commit)
2026-06-11 20:24:30 -04:00