npcsh 1.0.30__py3-none-any.whl → 1.0.32__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 (36) hide show
  1. npcsh/alicanto.py +1001 -1015
  2. npcsh/corca.py +61 -21
  3. npcsh/guac.py +77 -62
  4. npcsh/routes.py +16 -15
  5. {npcsh-1.0.30.dist-info → npcsh-1.0.32.dist-info}/METADATA +1 -1
  6. {npcsh-1.0.30.dist-info → npcsh-1.0.32.dist-info}/RECORD +36 -36
  7. {npcsh-1.0.30.data → npcsh-1.0.32.data}/data/npcsh/npc_team/alicanto.npc +0 -0
  8. {npcsh-1.0.30.data → npcsh-1.0.32.data}/data/npcsh/npc_team/alicanto.png +0 -0
  9. {npcsh-1.0.30.data → npcsh-1.0.32.data}/data/npcsh/npc_team/bash_executer.jinx +0 -0
  10. {npcsh-1.0.30.data → npcsh-1.0.32.data}/data/npcsh/npc_team/corca.npc +0 -0
  11. {npcsh-1.0.30.data → npcsh-1.0.32.data}/data/npcsh/npc_team/corca.png +0 -0
  12. {npcsh-1.0.30.data → npcsh-1.0.32.data}/data/npcsh/npc_team/edit_file.jinx +0 -0
  13. {npcsh-1.0.30.data → npcsh-1.0.32.data}/data/npcsh/npc_team/foreman.npc +0 -0
  14. {npcsh-1.0.30.data → npcsh-1.0.32.data}/data/npcsh/npc_team/frederic.npc +0 -0
  15. {npcsh-1.0.30.data → npcsh-1.0.32.data}/data/npcsh/npc_team/frederic4.png +0 -0
  16. {npcsh-1.0.30.data → npcsh-1.0.32.data}/data/npcsh/npc_team/guac.png +0 -0
  17. {npcsh-1.0.30.data → npcsh-1.0.32.data}/data/npcsh/npc_team/image_generation.jinx +0 -0
  18. {npcsh-1.0.30.data → npcsh-1.0.32.data}/data/npcsh/npc_team/internet_search.jinx +0 -0
  19. {npcsh-1.0.30.data → npcsh-1.0.32.data}/data/npcsh/npc_team/kadiefa.npc +0 -0
  20. {npcsh-1.0.30.data → npcsh-1.0.32.data}/data/npcsh/npc_team/kadiefa.png +0 -0
  21. {npcsh-1.0.30.data → npcsh-1.0.32.data}/data/npcsh/npc_team/npcsh.ctx +0 -0
  22. {npcsh-1.0.30.data → npcsh-1.0.32.data}/data/npcsh/npc_team/npcsh_sibiji.png +0 -0
  23. {npcsh-1.0.30.data → npcsh-1.0.32.data}/data/npcsh/npc_team/plonk.npc +0 -0
  24. {npcsh-1.0.30.data → npcsh-1.0.32.data}/data/npcsh/npc_team/plonk.png +0 -0
  25. {npcsh-1.0.30.data → npcsh-1.0.32.data}/data/npcsh/npc_team/plonkjr.npc +0 -0
  26. {npcsh-1.0.30.data → npcsh-1.0.32.data}/data/npcsh/npc_team/plonkjr.png +0 -0
  27. {npcsh-1.0.30.data → npcsh-1.0.32.data}/data/npcsh/npc_team/python_executor.jinx +0 -0
  28. {npcsh-1.0.30.data → npcsh-1.0.32.data}/data/npcsh/npc_team/screen_cap.jinx +0 -0
  29. {npcsh-1.0.30.data → npcsh-1.0.32.data}/data/npcsh/npc_team/sibiji.npc +0 -0
  30. {npcsh-1.0.30.data → npcsh-1.0.32.data}/data/npcsh/npc_team/sibiji.png +0 -0
  31. {npcsh-1.0.30.data → npcsh-1.0.32.data}/data/npcsh/npc_team/spool.png +0 -0
  32. {npcsh-1.0.30.data → npcsh-1.0.32.data}/data/npcsh/npc_team/yap.png +0 -0
  33. {npcsh-1.0.30.dist-info → npcsh-1.0.32.dist-info}/WHEEL +0 -0
  34. {npcsh-1.0.30.dist-info → npcsh-1.0.32.dist-info}/entry_points.txt +0 -0
  35. {npcsh-1.0.30.dist-info → npcsh-1.0.32.dist-info}/licenses/LICENSE +0 -0
  36. {npcsh-1.0.30.dist-info → npcsh-1.0.32.dist-info}/top_level.txt +0 -0
npcsh/corca.py CHANGED
@@ -7,6 +7,7 @@ from contextlib import AsyncExitStack
7
7
  from typing import Optional, Callable, Dict, Any, Tuple, List
8
8
  import shutil
9
9
  import traceback
10
+ from litellm.exceptions import Timeout, ContextWindowExceededError, RateLimitError
10
11
 
11
12
  try:
12
13
  from mcp import ClientSession, StdioServerParameters
@@ -250,6 +251,7 @@ def process_mcp_stream(stream_response, active_npc):
250
251
 
251
252
 
252
253
 
254
+
253
255
  def execute_command_corca(command: str, state: ShellState, command_history, selected_mcp_tools_names: Optional[List[str]] = None) -> Tuple[ShellState, Any]:
254
256
  mcp_tools_for_llm = []
255
257
 
@@ -270,27 +272,63 @@ def execute_command_corca(command: str, state: ShellState, command_history, sele
270
272
 
271
273
  active_npc = state.npc if isinstance(state.npc, NPC) else NPC(name="default")
272
274
 
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
-
284
- response_dict = get_llm_response(
285
- prompt=command,
286
- npc=state.npc,
287
- messages=state.messages,
288
- tools=mcp_tools_for_llm,
289
- auto_process_tool_calls=False,
290
- stream=state.stream_output,
291
- team=state.team
292
- )
293
-
275
+ if len(state.messages) > 50:
276
+ compressed_state = active_npc.compress_planning_state(state.messages)
277
+ state.messages = [{"role": "system", "content": compressed_state}]
278
+ print(compressed_state)
279
+
280
+ try:
281
+ response_dict = get_llm_response(
282
+ prompt=command,
283
+ npc=state.npc,
284
+ messages=state.messages,
285
+ tools=mcp_tools_for_llm,
286
+ auto_process_tool_calls=False,
287
+ stream=state.stream_output,
288
+ team=state.team
289
+ )
290
+ except Timeout:
291
+ response_dict = get_llm_response(
292
+ prompt=command,
293
+ npc=state.npc,
294
+ messages=state.messages,
295
+ tools=mcp_tools_for_llm,
296
+ auto_process_tool_calls=False,
297
+ stream=state.stream_output,
298
+ team=state.team
299
+ )
300
+ except ContextWindowExceededError:
301
+ compressed_state = active_npc.compress_planning_state(state.messages)
302
+ state.messages = [{"role": "system", "content": compressed_state}]
303
+
304
+ response_dict = get_llm_response(
305
+ prompt=command,
306
+ npc=state.npc,
307
+ messages=state.messages,
308
+ tools=mcp_tools_for_llm,
309
+ auto_process_tool_calls=False,
310
+ stream=state.stream_output,
311
+ team=state.team
312
+ )
313
+ except RateLimitError:
314
+ import time
315
+ print('rate limit hit... waiting 60 seconds')
316
+ time.sleep(60)
317
+ print('compressing..... ')
318
+ compressed_state = active_npc.compress_planning_state(state.messages)
319
+ state.messages = [{"role": "system", "content": compressed_state}]
320
+
321
+ response_dict = get_llm_response(
322
+ prompt=command,
323
+ npc=state.npc,
324
+ messages=state.messages,
325
+ tools=mcp_tools_for_llm,
326
+ auto_process_tool_calls=False,
327
+ stream=state.stream_output,
328
+ team=state.team
329
+ )
330
+
331
+
294
332
  stream_response = response_dict.get('response')
295
333
  messages = response_dict.get('messages', state.messages)
296
334
 
@@ -308,6 +346,8 @@ def execute_command_corca(command: str, state: ShellState, command_history, sele
308
346
  "tool_calls": tool_calls,
309
347
  "messages": state.messages
310
348
  }
349
+
350
+
311
351
  def _resolve_and_copy_mcp_server_path(
312
352
  explicit_path: Optional[str],
313
353
  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>", "eval")
151
+ compile(text, "<input>", "exec")
160
152
  return True
161
153
  except SyntaxError:
162
- try:
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()
@@ -1168,24 +1158,7 @@ def _run_agentic_mode(command: str,
1168
1158
  compressed_state = state.npc.compress_planning_state(planning_state)
1169
1159
  state.messages = [{"role": "system", "content": f"Session context: {compressed_state}"}]
1170
1160
 
1171
- existing_vars_context = "EXISTING VARIABLES IN ENVIRONMENT:\n"
1172
- for var_name, var_value in locals_dict.items():
1173
- if not var_name.startswith('_') and var_name not in ['In', 'Out', 'exit', 'quit', 'get_ipython']:
1174
- try:
1175
- var_type = type(var_value).__name__
1176
- var_repr = repr(var_value)
1177
- if len(var_repr) > 100:
1178
- var_repr = var_repr[:97] + "..."
1179
- existing_vars_context += f"- {var_name} ({var_type}): {var_repr}\n"
1180
- except:
1181
- existing_vars_context += f"- {var_name} ({type(var_value).__name__}): <unrepresentable>\n"
1182
- previous_code = ''
1183
- next_step = ''
1184
- steps = []
1185
- while iteration < max_iterations and consecutive_failures < max_consecutive_failures:
1186
- iteration += 1
1187
- print(f"\n{_get_guac_agent_emoji(consecutive_failures, max_consecutive_failures)} Agentic iteration {iteration} ")
1188
-
1161
+
1189
1162
 
1190
1163
 
1191
1164
  existing_vars_context = "EXISTING VARIABLES IN ENVIRONMENT:\n"
@@ -1489,6 +1462,7 @@ def execute_guac_command(command: str, state: ShellState, locals_dict: Dict[str,
1489
1462
 
1490
1463
  if stripped_command.startswith('/') and stripped_command not in ["/refresh", "/agent", "/chat", "/cmd"]:
1491
1464
  return execute_command(stripped_command, state, review=True, router=router)
1465
+ print(is_python_code(stripped_command))
1492
1466
  if is_python_code(stripped_command):
1493
1467
  try:
1494
1468
  state, exec_output = execute_python_code(stripped_command, state, locals_dict)
@@ -1497,6 +1471,7 @@ def execute_guac_command(command: str, state: ShellState, locals_dict: Dict[str,
1497
1471
  print("\nExecution interrupted by user")
1498
1472
  return state, "Execution interrupted"
1499
1473
  if state.current_mode == "agent":
1474
+
1500
1475
  return _run_agentic_mode(stripped_command, state, locals_dict, npc_team_dir)
1501
1476
  if state.current_mode == "cmd":
1502
1477
 
@@ -1908,38 +1883,78 @@ def enter_guac_mode(npc=None,
1908
1883
  state.command_history = command_history
1909
1884
 
1910
1885
  if npc is None and default_npc is None:
1911
- guac_npc_path = Path(npc_team_dir) / "guac.npc"
1912
- if guac_npc_path.exists():
1913
- npc = NPC(file=str(guac_npc_path),
1914
- db_conn=command_history.engine)
1915
- print(guac_npc_path, npc)
1916
-
1917
- team_ctx_path = get_team_ctx_path(str(npc_team_dir))
1918
- team_ctx = {}
1919
- if team_ctx_path and Path(team_ctx_path).exists():
1920
- with open(team_ctx_path, "r") as f:
1921
- team_ctx = yaml.safe_load(f) or {}
1922
- print(team_ctx, team_ctx_path)
1923
- team = Team(team_path=str(npc_team_dir),
1924
- forenpc=npc,
1925
- jinxs={})
1926
- team.name = team_ctx.get("team_name", "guac_global_team")
1927
- team.team_ctx = team_ctx
1928
- print(team)
1929
- if npc.model is None:
1930
- npc.model = team_ctx.get("model", state.chat_model)
1931
- if npc.provider is None:
1932
- npc.provider = team_ctx.get("provider", state.chat_provider)
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"
1933
1918
 
1934
- for npc_name, npc_obj in team.npcs.items():
1935
- if not npc_obj.model:
1936
- npc_obj.model = team_ctx.get("model", state.chat_model)
1937
- if not npc_obj.provider:
1938
- npc_obj.provider = team_ctx.get("provider", state.chat_provider)
1939
- else:
1940
- raise RuntimeError(f"No NPC loaded and {guac_npc_path} not found!")
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
1941
1954
  elif default_npc and npc is None:
1942
1955
  npc = default_npc
1956
+
1957
+
1943
1958
  state.npc = npc or default_npc
1944
1959
  state.team = team or default_team
1945
1960
 
npcsh/routes.py CHANGED
@@ -1130,18 +1130,11 @@ def yap_handler(command: str, **kwargs):
1130
1130
  @router.route("alicanto", "Conduct deep research with multiple perspectives, identifying gold insights and cliff warnings")
1131
1131
  def alicanto_handler(command: str, **kwargs):
1132
1132
  messages = safe_get(kwargs, "messages", [])
1133
-
1134
-
1135
1133
  parts = shlex.split(command)
1136
-
1137
1134
 
1138
1135
  query = ""
1139
1136
  num_npcs = safe_get(kwargs, 'num_npcs', 5)
1140
1137
  depth = safe_get(kwargs, 'depth', 3)
1141
- exploration_factor = safe_get(kwargs, 'exploration', 0.3)
1142
- creativity_factor = safe_get(kwargs, 'creativity', 0.5)
1143
- output_format = safe_get(kwargs, 'format', 'report')
1144
-
1145
1138
 
1146
1139
  i = 1
1147
1140
  while i < len(parts):
@@ -1217,17 +1210,25 @@ def alicanto_handler(command: str, **kwargs):
1217
1210
 
1218
1211
  try:
1219
1212
  logging.info(f"Starting Alicanto research on: {query}")
1213
+ model = safe_get(kwargs, 'model')
1214
+ if len(model) == 0 :
1215
+ model = NPCSH_CHAT_MODEL
1216
+ provider = safe_get(kwargs, 'provider')
1217
+ if len(provider) == 0 :
1218
+ provider = NPCSH_CHAT_PROVIDER
1219
+
1220
+
1221
+ print('model: ', model)
1222
+ print('provider: ', provider)
1223
+
1220
1224
  result = alicanto(
1221
- request=query,
1225
+ query,
1222
1226
  num_npcs=num_npcs,
1223
1227
  depth=depth,
1224
- memory=3,
1225
- context=None,
1226
- model=safe_get(kwargs, 'model', NPCSH_CHAT_MODEL),
1227
- provider=safe_get(kwargs, 'provider', NPCSH_CHAT_PROVIDER),
1228
- exploration_factor=exploration_factor,
1229
- creativity_factor=creativity_factor,
1230
- output_format=output_format
1228
+ model=model,
1229
+ provider=provider,
1230
+ max_steps = safe_get(kwargs, 'max_steps', 20),
1231
+
1231
1232
  )
1232
1233
 
1233
1234
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: npcsh
3
- Version: 1.0.30
3
+ Version: 1.0.32
4
4
  Summary: npcsh is a command-line toolkit for using AI agents in novel ways.
5
5
  Home-page: https://github.com/NPC-Worldwide/npcsh
6
6
  Author: Christopher Agostino
@@ -1,15 +1,15 @@
1
1
  npcsh/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  npcsh/_state.py,sha256=sntRSm9DKthandawaLCf-semAm_1CNx3AUh-066G248,86498
3
- npcsh/alicanto.py,sha256=S-_mFtEzE8CKWSctJawUtAKmVLgUz-loODTDtL0f6eo,41538
4
- npcsh/corca.py,sha256=XuaNVhZ1Yslx43AcdmApViUXMuWMoXncLaNT0wwiHmk,47737
5
- npcsh/guac.py,sha256=qzoylPid9PdttTZvbU4vSrG1yBNhrfIXqrmvNFAFguM,79334
3
+ npcsh/alicanto.py,sha256=ZftzxfQPQuuj9VB9V2FCTQN5NIE9Rvsg4iNiNqOUE6U,38118
4
+ npcsh/corca.py,sha256=iX_20JYYak_KKEKgG-S5buKkBc-1iZ-k2YdPr1FDG2A,49141
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
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
- npcsh/routes.py,sha256=1r9WI3fVtj_vy7ZdL_90R9DtX2UulYrqer1SQG8pJks,44213
12
+ npcsh/routes.py,sha256=ulQMLrNwOAQqfbHC1Nijr8lkn9v4efviCdkgZe9T0iY,44106
13
13
  npcsh/spool.py,sha256=oCive2dbn1o3UGUJnFMzfON6g4bOnauuzyyQBgul6RI,9839
14
14
  npcsh/wander.py,sha256=8WOX8az8BXjizXGraEvu-ZVphi6PECKZzo9alTK4gmA,21730
15
15
  npcsh/yap.py,sha256=QU-j9eg8zixXG6nyjoIYXsanJ4FjPnzhS4aJ241HLxw,18467
@@ -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.30.data/data/npcsh/npc_team/alicanto.npc,sha256=y9yDY3lq8ZwxQxpnrgle8w5IJwZqvxDepZFU4OaZCtg,148
43
- npcsh-1.0.30.data/data/npcsh/npc_team/alicanto.png,sha256=A7xeMbcoKGjlkELxJEVifCEZLVWbOKZarTN5ZFJG-FM,3519858
44
- npcsh-1.0.30.data/data/npcsh/npc_team/bash_executer.jinx,sha256=C_oQccOY8cKevMMPLRdznlMOccQvLgyzyOIThXvmrD8,692
45
- npcsh-1.0.30.data/data/npcsh/npc_team/corca.npc,sha256=HI3Bs6KlUBPMz7icF1TRE8-V3f3EdU_VxvQxEpru3L4,662
46
- npcsh-1.0.30.data/data/npcsh/npc_team/corca.png,sha256=0lF70hKu6tY-37YmIPVF2cuaPzvnQ4-UtQOzuAbKEf4,1666776
47
- npcsh-1.0.30.data/data/npcsh/npc_team/edit_file.jinx,sha256=4PaJs8g_cdeDpbQwQSBycU5RDA0rczEC_NpLfLjo74Y,3490
48
- npcsh-1.0.30.data/data/npcsh/npc_team/foreman.npc,sha256=WqB8jLfBToGmr8c1vip1KOnTHxfXlGXwDUGnZoDMQr0,327
49
- npcsh-1.0.30.data/data/npcsh/npc_team/frederic.npc,sha256=EE2dOUItp-VKuW3ZMSHffmIEO4evjPcU2W_C4P3WXbY,362
50
- npcsh-1.0.30.data/data/npcsh/npc_team/frederic4.png,sha256=ll8uoV0npnPp5HVJWv7h0xDSeuq4pqsk_gYGBHLS0VY,1590744
51
- npcsh-1.0.30.data/data/npcsh/npc_team/guac.png,sha256=MCE7eJuEJwLJEzc9FS7lL62Mm-38jQRHkxXogPfOTuw,211470
52
- npcsh-1.0.30.data/data/npcsh/npc_team/image_generation.jinx,sha256=bQxZdEm0_eqvf_OJSHw3qarp8Klp3LlBDv1_HY3COo4,1307
53
- npcsh-1.0.30.data/data/npcsh/npc_team/internet_search.jinx,sha256=s8zVxwKFUAof_VzQrwB5dpAQdeJ6hUBkbIdRsT-I5mo,1267
54
- npcsh-1.0.30.data/data/npcsh/npc_team/kadiefa.npc,sha256=Yl5a4wrfe4F2f6Ndw_ukzlVVX7NE9g_mG-3QqJSkg_o,381
55
- npcsh-1.0.30.data/data/npcsh/npc_team/kadiefa.png,sha256=3CAwL8crKIwJko6o75Z6OYYEEM9Rk--yGzCJg7zoszg,3062528
56
- npcsh-1.0.30.data/data/npcsh/npc_team/npcsh.ctx,sha256=-jKYaPm2YbZHAGgWAXhyPIwhiNe1H1ZRFg1Zc7tHSxk,1049
57
- npcsh-1.0.30.data/data/npcsh/npc_team/npcsh_sibiji.png,sha256=9fUqgYMsSHmaH-kBTBQ7N5UCS5-eLZF94Log0O3mtFg,4544
58
- npcsh-1.0.30.data/data/npcsh/npc_team/plonk.npc,sha256=u1m2a1D512XGQ2kC3eWDAY8Y2IvpkNU73DI_CPE65UE,90
59
- npcsh-1.0.30.data/data/npcsh/npc_team/plonk.png,sha256=IU5ey-Dl4HEKlwnf75RSWNSHpF8rVqGmdbsa0deL4rQ,2727773
60
- npcsh-1.0.30.data/data/npcsh/npc_team/plonkjr.npc,sha256=It-i-BEuG0XddKk0d85onk2aJr9Pe5pLnJzNaCWaQIM,87
61
- npcsh-1.0.30.data/data/npcsh/npc_team/plonkjr.png,sha256=MqLEGwsyECUeODZIti0HQQrMMVxA6XERpW01R06NbpY,2606710
62
- npcsh-1.0.30.data/data/npcsh/npc_team/python_executor.jinx,sha256=vZz3pZaj1BnPFHMs_wpyjRc0b32JR4rLhZfulCMDF1s,398
63
- npcsh-1.0.30.data/data/npcsh/npc_team/screen_cap.jinx,sha256=-4DG0EiEe61N_kMhVqqHKhLVGOLuZQT9ax6IZk20NjI,960
64
- npcsh-1.0.30.data/data/npcsh/npc_team/sibiji.npc,sha256=Hb4wXKIObKKgibwnio5hLec9yd_9bKDCA87Nm2zijFA,216
65
- npcsh-1.0.30.data/data/npcsh/npc_team/sibiji.png,sha256=1dlZb7J3E62FcVo9CVOzLb8nu1bIUV7cr97nsFocHCM,35615
66
- npcsh-1.0.30.data/data/npcsh/npc_team/spool.png,sha256=LWTLkwDxXBfLuSUCX32_lo5yAmLYGsA67Xpsz-7MmWU,2876725
67
- npcsh-1.0.30.data/data/npcsh/npc_team/yap.png,sha256=_l7UbWnXJdsy4Mx-x5l9DT0R6ize3HTnkwQQnOFlI18,1548649
68
- npcsh-1.0.30.dist-info/licenses/LICENSE,sha256=IKBvAECHP-aCiJtE4cHGCE5Yl0tozYz02PomGeWS3y4,1070
69
- npcsh-1.0.30.dist-info/METADATA,sha256=w9tSdXf-u7Z0BYYDfGAwWfzYUfFCEhBzowXbCjZtrVU,25486
70
- npcsh-1.0.30.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
71
- npcsh-1.0.30.dist-info/entry_points.txt,sha256=S5yIuGm8ZXQ4siHYgN5gs0J7bxgobSEULXf8L5HaW5o,206
72
- npcsh-1.0.30.dist-info/top_level.txt,sha256=kHSNgKMCkfjV95-DH0YSp1LLBi0HXdF3w57j7MQON3E,6
73
- npcsh-1.0.30.dist-info/RECORD,,
42
+ npcsh-1.0.32.data/data/npcsh/npc_team/alicanto.npc,sha256=y9yDY3lq8ZwxQxpnrgle8w5IJwZqvxDepZFU4OaZCtg,148
43
+ npcsh-1.0.32.data/data/npcsh/npc_team/alicanto.png,sha256=A7xeMbcoKGjlkELxJEVifCEZLVWbOKZarTN5ZFJG-FM,3519858
44
+ npcsh-1.0.32.data/data/npcsh/npc_team/bash_executer.jinx,sha256=C_oQccOY8cKevMMPLRdznlMOccQvLgyzyOIThXvmrD8,692
45
+ npcsh-1.0.32.data/data/npcsh/npc_team/corca.npc,sha256=HI3Bs6KlUBPMz7icF1TRE8-V3f3EdU_VxvQxEpru3L4,662
46
+ npcsh-1.0.32.data/data/npcsh/npc_team/corca.png,sha256=0lF70hKu6tY-37YmIPVF2cuaPzvnQ4-UtQOzuAbKEf4,1666776
47
+ npcsh-1.0.32.data/data/npcsh/npc_team/edit_file.jinx,sha256=4PaJs8g_cdeDpbQwQSBycU5RDA0rczEC_NpLfLjo74Y,3490
48
+ npcsh-1.0.32.data/data/npcsh/npc_team/foreman.npc,sha256=WqB8jLfBToGmr8c1vip1KOnTHxfXlGXwDUGnZoDMQr0,327
49
+ npcsh-1.0.32.data/data/npcsh/npc_team/frederic.npc,sha256=EE2dOUItp-VKuW3ZMSHffmIEO4evjPcU2W_C4P3WXbY,362
50
+ npcsh-1.0.32.data/data/npcsh/npc_team/frederic4.png,sha256=ll8uoV0npnPp5HVJWv7h0xDSeuq4pqsk_gYGBHLS0VY,1590744
51
+ npcsh-1.0.32.data/data/npcsh/npc_team/guac.png,sha256=MCE7eJuEJwLJEzc9FS7lL62Mm-38jQRHkxXogPfOTuw,211470
52
+ npcsh-1.0.32.data/data/npcsh/npc_team/image_generation.jinx,sha256=bQxZdEm0_eqvf_OJSHw3qarp8Klp3LlBDv1_HY3COo4,1307
53
+ npcsh-1.0.32.data/data/npcsh/npc_team/internet_search.jinx,sha256=s8zVxwKFUAof_VzQrwB5dpAQdeJ6hUBkbIdRsT-I5mo,1267
54
+ npcsh-1.0.32.data/data/npcsh/npc_team/kadiefa.npc,sha256=Yl5a4wrfe4F2f6Ndw_ukzlVVX7NE9g_mG-3QqJSkg_o,381
55
+ npcsh-1.0.32.data/data/npcsh/npc_team/kadiefa.png,sha256=3CAwL8crKIwJko6o75Z6OYYEEM9Rk--yGzCJg7zoszg,3062528
56
+ npcsh-1.0.32.data/data/npcsh/npc_team/npcsh.ctx,sha256=-jKYaPm2YbZHAGgWAXhyPIwhiNe1H1ZRFg1Zc7tHSxk,1049
57
+ npcsh-1.0.32.data/data/npcsh/npc_team/npcsh_sibiji.png,sha256=9fUqgYMsSHmaH-kBTBQ7N5UCS5-eLZF94Log0O3mtFg,4544
58
+ npcsh-1.0.32.data/data/npcsh/npc_team/plonk.npc,sha256=u1m2a1D512XGQ2kC3eWDAY8Y2IvpkNU73DI_CPE65UE,90
59
+ npcsh-1.0.32.data/data/npcsh/npc_team/plonk.png,sha256=IU5ey-Dl4HEKlwnf75RSWNSHpF8rVqGmdbsa0deL4rQ,2727773
60
+ npcsh-1.0.32.data/data/npcsh/npc_team/plonkjr.npc,sha256=It-i-BEuG0XddKk0d85onk2aJr9Pe5pLnJzNaCWaQIM,87
61
+ npcsh-1.0.32.data/data/npcsh/npc_team/plonkjr.png,sha256=MqLEGwsyECUeODZIti0HQQrMMVxA6XERpW01R06NbpY,2606710
62
+ npcsh-1.0.32.data/data/npcsh/npc_team/python_executor.jinx,sha256=vZz3pZaj1BnPFHMs_wpyjRc0b32JR4rLhZfulCMDF1s,398
63
+ npcsh-1.0.32.data/data/npcsh/npc_team/screen_cap.jinx,sha256=-4DG0EiEe61N_kMhVqqHKhLVGOLuZQT9ax6IZk20NjI,960
64
+ npcsh-1.0.32.data/data/npcsh/npc_team/sibiji.npc,sha256=Hb4wXKIObKKgibwnio5hLec9yd_9bKDCA87Nm2zijFA,216
65
+ npcsh-1.0.32.data/data/npcsh/npc_team/sibiji.png,sha256=1dlZb7J3E62FcVo9CVOzLb8nu1bIUV7cr97nsFocHCM,35615
66
+ npcsh-1.0.32.data/data/npcsh/npc_team/spool.png,sha256=LWTLkwDxXBfLuSUCX32_lo5yAmLYGsA67Xpsz-7MmWU,2876725
67
+ npcsh-1.0.32.data/data/npcsh/npc_team/yap.png,sha256=_l7UbWnXJdsy4Mx-x5l9DT0R6ize3HTnkwQQnOFlI18,1548649
68
+ npcsh-1.0.32.dist-info/licenses/LICENSE,sha256=IKBvAECHP-aCiJtE4cHGCE5Yl0tozYz02PomGeWS3y4,1070
69
+ npcsh-1.0.32.dist-info/METADATA,sha256=FmgUyMW-g9qkavXUoHlMl9juRc-b1Jka6yyDzj8kN1s,25486
70
+ npcsh-1.0.32.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
71
+ npcsh-1.0.32.dist-info/entry_points.txt,sha256=S5yIuGm8ZXQ4siHYgN5gs0J7bxgobSEULXf8L5HaW5o,206
72
+ npcsh-1.0.32.dist-info/top_level.txt,sha256=kHSNgKMCkfjV95-DH0YSp1LLBi0HXdF3w57j7MQON3E,6
73
+ npcsh-1.0.32.dist-info/RECORD,,
File without changes