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.
Files changed (36) hide show
  1. npcsh/_state.py +1 -1
  2. npcsh/corca.py +20 -7
  3. npcsh/guac.py +90 -46
  4. npcsh/npcsh.py +15 -22
  5. {npcsh-1.0.29.dist-info → npcsh-1.0.31.dist-info}/METADATA +1 -1
  6. {npcsh-1.0.29.dist-info → npcsh-1.0.31.dist-info}/RECORD +36 -36
  7. {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/alicanto.npc +0 -0
  8. {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/alicanto.png +0 -0
  9. {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/bash_executer.jinx +0 -0
  10. {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/corca.npc +0 -0
  11. {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/corca.png +0 -0
  12. {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/edit_file.jinx +0 -0
  13. {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/foreman.npc +0 -0
  14. {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/frederic.npc +0 -0
  15. {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/frederic4.png +0 -0
  16. {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/guac.png +0 -0
  17. {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/image_generation.jinx +0 -0
  18. {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/internet_search.jinx +0 -0
  19. {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/kadiefa.npc +0 -0
  20. {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/kadiefa.png +0 -0
  21. {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/npcsh.ctx +0 -0
  22. {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/npcsh_sibiji.png +0 -0
  23. {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/plonk.npc +0 -0
  24. {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/plonk.png +0 -0
  25. {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/plonkjr.npc +0 -0
  26. {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/plonkjr.png +0 -0
  27. {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/python_executor.jinx +0 -0
  28. {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/screen_cap.jinx +0 -0
  29. {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/sibiji.npc +0 -0
  30. {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/sibiji.png +0 -0
  31. {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/spool.png +0 -0
  32. {npcsh-1.0.29.data → npcsh-1.0.31.data}/data/npcsh/npc_team/yap.png +0 -0
  33. {npcsh-1.0.29.dist-info → npcsh-1.0.31.dist-info}/WHEEL +0 -0
  34. {npcsh-1.0.29.dist-info → npcsh-1.0.31.dist-info}/entry_points.txt +0 -0
  35. {npcsh-1.0.29.dist-info → npcsh-1.0.31.dist-info}/licenses/LICENSE +0 -0
  36. {npcsh-1.0.29.dist-info → npcsh-1.0.31.dist-info}/top_level.txt +0 -0
npcsh/_state.py CHANGED
@@ -2018,7 +2018,7 @@ def process_pipeline_command(
2018
2018
  stdin_input: Optional[str],
2019
2019
  state: ShellState,
2020
2020
  stream_final: bool,
2021
- review = True,
2021
+ review = False,
2022
2022
  router = None,
2023
2023
  ) -> Tuple[ShellState, Any]:
2024
2024
  '''
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[J')
242
+ sys.stdout.write('\033[0J')
243
243
  sys.stdout.flush()
244
244
 
245
- # Use the render_markdown function for proper markdown rendering
246
- render_markdown(collected_content)
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>", "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()
@@ -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
- guac_npc_path = Path(npc_team_dir) / "guac.npc"
1883
- if guac_npc_path.exists():
1884
- npc = NPC(file=str(guac_npc_path),
1885
- db_conn=command_history.engine)
1886
- print(guac_npc_path, npc)
1887
-
1888
- team_ctx_path = get_team_ctx_path(str(npc_team_dir))
1889
- team_ctx = {}
1890
- if team_ctx_path and Path(team_ctx_path).exists():
1891
- with open(team_ctx_path, "r") as f:
1892
- team_ctx = yaml.safe_load(f) or {}
1893
- print(team_ctx, team_ctx_path)
1894
- team = Team(team_path=str(npc_team_dir),
1895
- forenpc=npc,
1896
- jinxs={})
1897
- team.name = team_ctx.get("team_name", "guac_global_team")
1898
- team.team_ctx = team_ctx
1899
- print(team)
1900
- if npc.model is None:
1901
- npc.model = team_ctx.get("model", state.chat_model)
1902
- if npc.provider is None:
1903
- 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"
1904
1918
 
1905
- for npc_name, npc_obj in team.npcs.items():
1906
- if not npc_obj.model:
1907
- npc_obj.model = team_ctx.get("model", state.chat_model)
1908
- if not npc_obj.provider:
1909
- npc_obj.provider = team_ctx.get("provider", state.chat_provider)
1910
- else:
1911
- 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
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 # Re-raise if it's not the expected case
219
+ raise
220
+
228
221
 
229
222
  def main() -> None:
230
223
  parser = argparse.ArgumentParser(description="npcsh - An NPC-powered shell.")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: npcsh
3
- Version: 1.0.29
3
+ Version: 1.0.31
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,12 +1,12 @@
1
1
  npcsh/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- npcsh/_state.py,sha256=BhznGcGnnw2umYIUfFnRJ6l9YXuVJRWMxiR_rjlNFDM,86497
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=_ADCwD-i5rrUc9BEzjeqd5MHKlx_qZ6M0SZQArvKtAI,47386
5
- npcsh/guac.py,sha256=ecSW6jnVxIt2IlQbJtWQPUC0D_OIT5Ih8ZQsCw6XSjQ,77872
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=l-ohFpW1TWbfztcyCebPSbDUZ6c9IGUFZAaj1TWuZuA,8443
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.29.data/data/npcsh/npc_team/alicanto.npc,sha256=y9yDY3lq8ZwxQxpnrgle8w5IJwZqvxDepZFU4OaZCtg,148
43
- npcsh-1.0.29.data/data/npcsh/npc_team/alicanto.png,sha256=A7xeMbcoKGjlkELxJEVifCEZLVWbOKZarTN5ZFJG-FM,3519858
44
- npcsh-1.0.29.data/data/npcsh/npc_team/bash_executer.jinx,sha256=C_oQccOY8cKevMMPLRdznlMOccQvLgyzyOIThXvmrD8,692
45
- npcsh-1.0.29.data/data/npcsh/npc_team/corca.npc,sha256=HI3Bs6KlUBPMz7icF1TRE8-V3f3EdU_VxvQxEpru3L4,662
46
- npcsh-1.0.29.data/data/npcsh/npc_team/corca.png,sha256=0lF70hKu6tY-37YmIPVF2cuaPzvnQ4-UtQOzuAbKEf4,1666776
47
- npcsh-1.0.29.data/data/npcsh/npc_team/edit_file.jinx,sha256=4PaJs8g_cdeDpbQwQSBycU5RDA0rczEC_NpLfLjo74Y,3490
48
- npcsh-1.0.29.data/data/npcsh/npc_team/foreman.npc,sha256=WqB8jLfBToGmr8c1vip1KOnTHxfXlGXwDUGnZoDMQr0,327
49
- npcsh-1.0.29.data/data/npcsh/npc_team/frederic.npc,sha256=EE2dOUItp-VKuW3ZMSHffmIEO4evjPcU2W_C4P3WXbY,362
50
- npcsh-1.0.29.data/data/npcsh/npc_team/frederic4.png,sha256=ll8uoV0npnPp5HVJWv7h0xDSeuq4pqsk_gYGBHLS0VY,1590744
51
- npcsh-1.0.29.data/data/npcsh/npc_team/guac.png,sha256=MCE7eJuEJwLJEzc9FS7lL62Mm-38jQRHkxXogPfOTuw,211470
52
- npcsh-1.0.29.data/data/npcsh/npc_team/image_generation.jinx,sha256=bQxZdEm0_eqvf_OJSHw3qarp8Klp3LlBDv1_HY3COo4,1307
53
- npcsh-1.0.29.data/data/npcsh/npc_team/internet_search.jinx,sha256=s8zVxwKFUAof_VzQrwB5dpAQdeJ6hUBkbIdRsT-I5mo,1267
54
- npcsh-1.0.29.data/data/npcsh/npc_team/kadiefa.npc,sha256=Yl5a4wrfe4F2f6Ndw_ukzlVVX7NE9g_mG-3QqJSkg_o,381
55
- npcsh-1.0.29.data/data/npcsh/npc_team/kadiefa.png,sha256=3CAwL8crKIwJko6o75Z6OYYEEM9Rk--yGzCJg7zoszg,3062528
56
- npcsh-1.0.29.data/data/npcsh/npc_team/npcsh.ctx,sha256=-jKYaPm2YbZHAGgWAXhyPIwhiNe1H1ZRFg1Zc7tHSxk,1049
57
- npcsh-1.0.29.data/data/npcsh/npc_team/npcsh_sibiji.png,sha256=9fUqgYMsSHmaH-kBTBQ7N5UCS5-eLZF94Log0O3mtFg,4544
58
- npcsh-1.0.29.data/data/npcsh/npc_team/plonk.npc,sha256=u1m2a1D512XGQ2kC3eWDAY8Y2IvpkNU73DI_CPE65UE,90
59
- npcsh-1.0.29.data/data/npcsh/npc_team/plonk.png,sha256=IU5ey-Dl4HEKlwnf75RSWNSHpF8rVqGmdbsa0deL4rQ,2727773
60
- npcsh-1.0.29.data/data/npcsh/npc_team/plonkjr.npc,sha256=It-i-BEuG0XddKk0d85onk2aJr9Pe5pLnJzNaCWaQIM,87
61
- npcsh-1.0.29.data/data/npcsh/npc_team/plonkjr.png,sha256=MqLEGwsyECUeODZIti0HQQrMMVxA6XERpW01R06NbpY,2606710
62
- npcsh-1.0.29.data/data/npcsh/npc_team/python_executor.jinx,sha256=vZz3pZaj1BnPFHMs_wpyjRc0b32JR4rLhZfulCMDF1s,398
63
- npcsh-1.0.29.data/data/npcsh/npc_team/screen_cap.jinx,sha256=-4DG0EiEe61N_kMhVqqHKhLVGOLuZQT9ax6IZk20NjI,960
64
- npcsh-1.0.29.data/data/npcsh/npc_team/sibiji.npc,sha256=Hb4wXKIObKKgibwnio5hLec9yd_9bKDCA87Nm2zijFA,216
65
- npcsh-1.0.29.data/data/npcsh/npc_team/sibiji.png,sha256=1dlZb7J3E62FcVo9CVOzLb8nu1bIUV7cr97nsFocHCM,35615
66
- npcsh-1.0.29.data/data/npcsh/npc_team/spool.png,sha256=LWTLkwDxXBfLuSUCX32_lo5yAmLYGsA67Xpsz-7MmWU,2876725
67
- npcsh-1.0.29.data/data/npcsh/npc_team/yap.png,sha256=_l7UbWnXJdsy4Mx-x5l9DT0R6ize3HTnkwQQnOFlI18,1548649
68
- npcsh-1.0.29.dist-info/licenses/LICENSE,sha256=IKBvAECHP-aCiJtE4cHGCE5Yl0tozYz02PomGeWS3y4,1070
69
- npcsh-1.0.29.dist-info/METADATA,sha256=VoQaYnxqr13X9UCS-s3UceRUm1o3FuP2vDsGkA8AKqA,25486
70
- npcsh-1.0.29.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
71
- npcsh-1.0.29.dist-info/entry_points.txt,sha256=S5yIuGm8ZXQ4siHYgN5gs0J7bxgobSEULXf8L5HaW5o,206
72
- npcsh-1.0.29.dist-info/top_level.txt,sha256=kHSNgKMCkfjV95-DH0YSp1LLBi0HXdF3w57j7MQON3E,6
73
- npcsh-1.0.29.dist-info/RECORD,,
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