code-context-control 2.46.0__py3-none-any.whl → 2.49.0__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.
Files changed (48) hide show
  1. cli/c3.py +11 -3
  2. cli/commands/parser.py +10 -1
  3. cli/tools/compress.py +1 -2
  4. cli/tools/federate.py +0 -1
  5. cli/tools/filter.py +1 -2
  6. cli/tools/read.py +1 -2
  7. cli/tools/search.py +1 -2
  8. {code_context_control-2.46.0.dist-info → code_context_control-2.49.0.dist-info}/METADATA +1 -1
  9. {code_context_control-2.46.0.dist-info → code_context_control-2.49.0.dist-info}/RECORD +48 -28
  10. oracle/config.py +11 -0
  11. oracle/oracle.html +46 -1
  12. oracle/oracle_server.py +132 -18
  13. oracle/oracle_ui.html +1215 -0
  14. oracle/services/c3_bridge.py +194 -59
  15. oracle/services/chat_engine.py +453 -141
  16. oracle/services/federated_graph.py +52 -2
  17. oracle/services/local_session.py +54 -0
  18. oracle/services/ollama_bridge.py +87 -7
  19. oracle/services/project_scanner.py +60 -6
  20. oracle/services/review_agent.py +84 -1
  21. oracle/services/tool_registry.py +82 -3
  22. oracle/ui/activity.js +101 -0
  23. oracle/ui/agents.js +108 -0
  24. oracle/ui/app.js +9 -0
  25. oracle/ui/busy.js +102 -0
  26. oracle/ui/chat/conversations.js +153 -0
  27. oracle/ui/chat/input.js +284 -0
  28. oracle/ui/chat/markdown.js +33 -0
  29. oracle/ui/chat/send.js +281 -0
  30. oracle/ui/chat/stream_renderer.js +767 -0
  31. oracle/ui/chat/toolbar.js +270 -0
  32. oracle/ui/core.js +60 -0
  33. oracle/ui/crossgraph.js +184 -0
  34. oracle/ui/header.js +69 -0
  35. oracle/ui/insights.js +52 -0
  36. oracle/ui/projects.js +245 -0
  37. oracle/ui/settings.js +186 -0
  38. oracle/ui/suggestions.js +47 -0
  39. oracle/ui/theme_tabs.js +52 -0
  40. services/artifact_store.py +1 -1
  41. services/project_runtime.py +16 -3
  42. services/runtime.py +1 -1
  43. services/subprojects.py +7 -4
  44. services/task_store.py +1 -1
  45. {code_context_control-2.46.0.dist-info → code_context_control-2.49.0.dist-info}/WHEEL +0 -0
  46. {code_context_control-2.46.0.dist-info → code_context_control-2.49.0.dist-info}/entry_points.txt +0 -0
  47. {code_context_control-2.46.0.dist-info → code_context_control-2.49.0.dist-info}/licenses/LICENSE +0 -0
  48. {code_context_control-2.46.0.dist-info → code_context_control-2.49.0.dist-info}/top_level.txt +0 -0
cli/c3.py CHANGED
@@ -85,7 +85,7 @@ console = Console() if HAS_RICH else None
85
85
  # Config
86
86
  CONFIG_DIR = ".c3"
87
87
  CONFIG_FILE = ".c3/config.json"
88
- __version__ = "2.46.0"
88
+ __version__ = "2.49.0"
89
89
 
90
90
 
91
91
  def _command_deps() -> CommandDeps:
@@ -5632,10 +5632,18 @@ def _bb_cmd_set_default(args, project_path: str) -> None:
5632
5632
 
5633
5633
 
5634
5634
  def cmd_oracle(args):
5635
- """Oracle Discovery API key + connection management."""
5635
+ """Oracle dashboard server + Discovery API key management."""
5636
5636
  sub = getattr(args, "oracle_cmd", None)
5637
+ if sub in ("serve", "start"):
5638
+ # Lazy import: run_oracle builds all Oracle services (matches
5639
+ # cmd_hub's deferred-import style so bare `c3` stays fast).
5640
+ from oracle.oracle_server import run_oracle
5641
+ run_oracle(port=getattr(args, "port", None),
5642
+ open_browser=not getattr(args, "no_browser", False))
5643
+ return
5637
5644
  if sub != "api":
5638
- print("Usage: c3 oracle api {info,key,rotate,clear}")
5645
+ print("Usage: c3 oracle {serve,api} — serve: launch the dashboard; "
5646
+ "api {info,key,rotate,clear}: manage the Discovery key")
5639
5647
  return
5640
5648
 
5641
5649
  from oracle.config import load_config
cli/commands/parser.py CHANGED
@@ -357,9 +357,18 @@ def build_parser(version: str, parse_cli_ide_arg):
357
357
  # ── Oracle Discovery API (v2.32.0) ──────────────────────────────────
358
358
  p_oracle = subparsers.add_parser(
359
359
  "oracle",
360
- help="Oracle Discovery API key + connection management",
360
+ help="Oracle dashboard server + Discovery API key management",
361
361
  )
362
362
  or_subs = p_oracle.add_subparsers(dest="oracle_cmd")
363
+ or_serve = or_subs.add_parser(
364
+ "serve",
365
+ aliases=["start"],
366
+ help="Launch the Oracle dashboard server (REST + MCP discovery endpoints)",
367
+ )
368
+ or_serve.add_argument("--port", type=int, default=None,
369
+ help="Server port (default: config 'port', 3331)")
370
+ or_serve.add_argument("--no-browser", action="store_true",
371
+ help="Don't open the browser")
363
372
  or_api = or_subs.add_parser(
364
373
  "api",
365
374
  help="Show connection info / manage the Discovery API key",
cli/tools/compress.py CHANGED
@@ -8,9 +8,8 @@ import sys
8
8
  from concurrent.futures import ThreadPoolExecutor, as_completed
9
9
  from pathlib import Path
10
10
 
11
- from core import count_tokens
12
-
13
11
  from cli.tools._helpers import finalize_with_tokens, show_token_ratios
12
+ from core import count_tokens
14
13
 
15
14
 
16
15
  def _run_memory_mcp_cli(args: list, cwd: str, timeout: int = 30) -> tuple:
cli/tools/federate.py CHANGED
@@ -7,7 +7,6 @@ unions child facts. Results stay in per-scope sections — TF-IDF scores are
7
7
  not comparable across corpora, so no interleaved ranking.
8
8
  """
9
9
 
10
- from pathlib import Path
11
10
 
12
11
  # Budget split for scope='all': the parent keeps the lion's share.
13
12
  _PARENT_BUDGET_SHARE = 0.6
cli/tools/filter.py CHANGED
@@ -10,9 +10,8 @@ import json
10
10
  import re
11
11
  from pathlib import Path
12
12
 
13
- from core import count_tokens
14
-
15
13
  from cli.tools._helpers import finalize_with_tokens, show_token_ratios
14
+ from core import count_tokens
16
15
 
17
16
 
18
17
  def handle_filter(file_path: str, text: str, pattern: str, max_lines: int,
cli/tools/read.py CHANGED
@@ -6,9 +6,8 @@ from concurrent.futures import ThreadPoolExecutor, as_completed
6
6
  from pathlib import Path
7
7
  from typing import Any
8
8
 
9
- from core import count_tokens
10
-
11
9
  from cli.tools._helpers import finalize_with_tokens
10
+ from core import count_tokens
12
11
 
13
12
 
14
13
  def _coerce_list(val: Any) -> list[str] | None:
cli/tools/search.py CHANGED
@@ -5,9 +5,8 @@ import time
5
5
  from concurrent.futures import ThreadPoolExecutor, as_completed
6
6
  from pathlib import Path
7
7
 
8
- from core import count_tokens
9
-
10
8
  from cli.tools._helpers import finalize_with_tokens, show_token_ratios
9
+ from core import count_tokens
11
10
 
12
11
  # Hard cap: responses above this are truncated to avoid filling context.
13
12
  _RESPONSE_TOKEN_CAP = 2400
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-context-control
3
- Version: 2.46.0
3
+ Version: 2.49.0
4
4
  Summary: Local code-intelligence layer for AI coding tools (Claude Code, Codex, Gemini, Copilot). Retrieve less, read less, edit safer — and version the configs that shape your agent (CLAUDE.md, skills, hooks, MCP).
5
5
  Author-email: Dimitri Tselenchuk <dtselenc@gmail.com>
6
6
  License-Expression: Apache-2.0
@@ -1,6 +1,6 @@
1
1
  cli/__init__.py,sha256=ec66drCZGNMRU4V6ov0zVhYZph1us12Vn8OvG_LJyRY,22
2
2
  cli/_hook_utils.py,sha256=zlquaQm0dvwdaZewD6YnFyF_LBzhmfFUUhL_8UbBKGA,11749
3
- cli/c3.py,sha256=DvhSlvy2rI6L11_vEoL5J0tinVXjxmbOV7sSU_TdrVs,304129
3
+ cli/c3.py,sha256=G0_1nQcdA4SgpVx5FjvIrpoVR10vm8CqwJMoPPCRSqI,304587
4
4
  cli/docs.html,sha256=CC_-4PaQxfjNXbcqcVuU5rzdbP1NosYJxFRiXZV4joI,143645
5
5
  cli/edits.html,sha256=UjAhoCmBmQ89cklGvJqzC6eyNP2tc8H6T-e01DVkLvE,43418
6
6
  cli/hook_artifact.py,sha256=Se1CNBfoBFyvJQlRmYdNtdRXIkQp9zaF0O6ndRMo7ts,2198
@@ -27,7 +27,7 @@ cli/ui_legacy.html,sha256=cI8tC6RKmE2NIJOcsu7CY-zT4VznjcbD6NTjxb_fvUY,378460
27
27
  cli/ui_nano.html,sha256=UAwQ6bbTOXAoGq191AZ7slhngR9edJSa3IhqpynveDg,27740
28
28
  cli/commands/__init__.py,sha256=0Z8MABNzwSFJGT4Xv9R5AJVR8XxraTsuVTz5b0bShmo,38
29
29
  cli/commands/common.py,sha256=fHZWzkd4OLl3vPWTTgaI5vaqMi3Ma3XqAu1Ds_-51_4,11299
30
- cli/commands/parser.py,sha256=Opci6sxpmp0fND1XI77blOYjf04rwGCpL5lwd6y33U8,24923
30
+ cli/commands/parser.py,sha256=inkJuMro1kkpKj8lpiWRlNYPQ_DC4REF-m6Ut1CAkmA,25355
31
31
  cli/guide/bitbucket.html,sha256=5HrLDm6Ue-AJZ81bqWaSp2nSfxaRdEjHFY29P7plLXA,33350
32
32
  cli/guide/getting-started.html,sha256=F3AaF2HVfeg6eKO25p_vPogr_i1hvkjIZVggIJFWTl0,18829
33
33
  cli/guide/index.html,sha256=XIpgQN0XbLJzL-Atou65NU5Irj_I-w4mbERU9WfZJ0E,21223
@@ -61,17 +61,17 @@ cli/tools/_helpers.py,sha256=lv6Bxeh_pseDXCJ4trKn0cpzPSxdb7AYjMmtSrjqkbQ,5858
61
61
  cli/tools/agent.py,sha256=fdt5kmw9O-AEKlYaij-PPmCJ4sI7bmdej56V4NGWaqI,48145
62
62
  cli/tools/artifacts.py,sha256=98shRIs3cdC8r0E1gfsEOIDUopqSP1WpYwzFiWfdtg0,7491
63
63
  cli/tools/bitbucket.py,sha256=_hgORCW9-IF5xZJaznoONVfaTGKaX8VcU7ALrBeLhWo,27518
64
- cli/tools/compress.py,sha256=XuhxebMGyWNqysZs4V17F8IN6b4tkmq52aUXXkMOADM,10061
64
+ cli/tools/compress.py,sha256=aZ4owwqaQLtkszDr_g7yv5KkvtQPuqaSyMk-aM_hsCY,10060
65
65
  cli/tools/delegate.py,sha256=mwsEUsPXlC1ldkhhSk-i4_JUMsXy9ptIwlYV2_-kOoI,53812
66
66
  cli/tools/edit.py,sha256=GB3qdMhWEly4TYyU-P66Uqe87Nw6ZBzH-9ZO6_Q64t4,16604
67
67
  cli/tools/edits.py,sha256=8zM01TzLmjm7ULQlCmXOmitlJd84zQHVzE0z7UHJUdA,5520
68
- cli/tools/federate.py,sha256=PTjYVTHHZfKfWiW9t9bi4IiKFISkPocgj1bSCy_JSXQ,4675
69
- cli/tools/filter.py,sha256=KzBMbKLlWpFt3wIgD9BuFctoP28ztyxCQFa8nGcR1Aw,12084
68
+ cli/tools/federate.py,sha256=wmC2QN7A6aay3cT7U9LDPYRCZKL1m_T6qFdZzpZmPx4,4650
69
+ cli/tools/filter.py,sha256=_yhjOncC1kb-aRxjT7pkSILcMC-yXarBMh7oNS057rQ,12083
70
70
  cli/tools/impact.py,sha256=jjWkFTxHu-gBpZZNd2HTdBl22itA6-wwwOZXxk_qBl8,6257
71
71
  cli/tools/memory.py,sha256=yDDRsEngeFcjb6nXUrhRZXuboasXfixJeyltKhDbZD4,24935
72
72
  cli/tools/project.py,sha256=_2a2Rjw2xwbE-muJtH28uT7vjnPGQLGDDXbhmDO6Gh0,16407
73
- cli/tools/read.py,sha256=o-3BzUPHpR35sk34FF0YEYw8-fFp6_u9hMgya5cWLXg,12351
74
- cli/tools/search.py,sha256=CahWN9NbsD2A7z7okYnUlZlncteujLDXENFq3_3pL1U,14681
73
+ cli/tools/read.py,sha256=Lp-JCBToro1stV6tKrnKHLQA-K0x4eMM_L3QrNq7VHw,12350
74
+ cli/tools/search.py,sha256=6rsqZMaa11-5cmf75KtGwB5pn-fNq66hRT_1ffxEI-A,14680
75
75
  cli/tools/session.py,sha256=LIZbmEhNdh6rAsT6Dbpb21UY8xF9oubvpjGwfnXxQK4,4573
76
76
  cli/tools/shell.py,sha256=vGsvzQLISo-daKF40ZhRJXS5lDA6OV1t9RWoyqdlpt4,12617
77
77
  cli/tools/status.py,sha256=mK2840JMQkJkbHGQU0f2Epr-vmkXwQKUzqmMVeOYu-0,14913
@@ -93,40 +93,60 @@ cli/ui/components/sessions.js,sha256=FIKtil76B8tCkAmcFV7hlj6GQ_DCJK2jCzvEmdK7NBE
93
93
  cli/ui/components/settings.js,sha256=8LVTV2TQl9tcRXhXbtBEJOCBdiyk-x2QASoVYZUAuEA,71442
94
94
  cli/ui/components/sidebar.js,sha256=cAY_jwYB-o1X_wWn__VXlG4IegVObuE3NmVsuFWqxtg,7417
95
95
  cli/ui/components/tasks.js,sha256=OxLhspzzEQjxxtSEpOpugO2KptD4xNrimf_xM0wiVv8,12752
96
- code_context_control-2.46.0.dist-info/licenses/LICENSE,sha256=l8Kh5QCNWNvR6kIt8L0BUZvc2LAFiHv2c-FnsGnUZf4,11301
96
+ code_context_control-2.49.0.dist-info/licenses/LICENSE,sha256=l8Kh5QCNWNvR6kIt8L0BUZvc2LAFiHv2c-FnsGnUZf4,11301
97
97
  core/__init__.py,sha256=TSDCEcM4V7gcZVM3w2ykJaqEUch4Dkon-rivV17T73s,2501
98
98
  core/config.py,sha256=9R8bIcHhjSPdrfcCeMPnS4YgLCyRNWwlt_Z75PZcBDE,14780
99
99
  core/ide.py,sha256=9LzsDVK2LL8RVpL40l6oNGiasZ3D8OCU_9i9A0gJKBo,6876
100
100
  core/mcp_toml.py,sha256=wfc7c6X7lIW5YpdWFnRK0qQ0M46v2t8j6WzcqfTKhaE,5627
101
101
  core/web_security.py,sha256=HwgK5aBATfvRIeO_4gWgzK77gKwGuzVlmiuNGm4gGxI,7884
102
102
  oracle/__init__.py,sha256=-OTD7Jh4mUMA4QgPGthPLWXttgZLpkIPhGQ87ZfHBx0,63
103
- oracle/config.py,sha256=ErjH6Y_F51jGXpYo_4boGhdIk-AIo3rDH3xDwUGs7B8,3193
103
+ oracle/config.py,sha256=XEYMH0InBJxhls4b0vD7gvBqMUdxVVHrTHTLz-rZVZg,3838
104
104
  oracle/mcp_oracle.py,sha256=B5B-qSxi37outsuRHn1Ns6Gj8e7W593rmL34LMzuE8M,8980
105
- oracle/oracle.html,sha256=fWs60EW0ZOBMyC_XwB0SWN_LpjI8S2eACt23pJeUI7g,190791
106
- oracle/oracle_server.py,sha256=dxoycgeJvVezGPuoharv1uMa0BUIBfHJ5QqQWUDsuk4,37617
105
+ oracle/oracle.html,sha256=g8HS_wXx4jPwi2ccSOdMe6FHiYP51DmkFuznWHZjBfQ,193362
106
+ oracle/oracle_server.py,sha256=kWVIypqW1p7t6tpDKSQlWVrEcj2ez6zNjOWvGjLPaZo,41902
107
+ oracle/oracle_ui.html,sha256=bkSmag8UF93nshnIzOEyiN3ilY9qBlYzERofxcrnStI,68165
107
108
  oracle/services/__init__.py,sha256=Nb4POd1_YIwLVYsGfr-DiK-iKTelkU0fh9m7wjeLQHA,23
108
109
  oracle/services/activity_reporter.py,sha256=ZAxNFyUy7QRP28anQLRbKEwm5SGG97KIQYFQDLjYqlM,11729
109
110
  oracle/services/api_auth.py,sha256=1PW3pG--1DJb_F6qMhP3gBTYHxxPE2bsHmVmIhC81Y8,3566
110
- oracle/services/c3_bridge.py,sha256=TgYnX9tJvzpXx6B2eC3EhJkqoKoRUaGJw0nrBidLKVA,10752
111
- oracle/services/chat_engine.py,sha256=yKJcqtLNuwDy_sMVOBZk1R7uAH6d9QboPjfAbekqhSs,50500
111
+ oracle/services/c3_bridge.py,sha256=RqSw1tOoUDXA21fKDHmZ7s7qrIj3jiDYq8j8OvbxshA,17919
112
+ oracle/services/chat_engine.py,sha256=5vSPjjsaA1Swbs9Ob4bS60SRgTa58YQV8pzzxcXCTbc,66126
112
113
  oracle/services/chat_store.py,sha256=mizKwDyFGESKh63V-XgyNd3jQVrN2JCQc-7u8z3_1F4,6252
113
114
  oracle/services/cross_memory.py,sha256=F8JeYkEFSwQL3iGS9KV1onaMSFj3opr6f3nCxwvznV0,5484
114
- oracle/services/federated_graph.py,sha256=F808OkuqAbKXHqugP0PfQRLk-KrROLfjSLGLBVb6p-c,17735
115
+ oracle/services/federated_graph.py,sha256=I9FWedcht6-FU2hoIlMHlXyjpwrspKueIN-jEYek6vg,19947
115
116
  oracle/services/health_checker.py,sha256=SlsW4nxP5u8gHJY9FpeaZoC9_K-NhoiHr2Q7JvGMvdY,4359
116
117
  oracle/services/insight_engine.py,sha256=YBZX28P-ME-nJ02cebFIVH0WvIGebFnQQCt8paXri4Y,11417
118
+ oracle/services/local_session.py,sha256=2DC7Lyr1g4_LkT4N7MHlQgaLSeulHPd-FvJK1hpN6ek,1877
117
119
  oracle/services/memory_reader.py,sha256=rSEmoIXQu2JkolHJIQWpn0piPJpyuf1KZvW_9liQwkU,3727
118
120
  oracle/services/memory_writer.py,sha256=hpvYsxjhl293jEjGcRKfjG5njUaAOXKqbmJaUu1WdUU,6997
119
- oracle/services/ollama_bridge.py,sha256=d0458HTaQO9m-Ur4bRIt9izxbJFDj1Dbea9sfo7MRCU,12958
120
- oracle/services/project_scanner.py,sha256=SGHYKU00fm57L5VyDuet-CAACfrhUZY2xvIlZR27aj4,3142
121
- oracle/services/review_agent.py,sha256=99PQ1oKxRDo_4COMOy3CJOawqk08MRJ4cS66_w7SWCo,7720
121
+ oracle/services/ollama_bridge.py,sha256=T3Xif3OXsjtsJvsNXhr_iRlB3fr9lbFipuA_1ngK7jQ,16705
122
+ oracle/services/project_scanner.py,sha256=gHpXihRZSu2gXCp4vvOWp5gMAsmfINE9ESiqVF1uV3A,5587
123
+ oracle/services/review_agent.py,sha256=m_fzoHowpiibf0_iz3dF72LWSrwB_FbDd1am-SbeWXg,11273
122
124
  oracle/services/tool_executor.py,sha256=xtAkBWkclh_FwOgzprjGkyRIV8-A7Lc3bz0UFPShrv0,1113
123
- oracle/services/tool_registry.py,sha256=OSTl_ngQTO-JJRgcXvNeM6A5WDxTLfcCslafZjmolpA,19950
125
+ oracle/services/tool_registry.py,sha256=fHXgQ2Y7T8JdjrxYgAnOlYRANtve5SikkEuf4b86i94,25686
126
+ oracle/ui/activity.js,sha256=zbJjqkY-tTQS4YKcdSEr2Z5zAbwbOIPyTNzldQSPU7I,4830
127
+ oracle/ui/agents.js,sha256=RNnsGUVg5DlRYiv-Ovzb3W4yyP4z0qTX3o7Y1_BgZpo,4538
128
+ oracle/ui/app.js,sha256=wj3GquJYuc21578HdMlvHwthpVilzP0N6HjZUvTjUzE,678
129
+ oracle/ui/busy.js,sha256=ePFGqEheHpn-E971pN_9DbQvvkxD-d2V7Efbw68bpo0,4122
130
+ oracle/ui/core.js,sha256=M6gt_AjxKLoZ8sEYsHT1n4-qR4F7qMSe80Quls1hgL8,3214
131
+ oracle/ui/crossgraph.js,sha256=7yBCciuEzZ0LYspWMO0xTe_GuPQ_NccnIeRrqEq5Qxs,9234
132
+ oracle/ui/header.js,sha256=IrtNb6M77ZCtuqdcX-bxM6RQavLtTY7sbgCXKhOf8-o,3381
133
+ oracle/ui/insights.js,sha256=zACyfGz9-4y2eFd6OM1IE-L_HyL1wnqo46nJDyRx7-M,2408
134
+ oracle/ui/projects.js,sha256=ULE6Py1iULVmRGy0mCnEAxKNwHvn-baUYlNDF5xGYM8,13002
135
+ oracle/ui/settings.js,sha256=4p4CB_5GFic1uHeiDHtN7yB5Ma0dLN5HAVDQ_04QbGo,7889
136
+ oracle/ui/suggestions.js,sha256=ItQTlyd6LS_QxvbJmNMYeHY3cl0lSRgBdR53XKkBpP0,2332
137
+ oracle/ui/theme_tabs.js,sha256=JN018kQjX-AEoh4QT1d59VrBb_XwNuGDsFG7blKwBUA,2728
138
+ oracle/ui/chat/conversations.js,sha256=FOpXNrIeiJUR9VueBYEuLml-VfJfuHo05ZVkT-x7XRI,5907
139
+ oracle/ui/chat/input.js,sha256=9m48OZzmhCygND24pjZikOBzEXhOK6YqwWt4d5bjKbs,9329
140
+ oracle/ui/chat/markdown.js,sha256=14Le4i88756PQvsl2ZuKGMuRw1FDuEPXr_oi2U6kLFM,1508
141
+ oracle/ui/chat/send.js,sha256=k2qGN_asb7FTjcLa204Zjq4X_QWHIKHQnI33IEuxvaQ,11558
142
+ oracle/ui/chat/stream_renderer.js,sha256=RZndI2mu5xbzZF-4NG9jeOqXTcmIqfZqxgkrBvTzWmk,29861
143
+ oracle/ui/chat/toolbar.js,sha256=ZDexIIpGwsQ6XsY4Tyo082rJoofdD_JBTV97-mLQUVM,12027
124
144
  services/__init__.py,sha256=3Kn4cZweLm7at8wFdBdZ-Zwo8hHcnVIsmY5f29nzi2Y,116
125
145
  services/activity_log.py,sha256=PNGeEYlw1Aux-mRU4pKCQdbsSuzLvOg7MYiq-cb4n8g,4473
126
146
  services/agent_base.py,sha256=a-gdSd_jtZtbjXo1WS8CnWCagXgKaGZd5ShcG6s0kT4,4809
127
147
  services/agents.py,sha256=zwbnRjvKo9tEC2g-HK2KW-uy1r6g_5GSehDZHstcMEk,79613
128
148
  services/artifact_defs.py,sha256=PxBPrhD6raU2HcesZvwgq_Nw4EvqJaVcczw2mcqOe-Q,9355
129
- services/artifact_store.py,sha256=qI4W9NKS7Z5o-nOmCYbXklJguelh2Ufm-5D8S7Yxs_s,28081
149
+ services/artifact_store.py,sha256=PAkirolhn6z-agr-V7aJgezfJFHeR5oAjmqC4FBA3yA,28081
130
150
  services/auto_memory.py,sha256=v__ZS1e68533_Yv491mZtvuZnheC63q6_uTvWhBw3Lw,14290
131
151
  services/benchmark_dashboard.py,sha256=iR-DnqnoKbqHMJ4d-ZkIvJBYfzwTa7r-jzO6j2BYDfQ,27711
132
152
  services/bitbucket_client.py,sha256=JByovvtVZ6F4NcU611KVuTgKlT1rIsX2A2VlBDfvRV8,17509
@@ -158,18 +178,18 @@ services/ollama_client.py,sha256=UiC5Abca622-ac-4goCkAjwo7iUye9g9JGFMN6Ea08M,798
158
178
  services/output_filter.py,sha256=lknQHs38JlRtXU4Ogoru6sveNokSKBQPfZXhf-fE0xM,21736
159
179
  services/parser.py,sha256=CPoIN1FmX7kK-55FnC3jvRy3NLjlnf1armTaD6o7GBg,55203
160
180
  services/project_manager.py,sha256=LaNWqBeVMx6wcB6iiOQyRWSWhS-JXzfDApJmHFmTCy8,36477
161
- services/project_runtime.py,sha256=e4qDsYbjsWbm7RyAUOPdKbPXFoO4OBApnlQM69Tw-bE,10982
181
+ services/project_runtime.py,sha256=yyftX48BFjq4B2KcR4KGszDAAa4xR6gn6j0SgTyro1s,11603
162
182
  services/protocol.py,sha256=E0xxs43j-YSOBWalKHbX_wwqphQgDjqUjyyvTW0s6II,12247
163
183
  services/proxy_state.py,sha256=u5rd0k6CrOsywZA8FpRu_hMLwhR0TAJhZjy5MdWbCGc,6107
164
184
  services/retention.py,sha256=I2_RV233kWBBXox5rc_w-1h1aPua93o9huuPf-pJVuE,18629
165
185
  services/retrieval_broker.py,sha256=9X67VZ_6AkbAzopHuuMFKmP4CGZLnW576kjSKMenBnw,5261
166
186
  services/router.py,sha256=Cz10nx2fKTbaGn14mSBePWIDrw5rdcs_1JFYXeik084,15626
167
- services/runtime.py,sha256=cR4hYYauNF6BE7SjbmXfpj4fCdWfX5H4bE2Fi4oiEXg,12094
187
+ services/runtime.py,sha256=RI_xvNx2SoO5PKJmGwYMPQK8QYcCqwX8DNzaFRQ9ngM,12094
168
188
  services/session_benchmark.py,sha256=GX3H8OwKC0X9Kk5U-vfY6Y7qq9Qaz2HwadNA7mjO8RY,105047
169
189
  services/session_manager.py,sha256=qUo7ool6dDWXfVgFpokIRcWqkWh10OzMcp7aZTdmTHY,51632
170
190
  services/session_preloader.py,sha256=DsTAXMKVtrX9yu1sEFojYDi9-jkSAj1Ylt9JTy57Dow,9883
171
- services/subprojects.py,sha256=xkW0okEWuYyF4m2dZxeHdbCxn6VdvM4_68zo360TNbs,24779
172
- services/task_store.py,sha256=XWdWhBhIghsEDOiwUHdCfH2co4mmi6CQ48vCxau9RQ4,24743
191
+ services/subprojects.py,sha256=DxD-3f4wCrwAg7F8znbvWFJf_lizgmulVDqozKGSztI,24965
192
+ services/task_store.py,sha256=DHDLsmiH-92mmAvH5Q0AKa_8kqwMupZvxu3mWVZ_FLo,24742
173
193
  services/telemetry.py,sha256=KbWCe7F8lGY9DufVPWGyGFo-IBcPgWh0kd3ySJnIgFE,11377
174
194
  services/text_index.py,sha256=r3o4CobTG9jAO9PWazgbWYLY9oi_FgEJ3xwEXrF4KM0,2783
175
195
  services/tool_classifier.py,sha256=Fgvq0ZcpnCskwtO8a3YI1MiecPNnw6UbPyJQIUwgfiQ,6512
@@ -200,8 +220,8 @@ tui/screens/search_view.py,sha256=MMHjVdlk3HZSuDBSvq8IGrqv_Mh5Us6YqXQ80bcWSMk,19
200
220
  tui/screens/session_view.py,sha256=eZ1eDwHTvPOck1wCCviixtOaCxIkBT_95ytNNNriGNA,5991
201
221
  tui/screens/stats.py,sha256=p81PjzdaIv7hllb8f45-rlVe4lJZwSdIMqu7e86_u5s,6223
202
222
  tui/screens/ui_view.py,sha256=1QJCgLh2YfgWIpvzRG1KOGXYEaOYX6ojN61Azjf2oX0,2125
203
- code_context_control-2.46.0.dist-info/METADATA,sha256=cqDwpwwRowe-Ieeg5s2Ql2900KcOpdzNkv2Wg9pQrd0,23785
204
- code_context_control-2.46.0.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
205
- code_context_control-2.46.0.dist-info/entry_points.txt,sha256=7kX_WUsDCF2hbXzvbNyscyaBb9AeA-DJY5v_5hN0DlU,93
206
- code_context_control-2.46.0.dist-info/top_level.txt,sha256=wRt41zBybVF3qAiNXHz9BURbkKvUvfhmWWtKMhaw6eE,29
207
- code_context_control-2.46.0.dist-info/RECORD,,
223
+ code_context_control-2.49.0.dist-info/METADATA,sha256=NMoj1GVXc44yI2rE0rCLnwFu4NLtuZwM6XONZTQnWTM,23785
224
+ code_context_control-2.49.0.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
225
+ code_context_control-2.49.0.dist-info/entry_points.txt,sha256=7kX_WUsDCF2hbXzvbNyscyaBb9AeA-DJY5v_5hN0DlU,93
226
+ code_context_control-2.49.0.dist-info/top_level.txt,sha256=wRt41zBybVF3qAiNXHz9BURbkKvUvfhmWWtKMhaw6eE,29
227
+ code_context_control-2.49.0.dist-info/RECORD,,
oracle/config.py CHANGED
@@ -18,10 +18,18 @@ DEFAULTS = {
18
18
  "mcp_port": 3332, # discovery MCP transport port (loopback)
19
19
  "ollama_base_url": "https://ollama.com",
20
20
  "ollama_api_key": "",
21
+ "llm_cache_ttl_sec": 86400, # disk cache TTL for generate() responses
21
22
  "model": "gemma4:31b-cloud",
22
23
  "hub_url": "http://localhost:3330",
24
+ "scanner_ttl_seconds": 20,
23
25
  "review_interval_seconds": 1800,
24
26
  "review_enabled": True,
27
+ # ── Scheduled activity digest (runs inside the review loop) ──
28
+ "digest_enabled": False, # off = current behavior (on-demand only)
29
+ "digest_interval_seconds": 86400, # daily cadence once enabled
30
+ "digest_narrate": False, # LLM prose costs a cloud call; opt-in
31
+ "digest_notify_file": "", # "" = disabled; else JSONL sink path
32
+ "digest_retention_days": 14, # prune stored digests
25
33
  "auto_open_browser": True,
26
34
  "theme": "dark",
27
35
  "max_facts_per_analysis": 100,
@@ -39,6 +47,7 @@ DEFAULTS = {
39
47
  "description": "Expert in system architecture, design patterns, and cross-project structure. Best for high-level analysis.",
40
48
  "system_prompt": "You are the Architect. Focus on structural integrity, design patterns, and the big picture. Provide high-level recommendations before diving into code.",
41
49
  "model": "gemma4:31b-cloud",
50
+ "backend": "ollama",
42
51
  "active": True
43
52
  },
44
53
  {
@@ -47,6 +56,7 @@ DEFAULTS = {
47
56
  "description": "Specializes in deep code analysis, bug hunting, and tracing execution paths.",
48
57
  "system_prompt": "You are the Code Explorer. Be incredibly precise, cite specific lines of code, and focus on the technical implementation details. Trace logic thoroughly.",
49
58
  "model": "gemma4:31b-cloud",
59
+ "backend": "ollama",
50
60
  "active": True
51
61
  },
52
62
  {
@@ -55,6 +65,7 @@ DEFAULTS = {
55
65
  "description": "Focuses on analyzing project memory, facts, and insights.",
56
66
  "system_prompt": "You are the Memory Analyst. Rely heavily on memory tools and facts to spot trends. Connect current issues to past context.",
57
67
  "model": "gemma4:31b-cloud",
68
+ "backend": "ollama",
58
69
  "active": True
59
70
  }
60
71
  ],
oracle/oracle.html CHANGED
@@ -991,6 +991,7 @@
991
991
  <button class="btn btn-primary btn-sm" id="btnLoadActivity" onclick="loadActivity()">Refresh</button>
992
992
  </div>
993
993
  </div>
994
+ <div id="actScheduled" style="display:none;font-size:11px;color:var(--text2);margin-bottom:10px"></div>
994
995
  <div id="actSummary" style="display:flex;gap:10px;flex-wrap:wrap;margin-bottom:14px"></div>
995
996
  <div id="actNarrative" class="card" style="display:none;margin-bottom:14px"></div>
996
997
  <div id="actProjects"></div>
@@ -1104,6 +1105,16 @@
1104
1105
  <label>Review Interval (minutes)</label>
1105
1106
  <input id="cfgInterval" type="number" min="1" value="30">
1106
1107
  </div>
1108
+ <div class="field">
1109
+ <label style="display:flex;align-items:center;gap:8px">
1110
+ <input type="checkbox" id="cfgDigestEnabled" style="width:auto"> Scheduled activity digest
1111
+ </label>
1112
+ <p style="font-size:11px;color:var(--text2);margin-top:4px">Emit a cross-project digest from the review loop (Activity tab shows the latest).</p>
1113
+ </div>
1114
+ <div class="field">
1115
+ <label>Digest Interval (hours)</label>
1116
+ <input id="cfgDigestInterval" type="number" min="1" value="24">
1117
+ </div>
1107
1118
  <div style="display:flex;gap:8px;margin-top:16px">
1108
1119
  <button class="btn btn-primary" onclick="saveSettings()">Save</button>
1109
1120
  <button class="btn btn-ghost" onclick="testConnection()">Test Connection</button>
@@ -1172,6 +1183,17 @@
1172
1183
  <label>Model</label>
1173
1184
  <input id="agentModel" type="text" placeholder="e.g. gemma4:31b-cloud">
1174
1185
  </div>
1186
+ <div class="field">
1187
+ <label>Backend</label>
1188
+ <select id="agentBackend" style="width:100%;padding:8px;font-size:12px;background:var(--bg3);border:1px solid var(--border);border-radius:6px;color:var(--text)">
1189
+ <option value="ollama">Ollama (chat tool loop)</option>
1190
+ <option value="codex">Codex CLI (read-only, needs project)</option>
1191
+ <option value="gemini">Gemini CLI (read-only, needs project)</option>
1192
+ <option value="claude">Claude CLI (read-only, needs project)</option>
1193
+ <option value="auto">Auto cascade (read-only, needs project)</option>
1194
+ </select>
1195
+ <p style="font-size:11px;color:var(--text2);margin-top:4px">CLI backends run c3_delegate inside a registered project; the model field applies to Ollama only.</p>
1196
+ </div>
1175
1197
  <div class="field" style="display:flex;align-items:center;gap:8px">
1176
1198
  <input id="agentActive" type="checkbox" style="width:auto">
1177
1199
  <label style="margin:0;cursor:pointer" for="agentActive">Active</label>
@@ -1927,7 +1949,23 @@ async function dismissInsight(id) {
1927
1949
  // ═══════════════════════════════════════════════════════════
1928
1950
  // ── Activity Digest ──
1929
1951
  // ═══════════════════════════════════════════════════════════
1952
+ async function loadScheduledDigestBanner() {
1953
+ const el = document.getElementById('actScheduled');
1954
+ if (!el) return;
1955
+ try {
1956
+ const latest = await api('/api/activity/digest/latest');
1957
+ if (latest && latest.generated_at) {
1958
+ el.style.display = '';
1959
+ el.textContent = 'Last scheduled digest: ' +
1960
+ latest.generated_at.replace('T', ' ').slice(0, 19) + ' UTC';
1961
+ } else {
1962
+ el.style.display = 'none';
1963
+ }
1964
+ } catch { el.style.display = 'none'; }
1965
+ }
1966
+
1930
1967
  async function loadActivity() {
1968
+ loadScheduledDigestBanner();
1931
1969
  const dateEl = document.getElementById('actDate');
1932
1970
  if (dateEl && !dateEl.value) dateEl.value = new Date().toISOString().slice(0, 10);
1933
1971
  const date = dateEl ? dateEl.value : '';
@@ -2076,6 +2114,8 @@ async function loadSettings() {
2076
2114
  keyCheck.parentElement.style.display = hasKey ? '' : 'none';
2077
2115
  document.getElementById('cfgHubUrl').value = cfg.hub_url || '';
2078
2116
  document.getElementById('cfgInterval').value = Math.round((cfg.review_interval_seconds || 1800) / 60);
2117
+ document.getElementById('cfgDigestEnabled').checked = !!cfg.digest_enabled;
2118
+ document.getElementById('cfgDigestInterval').value = Math.round((cfg.digest_interval_seconds || 86400) / 3600);
2079
2119
  applyTheme(cfg.theme || 'dark');
2080
2120
  // Hub link
2081
2121
  const hubUrl = cfg.hub_url || 'http://localhost:3330';
@@ -2122,6 +2162,8 @@ async function saveSettings() {
2122
2162
  ollama_base_url: document.getElementById('cfgOllamaUrl').value,
2123
2163
  hub_url: document.getElementById('cfgHubUrl').value,
2124
2164
  review_interval_seconds: parseInt(document.getElementById('cfgInterval').value) * 60,
2165
+ digest_enabled: document.getElementById('cfgDigestEnabled').checked,
2166
+ digest_interval_seconds: parseInt(document.getElementById('cfgDigestInterval').value) * 3600,
2125
2167
  agents: window.oracleAgents
2126
2168
  };
2127
2169
  if (apiKeyVal) cfg.ollama_api_key = apiKeyVal;
@@ -4040,7 +4082,7 @@ function renderAgents() {
4040
4082
  <div style="flex:1;min-width:0;margin-right:16px">
4041
4083
  <div style="font-weight:600;font-size:14px;margin-bottom:4px;display:flex;align-items:center;gap:8px">
4042
4084
  ${esc(a.name)}
4043
- <span style="font-size:10px;font-family:monospace;background:var(--bg3);padding:2px 6px;border-radius:4px;color:var(--text2)">${esc(a.model)}</span>
4085
+ <span style="font-size:10px;font-family:monospace;background:var(--bg3);padding:2px 6px;border-radius:4px;color:var(--text2)">${esc(a.backend && a.backend !== 'ollama' ? a.backend : a.model)}</span>
4044
4086
  </div>
4045
4087
  <div style="font-size:12px;color:var(--text2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis" title="${esc(a.description)}">${esc(a.description)}</div>
4046
4088
  </div>
@@ -4071,6 +4113,7 @@ function openAgentModal(id = null) {
4071
4113
  descInput.value = a.description || '';
4072
4114
  promptInput.value = a.system_prompt || '';
4073
4115
  modelInput.value = a.model || '';
4116
+ document.getElementById('agentBackend').value = a.backend || 'ollama';
4074
4117
  activeInput.checked = a.active !== false;
4075
4118
  } else {
4076
4119
  title.textContent = 'Add Custom Agent';
@@ -4079,6 +4122,7 @@ function openAgentModal(id = null) {
4079
4122
  descInput.value = '';
4080
4123
  promptInput.value = '';
4081
4124
  modelInput.value = window.oracleConfig.model || 'gemma4:31b-cloud';
4125
+ document.getElementById('agentBackend').value = 'ollama';
4082
4126
  activeInput.checked = true;
4083
4127
  }
4084
4128
 
@@ -4100,6 +4144,7 @@ function saveAgent() {
4100
4144
  description: document.getElementById('agentDesc').value.trim(),
4101
4145
  system_prompt: document.getElementById('agentPrompt').value.trim(),
4102
4146
  model: document.getElementById('agentModel').value.trim(),
4147
+ backend: document.getElementById('agentBackend').value,
4103
4148
  active: document.getElementById('agentActive').checked
4104
4149
  };
4105
4150