codelith 0.1.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.
- backend/__init__.py +1 -0
- backend/agents/__init__.py +6 -0
- backend/agents/assessment_agent.py +273 -0
- backend/agents/coding_agent.py +779 -0
- backend/agents/concept_categories.py +131 -0
- backend/agents/concept_detector.py +1217 -0
- backend/agents/debug_agent.py +166 -0
- backend/agents/teacher_agent.py +179 -0
- backend/cli/__init__.py +1 -0
- backend/cli/config_cmd.py +135 -0
- backend/cli/main.py +606 -0
- backend/daemon/__init__.py +1 -0
- backend/daemon/launcher.py +243 -0
- backend/daemon/server.py +453 -0
- backend/daemon/state.py +110 -0
- backend/daemon/static/assets/Gambarino-Regular-BjbcsURA.otf +0 -0
- backend/daemon/static/assets/abnfDiagram-VCTEODGH-CCJBE2aE.js +1 -0
- backend/daemon/static/assets/arc-BEvzHx4o.js +1 -0
- backend/daemon/static/assets/architecture-7GRP2DOG-DaWrPggL.js +1 -0
- backend/daemon/static/assets/architectureDiagram-5GKGNRK7-pR-klcZv.js +36 -0
- backend/daemon/static/assets/array-BifhSqXX.js +1 -0
- backend/daemon/static/assets/blockDiagram-I7D4REHJ-C504Gj6_.js +129 -0
- backend/daemon/static/assets/c4Diagram-7LVT6UL2-BjM04Mni.js +38 -0
- backend/daemon/static/assets/channel-DzSauwD3.js +1 -0
- backend/daemon/static/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
- backend/daemon/static/assets/chunk-4HAMMTFA-EgoP78tp.js +62 -0
- backend/daemon/static/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
- backend/daemon/static/assets/chunk-75Z2AOVW-EXNbuzun.js +2 -0
- backend/daemon/static/assets/chunk-DU6HZSFF-CF3OK3MZ.js +127 -0
- backend/daemon/static/assets/chunk-F27PBJKO-G71ylWJa.js +1 -0
- backend/daemon/static/assets/chunk-FOHPRMQF-DHwB1DNv.js +161 -0
- backend/daemon/static/assets/chunk-GMAD6QVW-2yfGg28o.js +72 -0
- backend/daemon/static/assets/chunk-GVQU2GXP-C_VeaX4U.js +1 -0
- backend/daemon/static/assets/chunk-IMKFNOWR-CNexRjjn.js +231 -0
- backend/daemon/static/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
- backend/daemon/static/assets/chunk-P2QGCYS3-E4AByfsD.js +1 -0
- backend/daemon/static/assets/chunk-POPQ4Y6H-Bisbc2-3.js +1 -0
- backend/daemon/static/assets/chunk-PWAF6VOD-DaoPxZAa.js +1 -0
- backend/daemon/static/assets/chunk-SHT3W25Y-DarPToto.js +168 -0
- backend/daemon/static/assets/chunk-SVP7TREG-DvMOAiwI.js +88 -0
- backend/daemon/static/assets/chunk-TICWLB2K-DheuvyGM.js +206 -0
- backend/daemon/static/assets/chunk-XXDRQBXY-DFBUG-OT.js +1 -0
- backend/daemon/static/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
- backend/daemon/static/assets/classDiagram-ZZMXUADV-Ys5zkCXW.js +1 -0
- backend/daemon/static/assets/classDiagram-v2-VYDZK3BY-Ys5zkCXW.js +1 -0
- backend/daemon/static/assets/cose-bilkent-JH36ORCC-DLPLnxrP.js +1 -0
- backend/daemon/static/assets/cynefin-OW5HDTMX-Dv1OY_0y.js +1 -0
- backend/daemon/static/assets/cynefinDiagram-5FMLGOSQ-Ur7MTCmF.js +62 -0
- backend/daemon/static/assets/cytoscape.esm-CECbKnxF.js +321 -0
- backend/daemon/static/assets/dagre-CJLTJMFW.js +1 -0
- backend/daemon/static/assets/dagre-GXQ25YYZ-R3BwTvng.js +4 -0
- backend/daemon/static/assets/defaultLocale-BFoDCU3G.js +1 -0
- backend/daemon/static/assets/diagram-S7CK7UJ4-BxIoEKb4.js +30 -0
- backend/daemon/static/assets/diagram-UQ7AKVKN-DO4cuWN-.js +41 -0
- backend/daemon/static/assets/diagram-VSXAHHWV-DW5imp5t.js +3 -0
- backend/daemon/static/assets/diagram-VX7I27RA-CdZ3k7wQ.js +24 -0
- backend/daemon/static/assets/diagram-Z3DM3KII-DPyjbneL.js +24 -0
- backend/daemon/static/assets/dist-DTg6UBE_.js +1 -0
- backend/daemon/static/assets/ebnfDiagram-PWID7BFC-BO7VQsye.js +1 -0
- backend/daemon/static/assets/erDiagram-RLTQ6QDP-CevvjECq.js +99 -0
- backend/daemon/static/assets/eventmodeling-NTZA5JFV-yNfKR6-v.js +1 -0
- backend/daemon/static/assets/flowDiagram-HODETNUW-B4GT41mU.js +1 -0
- backend/daemon/static/assets/ganttDiagram-EL5Y4UJY-DNW5fWw1.js +292 -0
- backend/daemon/static/assets/gitGraph-4MIJSDKK-DKgVkWaZ.js +1 -0
- backend/daemon/static/assets/gitGraphDiagram-WWUBYQGX-0S7OF9Aj.js +106 -0
- backend/daemon/static/assets/index-D3vj8REa.js +63 -0
- backend/daemon/static/assets/index-D4lMFaiv.css +1 -0
- backend/daemon/static/assets/info-A6RAGUB7-Bxy-SzRN.js +1 -0
- backend/daemon/static/assets/infoDiagram-27XIBGKW-ClzQji6X.js +2 -0
- backend/daemon/static/assets/init-C-OQMol4.js +1 -0
- backend/daemon/static/assets/ishikawaDiagram-5VMMS53U-B3Lo-sS3.js +70 -0
- backend/daemon/static/assets/journeyDiagram-3NMN7TZE-0KL6R2Rz.js +139 -0
- backend/daemon/static/assets/kanban-definition-UXKFOSKX-zt5NbEep.js +89 -0
- backend/daemon/static/assets/katex-CXMH3UgJ.js +257 -0
- backend/daemon/static/assets/line-CiAFRJVJ.js +1 -0
- backend/daemon/static/assets/linear-BI6yqEPV.js +1 -0
- backend/daemon/static/assets/logo_darkmode-BPDdj6GZ.png +0 -0
- backend/daemon/static/assets/logo_lightmode-C3ZWMgAH.png +0 -0
- backend/daemon/static/assets/mermaid-parser.core-DEadI1Ja.js +7 -0
- backend/daemon/static/assets/mindmap-definition-YA3MSWOX-TGKGYg5n.js +96 -0
- backend/daemon/static/assets/ordinal-BDEzSJ7C.js +1 -0
- backend/daemon/static/assets/packet-AYTQ26CC-CZTSuh5x.js +1 -0
- backend/daemon/static/assets/path-fybaL0A-.js +1 -0
- backend/daemon/static/assets/pegDiagram-XKGWAZYB-DGd8LACA.js +1 -0
- backend/daemon/static/assets/pie-WAS4IAKB-B59sPr3Z.js +1 -0
- backend/daemon/static/assets/pieDiagram-E7YTZNPT-CpwxCR3L.js +39 -0
- backend/daemon/static/assets/quadrantDiagram-AXDQQJYC-BwSeF_E_.js +7 -0
- backend/daemon/static/assets/radar-RG4KPBEZ-DAa4JvTb.js +1 -0
- backend/daemon/static/assets/railroad-74A4TZTK-BitdNgDt.js +1 -0
- backend/daemon/static/assets/railroad-abnf-HS5TGJTU-DCrNKqAH.js +1 -0
- backend/daemon/static/assets/railroad-ebnf-LZEXJU2U-DmEwx8OK.js +1 -0
- backend/daemon/static/assets/railroad-peg-WCYAUIDC-CPc8dTCP.js +1 -0
- backend/daemon/static/assets/railroadDiagram-O6MQD6OU-DuizuzwD.js +1 -0
- backend/daemon/static/assets/requirementDiagram-BXWQKSXE-BjMk0yS8.js +84 -0
- backend/daemon/static/assets/rough.esm-Dy-Kn_BL.js +1 -0
- backend/daemon/static/assets/sankeyDiagram-P5KCCOFB-0T_bhkmz.js +40 -0
- backend/daemon/static/assets/sequenceDiagram-WJ2MYXX4-Cwa-1Stp.js +162 -0
- backend/daemon/static/assets/sizeCapture-INFHLROL-B0uUizjq.js +1 -0
- backend/daemon/static/assets/src-BH-TyZbA.js +1 -0
- backend/daemon/static/assets/stateDiagram-D77RDMKH-BpQSg_QL.js +1 -0
- backend/daemon/static/assets/stateDiagram-v2-MP3YSRHH-BItVXKof.js +1 -0
- backend/daemon/static/assets/swimlanes-42K2YHIH-h_ED18Vy.js +1 -0
- backend/daemon/static/assets/swimlanesDiagram-VR7AAH4N-D0fo0LN-.js +8 -0
- backend/daemon/static/assets/timeline-definition-24CTP7MA-DKfSO33a.js +120 -0
- backend/daemon/static/assets/treeView-Q6P3EWNA-DAj9fxfC.js +1 -0
- backend/daemon/static/assets/treemap-WGGIJYW6-5IIXD9Zu.js +1 -0
- backend/daemon/static/assets/vennDiagram-4TSXK5OY-BoBvVEci.js +34 -0
- backend/daemon/static/assets/wardley-WFR3VGLG-CGsd7s_-.js +1 -0
- backend/daemon/static/assets/wardleyDiagram-VM6X3IG4-QHdK5NsY.js +78 -0
- backend/daemon/static/assets/xychartDiagram-S5SC5T6Z-MN_fdKCJ.js +7 -0
- backend/daemon/static/index.html +49 -0
- backend/database/__init__.py +1 -0
- backend/database/concept_slug.py +39 -0
- backend/database/concepts.py +804 -0
- backend/llm/__init__.py +5 -0
- backend/llm/client.py +333 -0
- backend/llm/config.py +254 -0
- backend/llm/key_setup.py +237 -0
- backend/main.py +13 -0
- backend/orchestrator/__init__.py +1 -0
- backend/orchestrator/events.py +52 -0
- backend/orchestrator/graph.py +316 -0
- backend/orchestrator/modes.py +125 -0
- codelith-0.1.0.dist-info/METADATA +301 -0
- codelith-0.1.0.dist-info/RECORD +129 -0
- codelith-0.1.0.dist-info/WHEEL +5 -0
- codelith-0.1.0.dist-info/entry_points.txt +2 -0
- codelith-0.1.0.dist-info/licenses/LICENSE +21 -0
- codelith-0.1.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"""Category taxonomy for detected concepts.
|
|
2
|
+
|
|
3
|
+
Every concept detected — registry or LLM — must carry one of six fixed
|
|
4
|
+
categories so the dashboard can group, filter, and route diagrams
|
|
5
|
+
by category:
|
|
6
|
+
|
|
7
|
+
- ``algorithm`` — loops, sorting, searching, recursion, big-O reasoning
|
|
8
|
+
- ``structure`` — classes, interfaces, inheritance, encapsulation, OOP
|
|
9
|
+
- ``api`` — calls into a defined interface: fetch, DOM, SDKs, hooks
|
|
10
|
+
- ``data_model`` — how data is shaped/moved: schemas, interfaces, JSON
|
|
11
|
+
payloads, ORMs, validation
|
|
12
|
+
- ``decisions`` — architecture and integration choices made in THIS
|
|
13
|
+
codebase: which service/library/tool was picked for a job (Supabase
|
|
14
|
+
for auth, Stripe for billing), and how features are wired together
|
|
15
|
+
(who owns what, which module reaches which). Named ``decisions``,
|
|
16
|
+
it is distinct from the singular ``decision`` field on a concept,
|
|
17
|
+
which records the rationale on ANY category.
|
|
18
|
+
- ``abstract`` — cross-cutting ideas that aren't one of the above:
|
|
19
|
+
error handling, module systems, async, design patterns
|
|
20
|
+
|
|
21
|
+
``DEFAULT_CATEGORY`` exists only for the legacy "General" alias mapping;
|
|
22
|
+
detections are never silently default-filled — the guard in
|
|
23
|
+
``concept_detector`` retries once and then rejects concepts whose
|
|
24
|
+
category cannot be reconciled with this taxonomy.
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
from __future__ import annotations
|
|
28
|
+
|
|
29
|
+
CONCEPT_CATEGORIES: tuple[str, ...] = (
|
|
30
|
+
"algorithm",
|
|
31
|
+
"structure",
|
|
32
|
+
"api",
|
|
33
|
+
"data_model",
|
|
34
|
+
"decisions",
|
|
35
|
+
"abstract",
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
DEFAULT_CATEGORY = "abstract"
|
|
39
|
+
|
|
40
|
+
# Free-text category labels that clearly mean one of the taxonomy values.
|
|
41
|
+
# Used by the guard's tolerant normalization before declaring a response
|
|
42
|
+
# invalid and retrying.
|
|
43
|
+
_CATEGORY_ALIASES: dict[str, str] = {
|
|
44
|
+
"algorithms": "algorithm",
|
|
45
|
+
"loop": "algorithm",
|
|
46
|
+
"loops": "algorithm",
|
|
47
|
+
"control flow": "algorithm",
|
|
48
|
+
"control-flow": "algorithm",
|
|
49
|
+
"functional programming": "algorithm",
|
|
50
|
+
"recursion": "algorithm",
|
|
51
|
+
"oop": "structure",
|
|
52
|
+
"object-oriented programming": "structure",
|
|
53
|
+
"python oop": "structure",
|
|
54
|
+
"typescript": "structure",
|
|
55
|
+
"class": "structure",
|
|
56
|
+
"classes": "structure",
|
|
57
|
+
"interface": "structure",
|
|
58
|
+
"interfaces": "structure",
|
|
59
|
+
"api": "api",
|
|
60
|
+
"apis": "api",
|
|
61
|
+
"networking": "api",
|
|
62
|
+
"dom / browser api": "api",
|
|
63
|
+
"dom/browser api": "api",
|
|
64
|
+
"browser api": "api",
|
|
65
|
+
"react hook": "api",
|
|
66
|
+
"react hooks": "api",
|
|
67
|
+
"sdk": "api",
|
|
68
|
+
"data model": "data_model",
|
|
69
|
+
"data_model": "data_model",
|
|
70
|
+
"data modeling": "data_model",
|
|
71
|
+
"schema": "data_model",
|
|
72
|
+
"schema/shape": "data_model",
|
|
73
|
+
"data shape": "data_model",
|
|
74
|
+
"type system": "data_model",
|
|
75
|
+
"types": "data_model",
|
|
76
|
+
"type": "data_model",
|
|
77
|
+
"decision": "decisions",
|
|
78
|
+
"decisions": "decisions",
|
|
79
|
+
"design decision": "decisions",
|
|
80
|
+
"design decisions": "decisions",
|
|
81
|
+
"architecture": "decisions",
|
|
82
|
+
"architectural decision": "decisions",
|
|
83
|
+
"architectural decisions": "decisions",
|
|
84
|
+
"system design": "decisions",
|
|
85
|
+
"tech stack": "decisions",
|
|
86
|
+
"technology choice": "decisions",
|
|
87
|
+
"tool choice": "decisions",
|
|
88
|
+
"tooling": "decisions",
|
|
89
|
+
"integration": "decisions",
|
|
90
|
+
"integrations": "decisions",
|
|
91
|
+
"third-party integration": "decisions",
|
|
92
|
+
"third party service": "decisions",
|
|
93
|
+
"infrastructure": "decisions",
|
|
94
|
+
"wiring": "decisions",
|
|
95
|
+
"abstract": "abstract",
|
|
96
|
+
"abstraction": "abstract",
|
|
97
|
+
"general": DEFAULT_CATEGORY,
|
|
98
|
+
"other": DEFAULT_CATEGORY,
|
|
99
|
+
"misc": DEFAULT_CATEGORY,
|
|
100
|
+
"pattern": "abstract",
|
|
101
|
+
"patterns": "abstract",
|
|
102
|
+
"python pattern": "abstract",
|
|
103
|
+
"asynchronous pattern": "abstract",
|
|
104
|
+
"async": "abstract",
|
|
105
|
+
"error handling": "abstract",
|
|
106
|
+
"module system": "abstract",
|
|
107
|
+
"modules": "abstract",
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def normalize_category(value: object) -> str | None:
|
|
112
|
+
"""Map a raw LLM/registry category string onto the taxonomy.
|
|
113
|
+
|
|
114
|
+
Returns the canonical taxonomy slug, or ``None`` when the value is
|
|
115
|
+
missing/empty — callers decide whether to retry or reject (never
|
|
116
|
+
silently default-fill).
|
|
117
|
+
"""
|
|
118
|
+
if not isinstance(value, str):
|
|
119
|
+
return None
|
|
120
|
+
key = " ".join(value.strip().lower().replace("-", "_").split())
|
|
121
|
+
if not key:
|
|
122
|
+
return None
|
|
123
|
+
key = key.replace("__", "_")
|
|
124
|
+
if key in CONCEPT_CATEGORIES:
|
|
125
|
+
return key
|
|
126
|
+
return _CATEGORY_ALIASES.get(key)
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def is_valid_category(value: object) -> bool:
|
|
130
|
+
"""True when *value* is exactly a canonical taxonomy slug."""
|
|
131
|
+
return value in CONCEPT_CATEGORIES
|