npcsh 1.0.29__py3-none-any.whl → 1.0.31__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.
- npcsh/_state.py +1 -1
- npcsh/corca.py +20 -7
- npcsh/guac.py +90 -46
- npcsh/npcsh.py +15 -22
- {npcsh-1.0.29.dist-info → npcsh-1.0.31.dist-info}/METADATA +1 -1
- {npcsh-1.0.29.dist-info → npcsh-1.0.31.dist-info}/RECORD +36 -36
- {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/alicanto.npc +0 -0
- {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/alicanto.png +0 -0
- {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/bash_executer.jinx +0 -0
- {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/corca.npc +0 -0
- {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/corca.png +0 -0
- {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/edit_file.jinx +0 -0
- {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/foreman.npc +0 -0
- {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/frederic.npc +0 -0
- {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/frederic4.png +0 -0
- {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/guac.png +0 -0
- {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/image_generation.jinx +0 -0
- {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/internet_search.jinx +0 -0
- {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/kadiefa.npc +0 -0
- {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/kadiefa.png +0 -0
- {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/npcsh.ctx +0 -0
- {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/npcsh_sibiji.png +0 -0
- {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/plonk.npc +0 -0
- {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/plonk.png +0 -0
- {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/plonkjr.npc +0 -0
- {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/plonkjr.png +0 -0
- {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/python_executor.jinx +0 -0
- {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/screen_cap.jinx +0 -0
- {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/sibiji.npc +0 -0
- {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/sibiji.png +0 -0
- {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/spool.png +0 -0
- {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/yap.png +0 -0
- {npcsh-1.0.29.dist-info → npcsh-1.0.31.dist-info}/WHEEL +0 -0
- {npcsh-1.0.29.dist-info → npcsh-1.0.31.dist-info}/entry_points.txt +0 -0
- {npcsh-1.0.29.dist-info → npcsh-1.0.31.dist-info}/licenses/LICENSE +0 -0
- {npcsh-1.0.29.dist-info → npcsh-1.0.31.dist-info}/top_level.txt +0 -0
npcsh/_state.py
CHANGED
npcsh/corca.py
CHANGED
|
@@ -236,15 +236,20 @@ def process_mcp_stream(stream_response, active_npc):
|
|
|
236
236
|
tool_calls[idx]['function']['arguments'] += tool_call_delta.function.arguments
|
|
237
237
|
except KeyboardInterrupt:
|
|
238
238
|
interrupted = True
|
|
239
|
-
print('⚠️ Stream interrupted by user')
|
|
239
|
+
print('\n⚠️ Stream interrupted by user')
|
|
240
240
|
|
|
241
241
|
sys.stdout.write('\033[u')
|
|
242
|
-
sys.stdout.write('\033[
|
|
242
|
+
sys.stdout.write('\033[0J')
|
|
243
243
|
sys.stdout.flush()
|
|
244
244
|
|
|
245
|
-
|
|
246
|
-
|
|
245
|
+
if collected_content:
|
|
246
|
+
render_markdown(collected_content)
|
|
247
|
+
|
|
247
248
|
return collected_content, tool_calls
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
|
|
248
253
|
def execute_command_corca(command: str, state: ShellState, command_history, selected_mcp_tools_names: Optional[List[str]] = None) -> Tuple[ShellState, Any]:
|
|
249
254
|
mcp_tools_for_llm = []
|
|
250
255
|
|
|
@@ -265,6 +270,17 @@ def execute_command_corca(command: str, state: ShellState, command_history, sele
|
|
|
265
270
|
|
|
266
271
|
active_npc = state.npc if isinstance(state.npc, NPC) else NPC(name="default")
|
|
267
272
|
|
|
273
|
+
if len(state.messages) > 20:
|
|
274
|
+
compressed_state = active_npc.compress_planning_state({
|
|
275
|
+
"goal": "ongoing session",
|
|
276
|
+
"facts": [],
|
|
277
|
+
"successes": [],
|
|
278
|
+
"mistakes": [],
|
|
279
|
+
"todos": [],
|
|
280
|
+
"constraints": []
|
|
281
|
+
})
|
|
282
|
+
state.messages = [{"role": "system", "content": f"Session context: {compressed_state}"}]
|
|
283
|
+
|
|
268
284
|
response_dict = get_llm_response(
|
|
269
285
|
prompt=command,
|
|
270
286
|
npc=state.npc,
|
|
@@ -280,7 +296,6 @@ def execute_command_corca(command: str, state: ShellState, command_history, sele
|
|
|
280
296
|
|
|
281
297
|
collected_content, tool_calls = process_mcp_stream(stream_response, active_npc)
|
|
282
298
|
|
|
283
|
-
|
|
284
299
|
state.messages = messages
|
|
285
300
|
if collected_content or tool_calls:
|
|
286
301
|
assistant_message = {"role": "assistant", "content": collected_content}
|
|
@@ -293,8 +308,6 @@ def execute_command_corca(command: str, state: ShellState, command_history, sele
|
|
|
293
308
|
"tool_calls": tool_calls,
|
|
294
309
|
"messages": state.messages
|
|
295
310
|
}
|
|
296
|
-
|
|
297
|
-
|
|
298
311
|
def _resolve_and_copy_mcp_server_path(
|
|
299
312
|
explicit_path: Optional[str],
|
|
300
313
|
current_path: Optional[str],
|
npcsh/guac.py
CHANGED
|
@@ -6,18 +6,9 @@ import pandas as pd
|
|
|
6
6
|
import sys
|
|
7
7
|
import argparse
|
|
8
8
|
import importlib.metadata
|
|
9
|
-
import matplotlib
|
|
10
|
-
import platform
|
|
11
9
|
import queue
|
|
12
10
|
plot_queue = queue.Queue()
|
|
13
11
|
|
|
14
|
-
if platform.system() == 'Darwin':
|
|
15
|
-
try:
|
|
16
|
-
matplotlib.use('TkAgg')
|
|
17
|
-
except ImportError:
|
|
18
|
-
matplotlib.use('Agg')
|
|
19
|
-
else:
|
|
20
|
-
matplotlib.use('TkAgg')
|
|
21
12
|
|
|
22
13
|
import matplotlib.pyplot as plt
|
|
23
14
|
from chroptiks.plotting_utils import *
|
|
@@ -155,17 +146,16 @@ def is_python_code(text: str) -> bool:
|
|
|
155
146
|
text = text.strip()
|
|
156
147
|
if not text:
|
|
157
148
|
return False
|
|
149
|
+
|
|
158
150
|
try:
|
|
159
|
-
compile(text, "<input>", "
|
|
151
|
+
compile(text, "<input>", "exec")
|
|
160
152
|
return True
|
|
161
153
|
except SyntaxError:
|
|
162
|
-
|
|
163
|
-
compile(text, "<input>", "exec")
|
|
164
|
-
return True
|
|
165
|
-
except SyntaxError:
|
|
166
|
-
return False
|
|
154
|
+
return False
|
|
167
155
|
except (OverflowError, ValueError):
|
|
168
156
|
return False
|
|
157
|
+
except IndentationError:
|
|
158
|
+
return True
|
|
169
159
|
def execute_python_code(code_str: str, state: ShellState, locals_dict: Dict[str, Any]) -> Tuple[ShellState, Any]:
|
|
170
160
|
import io
|
|
171
161
|
output_capture = io.StringIO()
|
|
@@ -1145,12 +1135,10 @@ def _get_guac_agent_emoji(failures: int, max_fail: int = 3) -> str:
|
|
|
1145
1135
|
|
|
1146
1136
|
|
|
1147
1137
|
|
|
1148
|
-
|
|
1149
1138
|
def _run_agentic_mode(command: str,
|
|
1150
1139
|
state: ShellState,
|
|
1151
1140
|
locals_dict: Dict[str, Any],
|
|
1152
1141
|
npc_team_dir: Path) -> Tuple[ShellState, Any]:
|
|
1153
|
-
"""Run agentic mode with continuous iteration based on progress"""
|
|
1154
1142
|
max_iterations = 5
|
|
1155
1143
|
iteration = 0
|
|
1156
1144
|
full_output = []
|
|
@@ -1158,6 +1146,20 @@ def _run_agentic_mode(command: str,
|
|
|
1158
1146
|
consecutive_failures = 0
|
|
1159
1147
|
max_consecutive_failures = 3
|
|
1160
1148
|
|
|
1149
|
+
if len(state.messages) > 15:
|
|
1150
|
+
planning_state = {
|
|
1151
|
+
"goal": "ongoing guac session",
|
|
1152
|
+
"facts": [f"Working in {state.current_path}", f"Variables: {list(locals_dict.keys())[:10]}"],
|
|
1153
|
+
"successes": [],
|
|
1154
|
+
"mistakes": [],
|
|
1155
|
+
"todos": [],
|
|
1156
|
+
"constraints": ["Focus on Python code execution", "Use existing variables when possible"]
|
|
1157
|
+
}
|
|
1158
|
+
compressed_state = state.npc.compress_planning_state(planning_state)
|
|
1159
|
+
state.messages = [{"role": "system", "content": f"Session context: {compressed_state}"}]
|
|
1160
|
+
|
|
1161
|
+
|
|
1162
|
+
|
|
1161
1163
|
|
|
1162
1164
|
existing_vars_context = "EXISTING VARIABLES IN ENVIRONMENT:\n"
|
|
1163
1165
|
for var_name, var_value in locals_dict.items():
|
|
@@ -1460,6 +1462,7 @@ def execute_guac_command(command: str, state: ShellState, locals_dict: Dict[str,
|
|
|
1460
1462
|
|
|
1461
1463
|
if stripped_command.startswith('/') and stripped_command not in ["/refresh", "/agent", "/chat", "/cmd"]:
|
|
1462
1464
|
return execute_command(stripped_command, state, review=True, router=router)
|
|
1465
|
+
print(is_python_code(stripped_command))
|
|
1463
1466
|
if is_python_code(stripped_command):
|
|
1464
1467
|
try:
|
|
1465
1468
|
state, exec_output = execute_python_code(stripped_command, state, locals_dict)
|
|
@@ -1468,6 +1471,7 @@ def execute_guac_command(command: str, state: ShellState, locals_dict: Dict[str,
|
|
|
1468
1471
|
print("\nExecution interrupted by user")
|
|
1469
1472
|
return state, "Execution interrupted"
|
|
1470
1473
|
if state.current_mode == "agent":
|
|
1474
|
+
|
|
1471
1475
|
return _run_agentic_mode(stripped_command, state, locals_dict, npc_team_dir)
|
|
1472
1476
|
if state.current_mode == "cmd":
|
|
1473
1477
|
|
|
@@ -1879,38 +1883,78 @@ def enter_guac_mode(npc=None,
|
|
|
1879
1883
|
state.command_history = command_history
|
|
1880
1884
|
|
|
1881
1885
|
if npc is None and default_npc is None:
|
|
1882
|
-
|
|
1883
|
-
|
|
1884
|
-
|
|
1885
|
-
|
|
1886
|
-
|
|
1887
|
-
|
|
1888
|
-
|
|
1889
|
-
|
|
1890
|
-
|
|
1891
|
-
|
|
1892
|
-
|
|
1893
|
-
|
|
1894
|
-
|
|
1895
|
-
|
|
1896
|
-
|
|
1897
|
-
|
|
1898
|
-
|
|
1899
|
-
|
|
1900
|
-
|
|
1901
|
-
|
|
1902
|
-
|
|
1903
|
-
|
|
1886
|
+
guac_npc_path = Path(npc_team_dir) / "guac.npc"
|
|
1887
|
+
if guac_npc_path.exists():
|
|
1888
|
+
npc = NPC(file=str(guac_npc_path),
|
|
1889
|
+
db_conn=command_history.engine)
|
|
1890
|
+
print(guac_npc_path, npc)
|
|
1891
|
+
|
|
1892
|
+
team_ctx_path = get_team_ctx_path(str(npc_team_dir))
|
|
1893
|
+
team_ctx = {}
|
|
1894
|
+
if team_ctx_path and Path(team_ctx_path).exists():
|
|
1895
|
+
with open(team_ctx_path, "r") as f:
|
|
1896
|
+
team_ctx = yaml.safe_load(f) or {}
|
|
1897
|
+
print(team_ctx, team_ctx_path)
|
|
1898
|
+
team = Team(team_path=str(npc_team_dir),
|
|
1899
|
+
forenpc=npc,
|
|
1900
|
+
jinxs={})
|
|
1901
|
+
team.name = team_ctx.get("team_name", "guac_global_team")
|
|
1902
|
+
team.team_ctx = team_ctx
|
|
1903
|
+
print(team)
|
|
1904
|
+
if npc.model is None:
|
|
1905
|
+
npc.model = team_ctx.get("model", state.chat_model)
|
|
1906
|
+
if npc.provider is None:
|
|
1907
|
+
npc.provider = team_ctx.get("provider", state.chat_provider)
|
|
1908
|
+
|
|
1909
|
+
for npc_name, npc_obj in team.npcs.items():
|
|
1910
|
+
if not npc_obj.model:
|
|
1911
|
+
npc_obj.model = team_ctx.get("model", state.chat_model)
|
|
1912
|
+
if not npc_obj.provider:
|
|
1913
|
+
npc_obj.provider = team_ctx.get("provider", state.chat_provider)
|
|
1914
|
+
else:
|
|
1915
|
+
print("No local guac.npc found. Checking for global team...")
|
|
1916
|
+
global_team_dir = ensure_global_guac_team()
|
|
1917
|
+
global_guac_npc_path = global_team_dir / "guac.npc"
|
|
1904
1918
|
|
|
1905
|
-
|
|
1906
|
-
|
|
1907
|
-
|
|
1908
|
-
|
|
1909
|
-
|
|
1910
|
-
|
|
1911
|
-
|
|
1919
|
+
if global_guac_npc_path.exists():
|
|
1920
|
+
print("Using global guac team")
|
|
1921
|
+
npc = NPC(file=str(global_guac_npc_path),
|
|
1922
|
+
db_conn=command_history.engine)
|
|
1923
|
+
team_ctx_path = global_team_dir / "team.ctx"
|
|
1924
|
+
team_ctx = {}
|
|
1925
|
+
if team_ctx_path.exists():
|
|
1926
|
+
with open(team_ctx_path, "r") as f:
|
|
1927
|
+
team_ctx = yaml.safe_load(f) or {}
|
|
1928
|
+
|
|
1929
|
+
team = Team(team_path=str(global_team_dir),
|
|
1930
|
+
forenpc=npc,
|
|
1931
|
+
jinxs={})
|
|
1932
|
+
team.name = team_ctx.get("team_name", "guac_global_team")
|
|
1933
|
+
team.team_ctx = team_ctx
|
|
1934
|
+
|
|
1935
|
+
if npc.model is None:
|
|
1936
|
+
npc.model = team_ctx.get("model", state.chat_model)
|
|
1937
|
+
if npc.provider is None:
|
|
1938
|
+
npc.provider = team_ctx.get("provider", state.chat_provider)
|
|
1939
|
+
else:
|
|
1940
|
+
print("Could not find or create global guac team. Please run /init to set up guac properly.")
|
|
1941
|
+
try:
|
|
1942
|
+
user_choice = input("Would you like to initialize guac now? (y/n): ").strip().lower()
|
|
1943
|
+
if user_choice == 'y':
|
|
1944
|
+
setup_npc_team(Path(npc_team_dir), lang)
|
|
1945
|
+
npc = NPC(file=str(Path(npc_team_dir) / "guac.npc"),
|
|
1946
|
+
db_conn=command_history.engine)
|
|
1947
|
+
team = Team(team_path=str(npc_team_dir), forenpc=npc, jinxs={})
|
|
1948
|
+
else:
|
|
1949
|
+
print("Exiting guac mode.")
|
|
1950
|
+
return
|
|
1951
|
+
except (KeyboardInterrupt, EOFError):
|
|
1952
|
+
print("Initialization cancelled. Exiting guac mode.")
|
|
1953
|
+
return
|
|
1912
1954
|
elif default_npc and npc is None:
|
|
1913
1955
|
npc = default_npc
|
|
1956
|
+
|
|
1957
|
+
|
|
1914
1958
|
state.npc = npc or default_npc
|
|
1915
1959
|
state.team = team or default_team
|
|
1916
1960
|
|
npcsh/npcsh.py
CHANGED
|
@@ -68,22 +68,14 @@ Begin by asking a question, issuing a bash command, or typing '/help' for more i
|
|
|
68
68
|
)
|
|
69
69
|
|
|
70
70
|
|
|
71
|
-
|
|
72
71
|
def run_repl(command_history: CommandHistory, initial_state: ShellState):
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
'''
|
|
76
|
-
Func for running the npcsh repl
|
|
77
|
-
'''
|
|
78
72
|
state = initial_state
|
|
79
73
|
print_welcome_message()
|
|
80
74
|
|
|
81
|
-
|
|
82
75
|
render_markdown(f'- Using {state.current_mode} mode. Use /agent, /cmd, or /chat to switch to other modes')
|
|
83
76
|
render_markdown(f'- To switch to a different NPC, type /npc <npc_name> or /n <npc_name> to switch to that NPC.')
|
|
84
77
|
render_markdown('\n- Here are the current NPCs available in your team: ' + ', '.join([npc_name for npc_name in state.team.npcs.keys()]))
|
|
85
78
|
|
|
86
|
-
|
|
87
79
|
is_windows = platform.system().lower().startswith("win")
|
|
88
80
|
try:
|
|
89
81
|
completer = make_completer(state)
|
|
@@ -92,23 +84,16 @@ def run_repl(command_history: CommandHistory, initial_state: ShellState):
|
|
|
92
84
|
pass
|
|
93
85
|
session_scopes = set()
|
|
94
86
|
|
|
95
|
-
|
|
96
87
|
def exit_shell(current_state: ShellState):
|
|
97
|
-
"""
|
|
98
|
-
On exit, iterates through all active scopes from the session and
|
|
99
|
-
creates/updates the specific knowledge graph for each one.
|
|
100
|
-
"""
|
|
101
88
|
print("\nGoodbye!")
|
|
102
89
|
print(colored("Processing and archiving all session knowledge...", "cyan"))
|
|
103
90
|
|
|
104
91
|
engine = command_history.engine
|
|
105
92
|
|
|
106
|
-
|
|
107
93
|
for team_name, npc_name, path in session_scopes:
|
|
108
94
|
try:
|
|
109
95
|
print(f" -> Archiving knowledge for: T='{team_name}', N='{npc_name}', P='{path}'")
|
|
110
96
|
|
|
111
|
-
|
|
112
97
|
convo_id = current_state.conversation_id
|
|
113
98
|
all_messages = command_history.get_conversations_by_id(convo_id)
|
|
114
99
|
|
|
@@ -123,10 +108,8 @@ def run_repl(command_history: CommandHistory, initial_state: ShellState):
|
|
|
123
108
|
print(" ...No content for this scope, skipping.")
|
|
124
109
|
continue
|
|
125
110
|
|
|
126
|
-
|
|
127
111
|
current_kg = load_kg_from_db(engine, team_name, npc_name, path)
|
|
128
112
|
|
|
129
|
-
|
|
130
113
|
evolved_kg, _ = kg_evolve_incremental(
|
|
131
114
|
existing_kg=current_kg,
|
|
132
115
|
new_content_text=full_text,
|
|
@@ -137,10 +120,8 @@ def run_repl(command_history: CommandHistory, initial_state: ShellState):
|
|
|
137
120
|
link_concepts_facts = True,
|
|
138
121
|
link_concepts_concepts = True,
|
|
139
122
|
link_facts_facts = True,
|
|
140
|
-
|
|
141
123
|
)
|
|
142
124
|
|
|
143
|
-
|
|
144
125
|
save_kg_to_db(engine,
|
|
145
126
|
evolved_kg,
|
|
146
127
|
team_name,
|
|
@@ -154,10 +135,20 @@ def run_repl(command_history: CommandHistory, initial_state: ShellState):
|
|
|
154
135
|
|
|
155
136
|
sys.exit(0)
|
|
156
137
|
|
|
157
|
-
|
|
158
|
-
|
|
159
138
|
while True:
|
|
160
139
|
try:
|
|
140
|
+
if len(state.messages) > 20:
|
|
141
|
+
planning_state = {
|
|
142
|
+
"goal": "ongoing npcsh session",
|
|
143
|
+
"facts": [f"Working in {state.current_path}", f"Current mode: {state.current_mode}"],
|
|
144
|
+
"successes": [],
|
|
145
|
+
"mistakes": [],
|
|
146
|
+
"todos": [],
|
|
147
|
+
"constraints": ["Follow user requests", "Use appropriate mode for tasks"]
|
|
148
|
+
}
|
|
149
|
+
compressed_state = state.npc.compress_planning_state(planning_state)
|
|
150
|
+
state.messages = [{"role": "system", "content": f"Session context: {compressed_state}"}]
|
|
151
|
+
|
|
161
152
|
try:
|
|
162
153
|
completer = make_completer(state)
|
|
163
154
|
readline.set_completer(completer)
|
|
@@ -198,6 +189,7 @@ def run_repl(command_history: CommandHistory, initial_state: ShellState):
|
|
|
198
189
|
continue
|
|
199
190
|
else:
|
|
200
191
|
exit_shell(state)
|
|
192
|
+
|
|
201
193
|
team_name = state.team.name if state.team else "__none__"
|
|
202
194
|
npc_name = state.npc.name if isinstance(state.npc, NPC) else "__none__"
|
|
203
195
|
session_scopes.add((team_name, npc_name, state.current_path))
|
|
@@ -224,7 +216,8 @@ def run_repl(command_history: CommandHistory, initial_state: ShellState):
|
|
|
224
216
|
if is_windows and "EOF" in str(e).lower():
|
|
225
217
|
print("\nHint: On Windows, use Ctrl+Z then Enter for EOF, or type 'exit'")
|
|
226
218
|
continue
|
|
227
|
-
raise
|
|
219
|
+
raise
|
|
220
|
+
|
|
228
221
|
|
|
229
222
|
def main() -> None:
|
|
230
223
|
parser = argparse.ArgumentParser(description="npcsh - An NPC-powered shell.")
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
npcsh/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
-
npcsh/_state.py,sha256=
|
|
2
|
+
npcsh/_state.py,sha256=sntRSm9DKthandawaLCf-semAm_1CNx3AUh-066G248,86498
|
|
3
3
|
npcsh/alicanto.py,sha256=S-_mFtEzE8CKWSctJawUtAKmVLgUz-loODTDtL0f6eo,41538
|
|
4
|
-
npcsh/corca.py,sha256=
|
|
5
|
-
npcsh/guac.py,sha256=
|
|
4
|
+
npcsh/corca.py,sha256=XuaNVhZ1Yslx43AcdmApViUXMuWMoXncLaNT0wwiHmk,47737
|
|
5
|
+
npcsh/guac.py,sha256=sVdLYVkzkQw6TE7crtLUX0QJZFkzQthWZTe1p7IfAQE,80412
|
|
6
6
|
npcsh/mcp_helpers.py,sha256=9TsCfcquGu_vX4WaKlY3J3P13-uxruQKrXng-jJ5YyY,11176
|
|
7
7
|
npcsh/mcp_server.py,sha256=krc1rhiSU9gI76w99Ph3Mk7OyUVzfiEXKMvVid-7-Ik,5201
|
|
8
8
|
npcsh/npc.py,sha256=OjCDu03hAcXyqPbzMeBBr1cBnmQsB1FBhd7kLNsWALc,8330
|
|
9
|
-
npcsh/npcsh.py,sha256=
|
|
9
|
+
npcsh/npcsh.py,sha256=3WLkZxHGzRekVGxHiJUA4VFyhC3A1jwX11aB0kgzE9s,8818
|
|
10
10
|
npcsh/plonk.py,sha256=IfOuiE5FBvk-EIsrWFjGy0SrNywDpn4a49E7seBtEmY,14246
|
|
11
11
|
npcsh/pti.py,sha256=UciiiH2Kz4ERQFy0-FX6BQEU2VxYQEUril-_Cvj76Y0,7853
|
|
12
12
|
npcsh/routes.py,sha256=1r9WI3fVtj_vy7ZdL_90R9DtX2UulYrqer1SQG8pJks,44213
|
|
@@ -39,35 +39,35 @@ npcsh/npc_team/jinxs/image_generation.jinx,sha256=bQxZdEm0_eqvf_OJSHw3qarp8Klp3L
|
|
|
39
39
|
npcsh/npc_team/jinxs/internet_search.jinx,sha256=s8zVxwKFUAof_VzQrwB5dpAQdeJ6hUBkbIdRsT-I5mo,1267
|
|
40
40
|
npcsh/npc_team/jinxs/python_executor.jinx,sha256=vZz3pZaj1BnPFHMs_wpyjRc0b32JR4rLhZfulCMDF1s,398
|
|
41
41
|
npcsh/npc_team/jinxs/screen_cap.jinx,sha256=-4DG0EiEe61N_kMhVqqHKhLVGOLuZQT9ax6IZk20NjI,960
|
|
42
|
-
npcsh-1.0.
|
|
43
|
-
npcsh-1.0.
|
|
44
|
-
npcsh-1.0.
|
|
45
|
-
npcsh-1.0.
|
|
46
|
-
npcsh-1.0.
|
|
47
|
-
npcsh-1.0.
|
|
48
|
-
npcsh-1.0.
|
|
49
|
-
npcsh-1.0.
|
|
50
|
-
npcsh-1.0.
|
|
51
|
-
npcsh-1.0.
|
|
52
|
-
npcsh-1.0.
|
|
53
|
-
npcsh-1.0.
|
|
54
|
-
npcsh-1.0.
|
|
55
|
-
npcsh-1.0.
|
|
56
|
-
npcsh-1.0.
|
|
57
|
-
npcsh-1.0.
|
|
58
|
-
npcsh-1.0.
|
|
59
|
-
npcsh-1.0.
|
|
60
|
-
npcsh-1.0.
|
|
61
|
-
npcsh-1.0.
|
|
62
|
-
npcsh-1.0.
|
|
63
|
-
npcsh-1.0.
|
|
64
|
-
npcsh-1.0.
|
|
65
|
-
npcsh-1.0.
|
|
66
|
-
npcsh-1.0.
|
|
67
|
-
npcsh-1.0.
|
|
68
|
-
npcsh-1.0.
|
|
69
|
-
npcsh-1.0.
|
|
70
|
-
npcsh-1.0.
|
|
71
|
-
npcsh-1.0.
|
|
72
|
-
npcsh-1.0.
|
|
73
|
-
npcsh-1.0.
|
|
42
|
+
npcsh-1.0.31.data/data/npcsh/npc_team/alicanto.npc,sha256=y9yDY3lq8ZwxQxpnrgle8w5IJwZqvxDepZFU4OaZCtg,148
|
|
43
|
+
npcsh-1.0.31.data/data/npcsh/npc_team/alicanto.png,sha256=A7xeMbcoKGjlkELxJEVifCEZLVWbOKZarTN5ZFJG-FM,3519858
|
|
44
|
+
npcsh-1.0.31.data/data/npcsh/npc_team/bash_executer.jinx,sha256=C_oQccOY8cKevMMPLRdznlMOccQvLgyzyOIThXvmrD8,692
|
|
45
|
+
npcsh-1.0.31.data/data/npcsh/npc_team/corca.npc,sha256=HI3Bs6KlUBPMz7icF1TRE8-V3f3EdU_VxvQxEpru3L4,662
|
|
46
|
+
npcsh-1.0.31.data/data/npcsh/npc_team/corca.png,sha256=0lF70hKu6tY-37YmIPVF2cuaPzvnQ4-UtQOzuAbKEf4,1666776
|
|
47
|
+
npcsh-1.0.31.data/data/npcsh/npc_team/edit_file.jinx,sha256=4PaJs8g_cdeDpbQwQSBycU5RDA0rczEC_NpLfLjo74Y,3490
|
|
48
|
+
npcsh-1.0.31.data/data/npcsh/npc_team/foreman.npc,sha256=WqB8jLfBToGmr8c1vip1KOnTHxfXlGXwDUGnZoDMQr0,327
|
|
49
|
+
npcsh-1.0.31.data/data/npcsh/npc_team/frederic.npc,sha256=EE2dOUItp-VKuW3ZMSHffmIEO4evjPcU2W_C4P3WXbY,362
|
|
50
|
+
npcsh-1.0.31.data/data/npcsh/npc_team/frederic4.png,sha256=ll8uoV0npnPp5HVJWv7h0xDSeuq4pqsk_gYGBHLS0VY,1590744
|
|
51
|
+
npcsh-1.0.31.data/data/npcsh/npc_team/guac.png,sha256=MCE7eJuEJwLJEzc9FS7lL62Mm-38jQRHkxXogPfOTuw,211470
|
|
52
|
+
npcsh-1.0.31.data/data/npcsh/npc_team/image_generation.jinx,sha256=bQxZdEm0_eqvf_OJSHw3qarp8Klp3LlBDv1_HY3COo4,1307
|
|
53
|
+
npcsh-1.0.31.data/data/npcsh/npc_team/internet_search.jinx,sha256=s8zVxwKFUAof_VzQrwB5dpAQdeJ6hUBkbIdRsT-I5mo,1267
|
|
54
|
+
npcsh-1.0.31.data/data/npcsh/npc_team/kadiefa.npc,sha256=Yl5a4wrfe4F2f6Ndw_ukzlVVX7NE9g_mG-3QqJSkg_o,381
|
|
55
|
+
npcsh-1.0.31.data/data/npcsh/npc_team/kadiefa.png,sha256=3CAwL8crKIwJko6o75Z6OYYEEM9Rk--yGzCJg7zoszg,3062528
|
|
56
|
+
npcsh-1.0.31.data/data/npcsh/npc_team/npcsh.ctx,sha256=-jKYaPm2YbZHAGgWAXhyPIwhiNe1H1ZRFg1Zc7tHSxk,1049
|
|
57
|
+
npcsh-1.0.31.data/data/npcsh/npc_team/npcsh_sibiji.png,sha256=9fUqgYMsSHmaH-kBTBQ7N5UCS5-eLZF94Log0O3mtFg,4544
|
|
58
|
+
npcsh-1.0.31.data/data/npcsh/npc_team/plonk.npc,sha256=u1m2a1D512XGQ2kC3eWDAY8Y2IvpkNU73DI_CPE65UE,90
|
|
59
|
+
npcsh-1.0.31.data/data/npcsh/npc_team/plonk.png,sha256=IU5ey-Dl4HEKlwnf75RSWNSHpF8rVqGmdbsa0deL4rQ,2727773
|
|
60
|
+
npcsh-1.0.31.data/data/npcsh/npc_team/plonkjr.npc,sha256=It-i-BEuG0XddKk0d85onk2aJr9Pe5pLnJzNaCWaQIM,87
|
|
61
|
+
npcsh-1.0.31.data/data/npcsh/npc_team/plonkjr.png,sha256=MqLEGwsyECUeODZIti0HQQrMMVxA6XERpW01R06NbpY,2606710
|
|
62
|
+
npcsh-1.0.31.data/data/npcsh/npc_team/python_executor.jinx,sha256=vZz3pZaj1BnPFHMs_wpyjRc0b32JR4rLhZfulCMDF1s,398
|
|
63
|
+
npcsh-1.0.31.data/data/npcsh/npc_team/screen_cap.jinx,sha256=-4DG0EiEe61N_kMhVqqHKhLVGOLuZQT9ax6IZk20NjI,960
|
|
64
|
+
npcsh-1.0.31.data/data/npcsh/npc_team/sibiji.npc,sha256=Hb4wXKIObKKgibwnio5hLec9yd_9bKDCA87Nm2zijFA,216
|
|
65
|
+
npcsh-1.0.31.data/data/npcsh/npc_team/sibiji.png,sha256=1dlZb7J3E62FcVo9CVOzLb8nu1bIUV7cr97nsFocHCM,35615
|
|
66
|
+
npcsh-1.0.31.data/data/npcsh/npc_team/spool.png,sha256=LWTLkwDxXBfLuSUCX32_lo5yAmLYGsA67Xpsz-7MmWU,2876725
|
|
67
|
+
npcsh-1.0.31.data/data/npcsh/npc_team/yap.png,sha256=_l7UbWnXJdsy4Mx-x5l9DT0R6ize3HTnkwQQnOFlI18,1548649
|
|
68
|
+
npcsh-1.0.31.dist-info/licenses/LICENSE,sha256=IKBvAECHP-aCiJtE4cHGCE5Yl0tozYz02PomGeWS3y4,1070
|
|
69
|
+
npcsh-1.0.31.dist-info/METADATA,sha256=gAjnehN3A7kfXcP4WxyuZnf2JwKBBklbLjUl2VtCuS4,25486
|
|
70
|
+
npcsh-1.0.31.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
71
|
+
npcsh-1.0.31.dist-info/entry_points.txt,sha256=S5yIuGm8ZXQ4siHYgN5gs0J7bxgobSEULXf8L5HaW5o,206
|
|
72
|
+
npcsh-1.0.31.dist-info/top_level.txt,sha256=kHSNgKMCkfjV95-DH0YSp1LLBi0HXdF3w57j7MQON3E,6
|
|
73
|
+
npcsh-1.0.31.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|