jac-coder 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.
Files changed (85) hide show
  1. jac_coder/__init__.jac +0 -0
  2. jac_coder/api.jac +82 -0
  3. jac_coder/cli_entry.py +25 -0
  4. jac_coder/config.jac +36 -0
  5. jac_coder/context.jac +17 -0
  6. jac_coder/data/examples/ai_agent.md +90 -0
  7. jac_coder/data/examples/blog_app.md +386 -0
  8. jac_coder/data/examples/core_patterns.md +321 -0
  9. jac_coder/data/examples/todo_app.md +321 -0
  10. jac_coder/data/reference/ai.md +131 -0
  11. jac_coder/data/reference/backend.md +215 -0
  12. jac_coder/data/reference/frontend.md +271 -0
  13. jac_coder/data/reference/osp.md +229 -0
  14. jac_coder/data/reference/pitfalls.md +141 -0
  15. jac_coder/data/reference/syntax.md +159 -0
  16. jac_coder/data/rules/core_jac.md +559 -0
  17. jac_coder/data/rules/fullstack.md +362 -0
  18. jac_coder/data/rules/workflow.md +88 -0
  19. jac_coder/events.jac +110 -0
  20. jac_coder/impl/api.impl.jac +399 -0
  21. jac_coder/impl/config.impl.jac +163 -0
  22. jac_coder/impl/context.impl.jac +117 -0
  23. jac_coder/impl/mcp_manager.impl.jac +380 -0
  24. jac_coder/impl/memory.impl.jac +247 -0
  25. jac_coder/impl/nodes.impl.jac +259 -0
  26. jac_coder/impl/permission.impl.jac +62 -0
  27. jac_coder/impl/walkers.impl.jac +298 -0
  28. jac_coder/mcp_manager.jac +35 -0
  29. jac_coder/memory.jac +15 -0
  30. jac_coder/nodes.jac +306 -0
  31. jac_coder/permission.jac +19 -0
  32. jac_coder/serve_entry.jac +30 -0
  33. jac_coder/server.jac +324 -0
  34. jac_coder/tool/__init__.jac +17 -0
  35. jac_coder/tool/checked.jac +10 -0
  36. jac_coder/tool/delegation.jac +23 -0
  37. jac_coder/tool/filesystem.jac +25 -0
  38. jac_coder/tool/git.jac +18 -0
  39. jac_coder/tool/guarded.jac +23 -0
  40. jac_coder/tool/impl/checked.impl.jac +38 -0
  41. jac_coder/tool/impl/delegation.impl.jac +157 -0
  42. jac_coder/tool/impl/filesystem.impl.jac +781 -0
  43. jac_coder/tool/impl/git.impl.jac +115 -0
  44. jac_coder/tool/impl/guarded.impl.jac +72 -0
  45. jac_coder/tool/impl/jac_analyzer.impl.jac +593 -0
  46. jac_coder/tool/impl/jac_docs.impl.jac +136 -0
  47. jac_coder/tool/impl/jac_tools.impl.jac +79 -0
  48. jac_coder/tool/impl/mcp.impl.jac +32 -0
  49. jac_coder/tool/impl/preview.impl.jac +233 -0
  50. jac_coder/tool/impl/question.impl.jac +29 -0
  51. jac_coder/tool/impl/scaffold.impl.jac +231 -0
  52. jac_coder/tool/impl/search.impl.jac +85 -0
  53. jac_coder/tool/impl/shell.impl.jac +89 -0
  54. jac_coder/tool/impl/task.impl.jac +12 -0
  55. jac_coder/tool/impl/think.impl.jac +4 -0
  56. jac_coder/tool/impl/todo.impl.jac +58 -0
  57. jac_coder/tool/impl/validate.impl.jac +236 -0
  58. jac_coder/tool/impl/web.impl.jac +91 -0
  59. jac_coder/tool/jac_analyzer.jac +21 -0
  60. jac_coder/tool/jac_docs.jac +9 -0
  61. jac_coder/tool/jac_tools.jac +11 -0
  62. jac_coder/tool/mcp.jac +17 -0
  63. jac_coder/tool/preview.jac +31 -0
  64. jac_coder/tool/question.jac +7 -0
  65. jac_coder/tool/scaffold.jac +10 -0
  66. jac_coder/tool/search.jac +14 -0
  67. jac_coder/tool/shell.jac +12 -0
  68. jac_coder/tool/task.jac +9 -0
  69. jac_coder/tool/think.jac +5 -0
  70. jac_coder/tool/todo.jac +12 -0
  71. jac_coder/tool/validate.jac +11 -0
  72. jac_coder/tool/vision.jac +17 -0
  73. jac_coder/tool/web.jac +10 -0
  74. jac_coder/util/__init__.jac +18 -0
  75. jac_coder/util/colors.jac +20 -0
  76. jac_coder/util/impl/sandbox.impl.jac +38 -0
  77. jac_coder/util/impl/tool_output.impl.jac +208 -0
  78. jac_coder/util/sandbox.jac +8 -0
  79. jac_coder/util/tool_output.jac +29 -0
  80. jac_coder/walkers.jac +67 -0
  81. jac_coder-0.1.0.dist-info/METADATA +9 -0
  82. jac_coder-0.1.0.dist-info/RECORD +85 -0
  83. jac_coder-0.1.0.dist-info/WHEEL +5 -0
  84. jac_coder-0.1.0.dist-info/entry_points.txt +3 -0
  85. jac_coder-0.1.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,208 @@
1
+ glob TOOL_LABELS: dict = {
2
+ "read": "Read",
3
+ "write": "Write",
4
+ "edit": "Edit",
5
+ "list": "List files",
6
+ "grep": "Search",
7
+ "glob": "Find files",
8
+ "bash": "Run command",
9
+ "web_fetch": "Fetch URL",
10
+ "web_search": "Web search",
11
+ "jac_docs": "Jac docs",
12
+ "jac_check": "Check",
13
+ "jac_run": "Run",
14
+ "scaffold": "Scaffold",
15
+ "spawn_task": "Spawn task",
16
+ "update_todos": "Update plan"
17
+ };
18
+
19
+
20
+ def _auto_close_tool(prev: dict) -> None {
21
+ duration_ms = int((time.time() - prev["start_time"]) * 1000);
22
+ if duration_ms >= 1000 {
23
+ timing = f"{round(duration_ms / 1000, 1)}s";
24
+ } else {
25
+ timing = f"{duration_ms}ms";
26
+ }
27
+ sys.stderr.write(f" {DIM}({timing}){RESET}\n");
28
+ sys.stderr.flush();
29
+ emit_event(
30
+ "tool_end",
31
+ {
32
+ "tool": prev["tool"],
33
+ "step": prev["step"],
34
+ "status": "done",
35
+ "duration_ms": duration_ms,
36
+ "result_preview": "",
37
+ "message": f"{prev['message']} ({timing})"
38
+ }
39
+ );
40
+ set_active_tool({});
41
+ }
42
+
43
+
44
+ impl smart_path(path: str) -> str {
45
+ if not path {
46
+ return path;
47
+ }
48
+ sroot = get_sandbox_root();
49
+ if sroot and path.startswith(sroot) {
50
+ rel = os.path.relpath(path, sroot);
51
+ return rel;
52
+ }
53
+ stripped = re.sub(r'/tmp/jac-preview-[a-f0-9\-]+-prj_\d+/', '', path);
54
+ if stripped != path {
55
+ return stripped;
56
+ }
57
+ parts = path.replace("\\", "/").split("/");
58
+ if len(parts) > 2 {
59
+ return os.path.join(parts[-2], parts[-1]);
60
+ }
61
+ return path;
62
+ }
63
+
64
+
65
+ def _clean_paths(text: str) -> str {
66
+ if not text {
67
+ return text;
68
+ }
69
+ sroot = get_sandbox_root();
70
+ if sroot and sroot in text {
71
+ text = text.replace(sroot + "/", "").replace(sroot, "");
72
+ }
73
+ text = re.sub(r'/tmp/jac-preview-[a-f0-9\-]+-prj_\d+/', '', text);
74
+ text = re.sub(r'/tmp/[^\s]+/([^/\s]+/[^/\s]+)', r'\1', text);
75
+ return text;
76
+ }
77
+
78
+
79
+ impl tool_status(tool_name: str, detail: str = "") -> None {
80
+ prev = get_active_tool();
81
+ if prev {
82
+ _auto_close_tool(prev);
83
+ }
84
+
85
+ step = next_step();
86
+ label = TOOL_LABELS.get(tool_name, tool_name);
87
+ prefix = get_agent_prefix();
88
+ prefix_display = f"{prefix}:" if prefix else "";
89
+ detail_display = _clean_paths(detail) if detail else "";
90
+ detail_short = detail_display[:80] + "..."
91
+ if len(detail_display) > 80
92
+ else detail_display;
93
+
94
+ if detail_short {
95
+ sys.stderr.write(
96
+ f" {DIM}{CYAN}[{prefix_display}{step}] {label}:{RESET}{DIM} {detail_short}{RESET}"
97
+ );
98
+ } else {
99
+ sys.stderr.write(f" {DIM}{CYAN}[{prefix_display}{step}] {label}{RESET}");
100
+ }
101
+ sys.stderr.flush();
102
+
103
+ if detail_short {
104
+ message = f"{label} {detail_short}";
105
+ } else {
106
+ message = label;
107
+ }
108
+
109
+ # Track file modifications for turn summary
110
+ if tool_name in ["write", "edit"] and detail {
111
+ track_file(detail_display);
112
+ }
113
+
114
+ set_active_tool(
115
+ {
116
+ "tool": tool_name,
117
+ "detail": detail_short or tool_name,
118
+ "step": step,
119
+ "message": message,
120
+ "start_time": time.time()
121
+ }
122
+ );
123
+
124
+ emit_event(
125
+ "tool_start",
126
+ {
127
+ "tool": tool_name,
128
+ "detail": detail_short or tool_name,
129
+ "step": step,
130
+ "message": message
131
+ }
132
+ );
133
+ }
134
+
135
+
136
+ impl tool_end(result_preview: str = "", error: bool = False) -> None {
137
+ active = get_active_tool();
138
+ if not active {
139
+ return;
140
+ }
141
+ duration_ms = int((time.time() - active["start_time"]) * 1000);
142
+ status = "error" if error else "done";
143
+ preview = result_preview[:80] + "..."
144
+ if len(result_preview) > 80
145
+ else result_preview;
146
+
147
+ if error {
148
+ track_error();
149
+ }
150
+
151
+ # Format timing
152
+ if duration_ms >= 1000 {
153
+ timing = f"{round(duration_ms / 1000, 1)}s";
154
+ } else {
155
+ timing = f"{duration_ms}ms";
156
+ }
157
+
158
+ if preview {
159
+ sys.stderr.write(f" {DIM}{preview}{RESET} {DIM}({timing}){RESET}\n");
160
+ } else {
161
+ sys.stderr.write(f" {DIM}({timing}){RESET}\n");
162
+ }
163
+ sys.stderr.flush();
164
+
165
+ emit_event(
166
+ "tool_end",
167
+ {
168
+ "tool": active["tool"],
169
+ "step": active["step"],
170
+ "status": status,
171
+ "duration_ms": duration_ms,
172
+ "result_preview": preview,
173
+ "message": f"{active['message']} ({timing})"
174
+ }
175
+ );
176
+ set_active_tool({});
177
+ }
178
+
179
+
180
+ impl truncate_output(
181
+ text: str, max_lines: int = MAX_LINES, max_chars: int = MAX_CHARS
182
+ ) -> tuple {
183
+ lines = text.split("\n");
184
+ truncated = False;
185
+
186
+ if len(lines) > max_lines {
187
+ half = max_lines // 2;
188
+ lines = lines[:half] + [
189
+ "",
190
+ f"... ({len(lines) - max_lines} lines omitted) ...",
191
+ ""
192
+ ] + lines[-half:];
193
+ truncated = True;
194
+ }
195
+
196
+ result = "\n".join(lines);
197
+
198
+ if len(result) > max_chars {
199
+ result = result[:max_chars];
200
+ truncated = True;
201
+ }
202
+
203
+ if truncated {
204
+ result = result + "\n\n(output truncated)";
205
+ }
206
+
207
+ return (result, truncated);
208
+ }
@@ -0,0 +1,8 @@
1
+ import os;
2
+ import threading;
3
+
4
+ glob _tls: object = threading.local();
5
+
6
+ def set_sandbox_root(sroot: str) -> None;
7
+ def get_sandbox_root() -> str;
8
+ def sandbox_path(path: str) -> tuple;
@@ -0,0 +1,29 @@
1
+ import os;
2
+ import re;
3
+ import sys;
4
+ import time;
5
+
6
+ import from jac_coder.util.colors { DIM, CYAN, RESET }
7
+ import from jac_coder.util.sandbox { get_sandbox_root }
8
+ import from jac_coder.events {
9
+ emit_event,
10
+ next_step,
11
+ get_active_tool,
12
+ set_active_tool,
13
+ track_file,
14
+ track_error,
15
+ get_agent_prefix
16
+ }
17
+
18
+ glob MAX_LINES: int = 2000;
19
+ glob MAX_CHARS: int = 50000;
20
+
21
+ def tool_status(tool_name: str, detail: str = "") -> None;
22
+
23
+ def tool_end(result_preview: str = "", error: bool = False) -> None;
24
+
25
+ def smart_path(path: str) -> str;
26
+
27
+ def truncate_output(
28
+ text: str, max_lines: int = MAX_LINES, max_chars: int = MAX_CHARS
29
+ ) -> tuple;
jac_coder/walkers.jac ADDED
@@ -0,0 +1,67 @@
1
+ import from http { HTTPMethod }
2
+ import from datetime { datetime }
3
+ import from jac_coder.util.tool_output { tool_end }
4
+ import from jac_coder.util.sandbox { set_sandbox_root }
5
+ import from jac_coder.config { llm, get_config }
6
+ import from jaclang.runtimelib.builtin { restspec }
7
+ import from jac_coder.context { build_context, ContextConfig }
8
+ import from jac_coder.events { reset_steps, start_turn, emit_turn_summary, emit_event }
9
+ import from byllm.types { StreamEvent }
10
+ import from jac_coder.memory {
11
+ find_or_create_memory,
12
+ _init_memory,
13
+ update_memory_from_session
14
+ }
15
+ import from jac_coder.nodes { Session, MainAgent }
16
+
17
+
18
+ def ensure_main_agent() -> MainAgent;
19
+ def _find_session(session_id: str) -> Session | None;
20
+ def _persist_response(
21
+ session_id: str,
22
+ response: str,
23
+ agent_mode: str,
24
+ tools_used: list[str] = [],
25
+ files_modified: list[str] = []
26
+ ) -> None;
27
+ def _respond_and_persist(agent: MainAgent, ctx: interact) -> None;
28
+ def _consume_llm_stream(event_stream: Any) -> dict;
29
+
30
+
31
+ walker:pub new_session {
32
+ has title: str = "New Session";
33
+ has directory: str = "";
34
+
35
+ can create with Root entry;
36
+ }
37
+
38
+
39
+ @restspec(method=HTTPMethod.GET)
40
+ walker:pub list_sessions {
41
+ can list with Root entry;
42
+ }
43
+
44
+
45
+ walker:pub get_session {
46
+ has session_id: str;
47
+
48
+ can fetch with Root entry;
49
+ }
50
+
51
+ walker:pub close_session {
52
+ has session_id: str;
53
+
54
+ can close with Root entry;
55
+ }
56
+
57
+
58
+ walker:pub interact {
59
+ has message: str;
60
+ has session_id: str;
61
+ has chat_history: list[dict] = [];
62
+ has agent_context: str = "";
63
+
64
+ can init_session with Root entry;
65
+ can enter_session with Session entry;
66
+ can respond with MainAgent entry;
67
+ }
@@ -0,0 +1,9 @@
1
+ Metadata-Version: 2.4
2
+ Name: jac-coder
3
+ Version: 0.1.0
4
+ Summary: AI coding agent backend for Jac, powered by jac-byllm
5
+ Requires-Python: >=3.11
6
+ Requires-Dist: python-dotenv>=1.0.0
7
+ Requires-Dist: jaclang
8
+ Requires-Dist: byllm
9
+ Requires-Dist: mcp>=1.0.0
@@ -0,0 +1,85 @@
1
+ jac_coder/__init__.jac,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ jac_coder/api.jac,sha256=7yABX326Zpr2elxNoa4K5WtJ5Du7alku0m0Hi0kwFz8,2129
3
+ jac_coder/cli_entry.py,sha256=hANjqAz6dO5gBWRnGF53cmYsfODqnLYmt1SG4cGAjqg,674
4
+ jac_coder/config.jac,sha256=0jJxv1QZgxQZdUtFXgsnpRo3USQrUP6RWFyMv29jZaI,858
5
+ jac_coder/context.jac,sha256=fMVE4sEsjqrgl36dygI0MaVRf42t9SjQgr5syuVVGlo,423
6
+ jac_coder/events.jac,sha256=_pclIDFN3UFk8HD27Csah-ANWRudya74NBG-kMyFgmk,2412
7
+ jac_coder/mcp_manager.jac,sha256=ZOREqaNUPIyKitiMFd7CATkFPaWRAwbIRXnkxAINybI,1151
8
+ jac_coder/memory.jac,sha256=PmsUq3Uowvt9QYSqQZHtYCWFTe9J3c0v80NSG_yVavE,440
9
+ jac_coder/nodes.jac,sha256=k46tMPR0AoayQyKZEIXCLDd5uSkXGxvp27zki70ACXc,9926
10
+ jac_coder/permission.jac,sha256=qPGYe4eEv5Ahey9Hd4nJ6JDkQ-enkMDIylmrva5rKXo,492
11
+ jac_coder/serve_entry.jac,sha256=ErhRPjByrlnLkx7W3M5K14g5DTHnZVLo3T-J5VHRTSU,913
12
+ jac_coder/server.jac,sha256=4tefSbkQTy1z7NvQrgX_y_CZsVQscz1YJBuLdIUqmxk,11707
13
+ jac_coder/walkers.jac,sha256=KiuS0WxV5xQO2MYvzunAHrVwx9Tt1UAlyOjl7y65Kf8,1659
14
+ jac_coder/data/examples/ai_agent.md,sha256=Uv9IXoptYXnJAUVKDygQQZfVR079RFR8LYpfQ6-aJJs,2717
15
+ jac_coder/data/examples/blog_app.md,sha256=SH7MwBtfGwVjg2yiC-RGUUtNBLjjn1vtrbWne1hOCxo,11980
16
+ jac_coder/data/examples/core_patterns.md,sha256=jQofpR_gs2AU6uqLXjEe6sN9pOlnsPiwVo6Tey9JNYw,6339
17
+ jac_coder/data/examples/todo_app.md,sha256=aZ9v83vWK3_sqQSGdG9D9-CCQnIV3UrvSGVmKxzvaBA,9082
18
+ jac_coder/data/reference/ai.md,sha256=TpOFihKhem__OrILWDOdy4T9tfMQ7vii9TgqiKv2BlQ,3124
19
+ jac_coder/data/reference/backend.md,sha256=MT_biej9DzywyhQ4bKR8osydlBcWjnkl4UQKfISeaPw,5062
20
+ jac_coder/data/reference/frontend.md,sha256=7yvPldD0DDpXHw0ibw2yzY6z4NZASdlAl1ZUUWvv5cY,6886
21
+ jac_coder/data/reference/osp.md,sha256=JRMT8nqguup7wsuFp5Ig4JwqhjYHtw16pwX-Q5kV4eY,4998
22
+ jac_coder/data/reference/pitfalls.md,sha256=ovW5U_nCcIFrazxRZVZqUfSUM6Yk_cTYAPfX5cyPNIo,3814
23
+ jac_coder/data/reference/syntax.md,sha256=anKQy0qZlHQGTOZ3yKZ8Lq4GOcPrVzggGHRQ25IjsMU,3496
24
+ jac_coder/data/rules/core_jac.md,sha256=3X30Fz1gwMlK3w8czvatDEKEBeVjH6pWdp_yoJYXqM8,9659
25
+ jac_coder/data/rules/fullstack.md,sha256=5CK0roIY-QJH74uhBfvcYTDoLlVcUgKSuvDfY6bi3sY,10229
26
+ jac_coder/data/rules/workflow.md,sha256=DUyh64PADKGajW_4Zcw_ryWPmCzaotYI8STDHzhfR1g,3184
27
+ jac_coder/impl/api.impl.jac,sha256=a5IT3zYNOnDuhglSSo8u2xLdtNfKQ3BxnBqp0lsD2do,12502
28
+ jac_coder/impl/config.impl.jac,sha256=J2W0kw9bx_9EU9QgPAcvHcyxMbU_12xkrSx_dpuJFmM,4625
29
+ jac_coder/impl/context.impl.jac,sha256=Usf4GL__XczRhRRWnpMcjH96144ixHPdfp9SYz3nQ_g,3230
30
+ jac_coder/impl/mcp_manager.impl.jac,sha256=vsiptJub1YCysb29GkAb8A_hgZtwHQo99pwa8l8noz8,13363
31
+ jac_coder/impl/memory.impl.jac,sha256=3tZovNaZGdKCQZeSsNgrROWn1XXvwwcY2GnrqYzQtLM,7494
32
+ jac_coder/impl/nodes.impl.jac,sha256=bRJBOwgFLpTSC2INuv_aXPxDxtf8NgOrF0DWLZenPjw,14963
33
+ jac_coder/impl/permission.impl.jac,sha256=J8bz7Nt4bZ8cIXPUO5WZOeDZfFF65xul0QBT7Mk1Kqw,1671
34
+ jac_coder/impl/walkers.impl.jac,sha256=1gS9_AztWTLVmAe2DNuiIzefP_7DViIWqY1HroJazuc,9389
35
+ jac_coder/tool/__init__.jac,sha256=DtBEANWm0S6ukBvW-C95WpjRO1IK6H52W_kOP0kHbao,1060
36
+ jac_coder/tool/checked.jac,sha256=3gCPgojcLDC7mZHNcX00twAuHh6eEp15zu4dTJ6wc6Y,324
37
+ jac_coder/tool/delegation.jac,sha256=EYdwkaf02sLQXO7E10ZBGeKEoRHvMNt5KK9DzjuHlWI,1005
38
+ jac_coder/tool/filesystem.jac,sha256=Y_dyjlg5IlhZRwxnF-xQU_t-BUPI0mC1A2X7-hD5-mU,729
39
+ jac_coder/tool/git.jac,sha256=qb5y4KAFk2awqDYSjj5m7upsVLWEPJ0ahdcF1__cZoc,465
40
+ jac_coder/tool/guarded.jac,sha256=fE-2CI-gg2NYpaFG3Rx_ekP7yHMI55ypiMcXq-M9vyE,771
41
+ jac_coder/tool/jac_analyzer.jac,sha256=thzcm7EeRlGv1GCbqnijbLY6jGofZD2py3VcylSv-Uk,1396
42
+ jac_coder/tool/jac_docs.jac,sha256=b9CK_ohhqqUKEjHMoLGXseTtAVzGjZgtN3vXz0NbgjQ,251
43
+ jac_coder/tool/jac_tools.jac,sha256=61sJwaZ46RVutRgIcgwyYKYun7t6u7dI-EMs6EK3Uso,289
44
+ jac_coder/tool/mcp.jac,sha256=gQ5ciB4d-9-DMDMMOrkVMjPbeyp9HZ5GiV_E9kwu-9A,846
45
+ jac_coder/tool/preview.jac,sha256=Ydha9LABxFSdXCLDqPzIStmkXI7KHcDbJjL-CdDBRuU,1091
46
+ jac_coder/tool/question.jac,sha256=VrMvnPbrWzdcorRGfAiCEtPyXoRLDasS6PKezBQetKg,156
47
+ jac_coder/tool/scaffold.jac,sha256=cfKahRPxLpx5FqnclFW0mGkSAKTZj4nAQhaVskgBkzs,330
48
+ jac_coder/tool/search.jac,sha256=KiznOit1wPUi3orPeM_6XP9h3Lkwz9xxwF80kdrt8FE,420
49
+ jac_coder/tool/shell.jac,sha256=2dnbe9qo8z6Gz9IBdbnmOP-JiUArP56gIGXhhqT4Pbg,339
50
+ jac_coder/tool/task.jac,sha256=odWexlrBDC2QKS7t9GmoL9vySRROtRtv0Gk_iMphyds,251
51
+ jac_coder/tool/think.jac,sha256=IELBdf-cx0HErd3EDQVBv-6adpNypbBB5Wzj8l1zIM0,130
52
+ jac_coder/tool/todo.jac,sha256=lUPCi7EO9tPnLyJrQK2PASXpo0KnM3KpW2pI32rgmvg,262
53
+ jac_coder/tool/validate.jac,sha256=QRdKxV9g4-a2Rc944FGjxUBXnZKei_KMNCHB22SoFCs,639
54
+ jac_coder/tool/vision.jac,sha256=mSH9D7iu-54g2vsjNu53LtaZBV7O5dOb6rKcyawdCsc,643
55
+ jac_coder/tool/web.jac,sha256=V-_w8rVnyYu4YoYiV4aeSLLNGpIOnlfE1ts0xrZXFG4,266
56
+ jac_coder/tool/impl/checked.impl.jac,sha256=Yfl82_aeDMVauPidJmuuwxDM3ZH_kUpASl18cQv4TCk,1178
57
+ jac_coder/tool/impl/delegation.impl.jac,sha256=PwpMxeKcFSGU2VSgLl2YtVwLrGeJR3E0Hg-5L2N9QrQ,4649
58
+ jac_coder/tool/impl/filesystem.impl.jac,sha256=IFkbofZ5atB0M_ePip1D_4UKTrueG91hq2u-MB0Eg78,27200
59
+ jac_coder/tool/impl/git.impl.jac,sha256=PE28YoHLUtinaGTrB3KM4YOn1VfATt8i5VnHjL_HGNI,3416
60
+ jac_coder/tool/impl/guarded.impl.jac,sha256=0h41c4e9ipRi96y40v9TOr-2dAtLce6cv0QCMzfun08,2024
61
+ jac_coder/tool/impl/jac_analyzer.impl.jac,sha256=dF-dgmWCT9G7zwdAa-YZnXlzjT2VpX7gJlsD5qOdji4,17592
62
+ jac_coder/tool/impl/jac_docs.impl.jac,sha256=kqBzeH_-t-Ps7OYiQcKINmIoZufeO06_37Dz5AEAEZ4,4106
63
+ jac_coder/tool/impl/jac_tools.impl.jac,sha256=N3MxCtcLAf6TTtU6Bbnw5eV89JoSjdNMiyxW9VOPC3A,2281
64
+ jac_coder/tool/impl/mcp.impl.jac,sha256=Jr9beV-LcDPcsXk7wgdVJmalKbApVLMCwmd7qK70ZQo,1024
65
+ jac_coder/tool/impl/preview.impl.jac,sha256=vwEdK7XyliCnGobJhairHIX3EKNZ-yBDObxCofDoDIw,8777
66
+ jac_coder/tool/impl/question.impl.jac,sha256=2qLBQe_egJUILRM1ZqT6k-FoORzfIQNbrm9ukkrGOUQ,863
67
+ jac_coder/tool/impl/scaffold.impl.jac,sha256=qESaoM6Dv88L51a07vkfr9M7cUZBoMXP3wzzRb09zUI,21423
68
+ jac_coder/tool/impl/search.impl.jac,sha256=_u9JxvRhiS6rTc87TZpKKSQjx6XMkRI33D7UcPZj5Us,2345
69
+ jac_coder/tool/impl/shell.impl.jac,sha256=z97oDZy_t8Oo2o0gdgZFszPOf69LMxZeVco8nNDndtQ,2586
70
+ jac_coder/tool/impl/task.impl.jac,sha256=TtGZRHD1G_btvgHIMoaQ7R16UDmbFpquFmomVbzhrh0,436
71
+ jac_coder/tool/impl/think.impl.jac,sha256=Vpl10LGv5wVjFotOMLgQOWK5zekDukcdDk1vQW6jvRE,138
72
+ jac_coder/tool/impl/todo.impl.jac,sha256=vaBjaG1ZJ4i4I5bvQb7o81F_nxyvnrYLQIhPaY5rqU8,1528
73
+ jac_coder/tool/impl/validate.impl.jac,sha256=j8aMOZ2DVglsWyCbY8kypEPapZ-joz1y2TOgOv5kxGo,8005
74
+ jac_coder/tool/impl/web.impl.jac,sha256=p5njkd9cKU9pjyLw6kprNjpF3SX4jSm1O3zRJ_lMvys,2761
75
+ jac_coder/util/__init__.jac,sha256=AFxFVI0UU_YSBqLZNlezORyrh1xdi1VnWJaoLNo7DQE,261
76
+ jac_coder/util/colors.jac,sha256=ThftCTrFpEw-rcfDY6CQNPne57CV6QLNebIB0-UfeXY,485
77
+ jac_coder/util/sandbox.jac,sha256=fAxriAvUfhuM0I2RCHK2uKODb20CDVaf8HNXHjYBwpI,181
78
+ jac_coder/util/tool_output.jac,sha256=0eaybkCNOOebb6kfmmrKu-h-WKwf5C2eNu-McnTcNaI,646
79
+ jac_coder/util/impl/sandbox.impl.jac,sha256=YZQHMAmxvk1LfvSjAROQw5e6rhG4LROdPHqzwNkhhUw,822
80
+ jac_coder/util/impl/tool_output.impl.jac,sha256=9_xeh3aIGrI75BwpIpAqamC6OVbqQFBO8SX-Q0mAVOw,5229
81
+ jac_coder-0.1.0.dist-info/METADATA,sha256=PUyBBXTxsTzh1vYmf61F7UeYttWBPiiFXddiBNtbFoo,246
82
+ jac_coder-0.1.0.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
83
+ jac_coder-0.1.0.dist-info/entry_points.txt,sha256=3qZxPMT2xOdABJHy1tCXslDNE_Th6B_mi48T6lpvE4o,101
84
+ jac_coder-0.1.0.dist-info/top_level.txt,sha256=2uM9UgP2leB3zQ0GW5xdLgw_rJ7Nra7TAbyaGjPknLE,10
85
+ jac_coder-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (82.0.1)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,3 @@
1
+ [console_scripts]
2
+ jac-coder = jac_coder.cli_entry:main
3
+ jac-coder-server = jac_coder.serve_entry:main
@@ -0,0 +1 @@
1
+ jac_coder