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.
- cli/c3.py +11 -3
- cli/commands/parser.py +10 -1
- cli/tools/compress.py +1 -2
- cli/tools/federate.py +0 -1
- cli/tools/filter.py +1 -2
- cli/tools/read.py +1 -2
- cli/tools/search.py +1 -2
- {code_context_control-2.46.0.dist-info → code_context_control-2.49.0.dist-info}/METADATA +1 -1
- {code_context_control-2.46.0.dist-info → code_context_control-2.49.0.dist-info}/RECORD +48 -28
- oracle/config.py +11 -0
- oracle/oracle.html +46 -1
- oracle/oracle_server.py +132 -18
- oracle/oracle_ui.html +1215 -0
- oracle/services/c3_bridge.py +194 -59
- oracle/services/chat_engine.py +453 -141
- oracle/services/federated_graph.py +52 -2
- oracle/services/local_session.py +54 -0
- oracle/services/ollama_bridge.py +87 -7
- oracle/services/project_scanner.py +60 -6
- oracle/services/review_agent.py +84 -1
- oracle/services/tool_registry.py +82 -3
- oracle/ui/activity.js +101 -0
- oracle/ui/agents.js +108 -0
- oracle/ui/app.js +9 -0
- oracle/ui/busy.js +102 -0
- oracle/ui/chat/conversations.js +153 -0
- oracle/ui/chat/input.js +284 -0
- oracle/ui/chat/markdown.js +33 -0
- oracle/ui/chat/send.js +281 -0
- oracle/ui/chat/stream_renderer.js +767 -0
- oracle/ui/chat/toolbar.js +270 -0
- oracle/ui/core.js +60 -0
- oracle/ui/crossgraph.js +184 -0
- oracle/ui/header.js +69 -0
- oracle/ui/insights.js +52 -0
- oracle/ui/projects.js +245 -0
- oracle/ui/settings.js +186 -0
- oracle/ui/suggestions.js +47 -0
- oracle/ui/theme_tabs.js +52 -0
- services/artifact_store.py +1 -1
- services/project_runtime.py +16 -3
- services/runtime.py +1 -1
- services/subprojects.py +7 -4
- services/task_store.py +1 -1
- {code_context_control-2.46.0.dist-info → code_context_control-2.49.0.dist-info}/WHEEL +0 -0
- {code_context_control-2.46.0.dist-info → code_context_control-2.49.0.dist-info}/entry_points.txt +0 -0
- {code_context_control-2.46.0.dist-info → code_context_control-2.49.0.dist-info}/licenses/LICENSE +0 -0
- {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.
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
69
|
-
cli/tools/filter.py,sha256=
|
|
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=
|
|
74
|
-
cli/tools/search.py,sha256=
|
|
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.
|
|
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=
|
|
103
|
+
oracle/config.py,sha256=XEYMH0InBJxhls4b0vD7gvBqMUdxVVHrTHTLz-rZVZg,3838
|
|
104
104
|
oracle/mcp_oracle.py,sha256=B5B-qSxi37outsuRHn1Ns6Gj8e7W593rmL34LMzuE8M,8980
|
|
105
|
-
oracle/oracle.html,sha256=
|
|
106
|
-
oracle/oracle_server.py,sha256=
|
|
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=
|
|
111
|
-
oracle/services/chat_engine.py,sha256=
|
|
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=
|
|
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=
|
|
120
|
-
oracle/services/project_scanner.py,sha256=
|
|
121
|
-
oracle/services/review_agent.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
172
|
-
services/task_store.py,sha256=
|
|
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.
|
|
204
|
-
code_context_control-2.
|
|
205
|
-
code_context_control-2.
|
|
206
|
-
code_context_control-2.
|
|
207
|
-
code_context_control-2.
|
|
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
|
|