npcsh 1.1.4__py3-none-any.whl → 1.1.5__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 (106) hide show
  1. npcsh/_state.py +47 -63
  2. npcsh/npc_team/corca_example.png +0 -0
  3. npcsh/npc_team/jinxs/{python_executor.jinx → code/python.jinx} +1 -1
  4. npcsh/npc_team/jinxs/{bash_executer.jinx → code/sh.jinx} +1 -1
  5. npcsh/npc_team/jinxs/code/sql.jinx +18 -0
  6. npcsh/npc_team/jinxs/modes/alicanto.jinx +88 -0
  7. npcsh/npc_team/jinxs/modes/corca.jinx +28 -0
  8. npcsh/npc_team/jinxs/modes/guac.jinx +46 -0
  9. npcsh/npc_team/jinxs/modes/plonk.jinx +57 -0
  10. npcsh/npc_team/jinxs/modes/pti.jinx +28 -0
  11. npcsh/npc_team/jinxs/modes/spool.jinx +40 -0
  12. npcsh/npc_team/jinxs/modes/wander.jinx +81 -0
  13. npcsh/npc_team/jinxs/modes/yap.jinx +25 -0
  14. npcsh/npc_team/jinxs/utils/breathe.jinx +20 -0
  15. npcsh/npc_team/jinxs/utils/core/build.jinx +65 -0
  16. npcsh/npc_team/jinxs/utils/core/compile.jinx +50 -0
  17. npcsh/npc_team/jinxs/utils/core/help.jinx +52 -0
  18. npcsh/npc_team/jinxs/utils/core/init.jinx +41 -0
  19. npcsh/npc_team/jinxs/utils/core/jinxs.jinx +32 -0
  20. npcsh/npc_team/jinxs/utils/core/set.jinx +40 -0
  21. npcsh/npc_team/jinxs/{edit_file.jinx → utils/edit_file.jinx} +1 -1
  22. npcsh/npc_team/jinxs/utils/flush.jinx +39 -0
  23. npcsh/npc_team/jinxs/utils/npc-studio.jinx +82 -0
  24. npcsh/npc_team/jinxs/utils/ots.jinx +92 -0
  25. npcsh/npc_team/jinxs/utils/plan.jinx +33 -0
  26. npcsh/npc_team/jinxs/utils/roll.jinx +66 -0
  27. npcsh/npc_team/jinxs/utils/sample.jinx +56 -0
  28. npcsh/npc_team/jinxs/utils/search/brainblast.jinx +51 -0
  29. npcsh/npc_team/jinxs/utils/search/rag.jinx +70 -0
  30. npcsh/npc_team/jinxs/utils/search/search.jinx +192 -0
  31. npcsh/npc_team/jinxs/utils/serve.jinx +29 -0
  32. npcsh/npc_team/jinxs/utils/sleep.jinx +116 -0
  33. npcsh/npc_team/jinxs/utils/trigger.jinx +36 -0
  34. npcsh/npc_team/jinxs/utils/vixynt.jinx +129 -0
  35. npcsh/npcsh.py +13 -11
  36. npcsh/routes.py +80 -1420
  37. npcsh-1.1.5.data/data/npcsh/npc_team/alicanto.jinx +88 -0
  38. npcsh-1.1.5.data/data/npcsh/npc_team/brainblast.jinx +51 -0
  39. npcsh-1.1.5.data/data/npcsh/npc_team/breathe.jinx +20 -0
  40. npcsh-1.1.5.data/data/npcsh/npc_team/build.jinx +65 -0
  41. npcsh-1.1.5.data/data/npcsh/npc_team/compile.jinx +50 -0
  42. npcsh-1.1.5.data/data/npcsh/npc_team/corca.jinx +28 -0
  43. npcsh-1.1.5.data/data/npcsh/npc_team/corca_example.png +0 -0
  44. {npcsh-1.1.4.data → npcsh-1.1.5.data}/data/npcsh/npc_team/edit_file.jinx +1 -1
  45. npcsh-1.1.5.data/data/npcsh/npc_team/flush.jinx +39 -0
  46. npcsh-1.1.5.data/data/npcsh/npc_team/guac.jinx +46 -0
  47. npcsh-1.1.5.data/data/npcsh/npc_team/help.jinx +52 -0
  48. npcsh-1.1.5.data/data/npcsh/npc_team/init.jinx +41 -0
  49. npcsh-1.1.5.data/data/npcsh/npc_team/jinxs.jinx +32 -0
  50. npcsh-1.1.5.data/data/npcsh/npc_team/npc-studio.jinx +82 -0
  51. npcsh-1.1.5.data/data/npcsh/npc_team/ots.jinx +92 -0
  52. npcsh-1.1.5.data/data/npcsh/npc_team/plan.jinx +33 -0
  53. npcsh-1.1.5.data/data/npcsh/npc_team/plonk.jinx +57 -0
  54. npcsh-1.1.5.data/data/npcsh/npc_team/pti.jinx +28 -0
  55. npcsh-1.1.4.data/data/npcsh/npc_team/python_executor.jinx → npcsh-1.1.5.data/data/npcsh/npc_team/python.jinx +1 -1
  56. npcsh-1.1.5.data/data/npcsh/npc_team/rag.jinx +70 -0
  57. npcsh-1.1.5.data/data/npcsh/npc_team/roll.jinx +66 -0
  58. npcsh-1.1.5.data/data/npcsh/npc_team/sample.jinx +56 -0
  59. npcsh-1.1.5.data/data/npcsh/npc_team/search.jinx +192 -0
  60. npcsh-1.1.5.data/data/npcsh/npc_team/serve.jinx +29 -0
  61. npcsh-1.1.5.data/data/npcsh/npc_team/set.jinx +40 -0
  62. npcsh-1.1.4.data/data/npcsh/npc_team/bash_executer.jinx → npcsh-1.1.5.data/data/npcsh/npc_team/sh.jinx +1 -1
  63. npcsh-1.1.5.data/data/npcsh/npc_team/sleep.jinx +116 -0
  64. npcsh-1.1.5.data/data/npcsh/npc_team/spool.jinx +40 -0
  65. npcsh-1.1.5.data/data/npcsh/npc_team/sql.jinx +18 -0
  66. npcsh-1.1.5.data/data/npcsh/npc_team/trigger.jinx +36 -0
  67. npcsh-1.1.5.data/data/npcsh/npc_team/vixynt.jinx +129 -0
  68. npcsh-1.1.5.data/data/npcsh/npc_team/wander.jinx +81 -0
  69. npcsh-1.1.5.data/data/npcsh/npc_team/yap.jinx +25 -0
  70. {npcsh-1.1.4.dist-info → npcsh-1.1.5.dist-info}/METADATA +1 -1
  71. npcsh-1.1.5.dist-info/RECORD +132 -0
  72. npcsh/npc_team/jinxs/image_generation.jinx +0 -29
  73. npcsh/npc_team/jinxs/internet_search.jinx +0 -31
  74. npcsh/npc_team/jinxs/screen_cap.jinx +0 -25
  75. npcsh-1.1.4.data/data/npcsh/npc_team/image_generation.jinx +0 -29
  76. npcsh-1.1.4.data/data/npcsh/npc_team/internet_search.jinx +0 -31
  77. npcsh-1.1.4.data/data/npcsh/npc_team/screen_cap.jinx +0 -25
  78. npcsh-1.1.4.dist-info/RECORD +0 -78
  79. /npcsh/npc_team/jinxs/{kg_search.jinx → utils/search/kg_search.jinx} +0 -0
  80. /npcsh/npc_team/jinxs/{memory_search.jinx → utils/search/memory_search.jinx} +0 -0
  81. {npcsh-1.1.4.data → npcsh-1.1.5.data}/data/npcsh/npc_team/alicanto.npc +0 -0
  82. {npcsh-1.1.4.data → npcsh-1.1.5.data}/data/npcsh/npc_team/alicanto.png +0 -0
  83. {npcsh-1.1.4.data → npcsh-1.1.5.data}/data/npcsh/npc_team/corca.npc +0 -0
  84. {npcsh-1.1.4.data → npcsh-1.1.5.data}/data/npcsh/npc_team/corca.png +0 -0
  85. {npcsh-1.1.4.data → npcsh-1.1.5.data}/data/npcsh/npc_team/foreman.npc +0 -0
  86. {npcsh-1.1.4.data → npcsh-1.1.5.data}/data/npcsh/npc_team/frederic.npc +0 -0
  87. {npcsh-1.1.4.data → npcsh-1.1.5.data}/data/npcsh/npc_team/frederic4.png +0 -0
  88. {npcsh-1.1.4.data → npcsh-1.1.5.data}/data/npcsh/npc_team/guac.png +0 -0
  89. {npcsh-1.1.4.data → npcsh-1.1.5.data}/data/npcsh/npc_team/kadiefa.npc +0 -0
  90. {npcsh-1.1.4.data → npcsh-1.1.5.data}/data/npcsh/npc_team/kadiefa.png +0 -0
  91. {npcsh-1.1.4.data → npcsh-1.1.5.data}/data/npcsh/npc_team/kg_search.jinx +0 -0
  92. {npcsh-1.1.4.data → npcsh-1.1.5.data}/data/npcsh/npc_team/memory_search.jinx +0 -0
  93. {npcsh-1.1.4.data → npcsh-1.1.5.data}/data/npcsh/npc_team/npcsh.ctx +0 -0
  94. {npcsh-1.1.4.data → npcsh-1.1.5.data}/data/npcsh/npc_team/npcsh_sibiji.png +0 -0
  95. {npcsh-1.1.4.data → npcsh-1.1.5.data}/data/npcsh/npc_team/plonk.npc +0 -0
  96. {npcsh-1.1.4.data → npcsh-1.1.5.data}/data/npcsh/npc_team/plonk.png +0 -0
  97. {npcsh-1.1.4.data → npcsh-1.1.5.data}/data/npcsh/npc_team/plonkjr.npc +0 -0
  98. {npcsh-1.1.4.data → npcsh-1.1.5.data}/data/npcsh/npc_team/plonkjr.png +0 -0
  99. {npcsh-1.1.4.data → npcsh-1.1.5.data}/data/npcsh/npc_team/sibiji.npc +0 -0
  100. {npcsh-1.1.4.data → npcsh-1.1.5.data}/data/npcsh/npc_team/sibiji.png +0 -0
  101. {npcsh-1.1.4.data → npcsh-1.1.5.data}/data/npcsh/npc_team/spool.png +0 -0
  102. {npcsh-1.1.4.data → npcsh-1.1.5.data}/data/npcsh/npc_team/yap.png +0 -0
  103. {npcsh-1.1.4.dist-info → npcsh-1.1.5.dist-info}/WHEEL +0 -0
  104. {npcsh-1.1.4.dist-info → npcsh-1.1.5.dist-info}/entry_points.txt +0 -0
  105. {npcsh-1.1.4.dist-info → npcsh-1.1.5.dist-info}/licenses/LICENSE +0 -0
  106. {npcsh-1.1.4.dist-info → npcsh-1.1.5.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,40 @@
1
+ jinx_name: "set"
2
+ description: "Set configuration values"
3
+ inputs:
4
+ - key: "" # The configuration key to set.
5
+ - value: "" # The value to set for the configuration key.
6
+ steps:
7
+ - name: "set_config_value"
8
+ engine: "python"
9
+ code: |
10
+ import traceback
11
+ # Assuming set_npcsh_config_value is accessible
12
+ try:
13
+ from npcsh._state import set_npcsh_config_value
14
+ except ImportError:
15
+ def set_npcsh_config_value(key, value):
16
+ print(f"Mock: Setting config '{key}' to '{value}'")
17
+ # In a real scenario, this might write to a config file or global state
18
+ pass
19
+
20
+ key = context.get('key')
21
+ value = context.get('value')
22
+ output_messages = context.get('messages', [])
23
+
24
+ output_result = ""
25
+ if not key or not value:
26
+ context['output'] = "Usage: /set <key>=<value>"
27
+ context['messages'] = output_messages
28
+ exit()
29
+
30
+ try:
31
+ set_npcsh_config_value(key, value)
32
+ output_result = f"Configuration value '{key}' set."
33
+ except NameError:
34
+ output_result = "Set function (set_npcsh_config_value) not available."
35
+ except Exception as e:
36
+ traceback.print_exc()
37
+ output_result = f"Error setting configuration '{key}': {e}"
38
+
39
+ context['output'] = output_result
40
+ context['messages'] = output_messages
@@ -1,4 +1,4 @@
1
- jinx_name: bash_executor
1
+ jinx_name: sh
2
2
  description: Execute bash queries. Should be used to grep for file contents, list directories, explore information to answer user questions more practically.
3
3
  inputs:
4
4
  - bash_command
@@ -0,0 +1,116 @@
1
+ jinx_name: "sleep"
2
+ description: "Evolve knowledge graph. Use --dream to also run creative synthesis."
3
+ inputs:
4
+ - dream: False # Boolean flag to also run creative synthesis (dream process).
5
+ - ops: "" # Comma-separated list of operations to configure KG sleep process.
6
+ - model: "" # LLM model to use for KG evolution. Defaults to NPC's model.
7
+ - provider: "" # LLM provider to use for KG evolution. Defaults to NPC's provider.
8
+ steps:
9
+ - name: "evolve_knowledge_graph"
10
+ engine: "python"
11
+ code: |
12
+ import os
13
+ import traceback
14
+ from npcpy.memory.command_history import CommandHistory, load_kg_from_db, save_kg_to_db
15
+ from npcpy.memory.knowledge_graph import kg_sleep_process, kg_dream_process
16
+ # Assuming render_markdown is available if needed for logging progress
17
+
18
+ is_dreaming = context.get('dream')
19
+ operations_str = context.get('ops')
20
+ llm_model = context.get('model')
21
+ llm_provider = context.get('provider')
22
+ output_messages = context.get('messages', [])
23
+ current_npc = context.get('npc')
24
+ current_team = context.get('team')
25
+
26
+ operations_config = None
27
+ if operations_str and isinstance(operations_str, str):
28
+ operations_config = [op.strip() for op in operations_str.split(',')]
29
+
30
+ # Fallback for model/provider if not explicitly set in Jinx inputs
31
+ if not llm_model and current_npc and current_npc.model:
32
+ llm_model = current_npc.model
33
+ if not llm_provider and current_npc and current_npc.provider:
34
+ llm_provider = current_npc.provider
35
+
36
+ # Final fallbacks (these would ideally come from npcsh._state config)
37
+ if not llm_model: llm_model = "gemini-1.5-pro" # Example default
38
+ if not llm_provider: llm_provider = "gemini" # Example default
39
+
40
+ team_name = current_team.name if current_team else "__none__"
41
+ npc_name = current_npc.name if isinstance(current_npc, type(None).__class__) else "__none__"
42
+ current_path = os.getcwd()
43
+ scope_str = f"Team: '{team_name}', NPC: '{npc_name}', Path: '{current_path}'"
44
+
45
+ # Assume render_markdown exists
46
+ # render_markdown(f"- Checking knowledge graph for scope: {scope_str}")
47
+
48
+ command_history = None
49
+ try:
50
+ db_path = os.getenv("NPCSH_DB_PATH", os.path.expanduser("~/npcsh_history.db"))
51
+ command_history = CommandHistory(db_path)
52
+ engine = command_history.engine
53
+ except Exception as e:
54
+ context['output'] = f"Error connecting to history database for KG access: {e}"
55
+ context['messages'] = output_messages
56
+ exit()
57
+
58
+ output_result = ""
59
+ try:
60
+ current_kg = load_kg_from_db(engine, team_name, npc_name, current_path)
61
+
62
+ if not current_kg or not current_kg.get('facts'):
63
+ output_msg = f"Knowledge graph for the current scope is empty. Nothing to process.\n"
64
+ output_msg += f" - Scope Checked: {scope_str}\n\n"
65
+ output_msg += "**Hint:** Have a conversation or run some commands first to build up knowledge in this specific context. The KG is unique to each combination of Team, NPC, and directory."
66
+ context['output'] = output_msg
67
+ context['messages'] = output_messages
68
+ exit()
69
+
70
+ original_facts = len(current_kg.get('facts', []))
71
+ original_concepts = len(current_kg.get('concepts', []))
72
+
73
+ process_type = "Sleep"
74
+ ops_display = f"with operations: {operations_config}" if operations_config else "with random operations"
75
+ # render_markdown(f"- Initiating sleep process {ops_display}")
76
+
77
+ evolved_kg, _ = kg_sleep_process(
78
+ existing_kg=current_kg,
79
+ model=llm_model,
80
+ provider=llm_provider,
81
+ npc=current_npc,
82
+ operations_config=operations_config
83
+ )
84
+
85
+ if is_dreaming:
86
+ process_type += " & Dream"
87
+ # render_markdown(f"- Initiating dream process on the evolved KG...")
88
+ evolved_kg, _ = kg_dream_process(
89
+ existing_kg=evolved_kg,
90
+ model=llm_model,
91
+ provider=llm_provider,
92
+ npc=current_npc
93
+ )
94
+
95
+ save_kg_to_db(engine, evolved_kg, team_name, npc_name, current_path) # Changed conn to engine
96
+
97
+ new_facts = len(evolved_kg.get('facts', []))
98
+ new_concepts = len(evolved_kg.get('concepts', []))
99
+
100
+ output_result = f"{process_type} process complete.\n"
101
+ output_result += f"- Facts: {original_facts} -> {new_facts} ({new_facts - original_facts:+})\n"
102
+ output_result += f"- Concepts: {original_concepts} -> {new_concepts} ({new_concepts - original_concepts:+})"
103
+
104
+ print('Evolved facts:', evolved_kg.get('facts'))
105
+ print('Evolved concepts:', evolved_kg.get('concepts'))
106
+
107
+ context['output'] = output_result
108
+ context['messages'] = output_messages
109
+
110
+ except Exception as e:
111
+ traceback.print_exc()
112
+ context['output'] = f"Error during KG evolution process: {e}"
113
+ context['messages'] = output_messages
114
+ finally:
115
+ if command_history: # Check if it was successfully initialized
116
+ command_history.close()
@@ -0,0 +1,40 @@
1
+ jinx_name: "spool"
2
+ description: "Enter interactive chat (spool) mode"
3
+ inputs: [] # Spool mode typically takes its parameters directly from the environment/kwargs
4
+ steps:
5
+ - name: "enter_spool"
6
+ engine: "python"
7
+ code: |
8
+ import traceback
9
+ from npcpy.npc_compiler import NPC, Team
10
+ from npcsh.spool import enter_spool_mode
11
+
12
+ output_messages = context.get('messages', [])
13
+ current_npc = context.get('npc')
14
+ current_team = context.get('team')
15
+
16
+ try:
17
+ # Handle potential string NPC name if passed from CLI
18
+ if isinstance(current_npc, str) and current_team:
19
+ npc_name = current_npc
20
+ if npc_name in current_team.npcs:
21
+ current_npc = current_team.npcs[npc_name]
22
+ else:
23
+ context['output'] = f"Error: NPC '{npc_name}' not found in team. Available NPCs: {', '.join(current_team.npcs.keys())}"
24
+ context['messages'] = output_messages
25
+ exit()
26
+ context['npc'] = current_npc # Ensure the NPC object is updated in context
27
+
28
+ result = enter_spool_mode(**context) # Pass all context as kwargs
29
+
30
+ if isinstance(result, dict):
31
+ context['output'] = result.get('output', 'Exited Spool Mode.')
32
+ context['messages'] = result.get('messages', output_messages)
33
+ else:
34
+ context['output'] = str(result)
35
+ context['messages'] = output_messages
36
+
37
+ except Exception as e:
38
+ traceback.print_exc()
39
+ context['output'] = f"Error entering spool mode: {e}"
40
+ context['messages'] = output_messages
@@ -0,0 +1,18 @@
1
+ jinx_name: sql_executor
2
+ description: Execute queries on the ~/npcsh_history.db to pull data. The database
3
+ contains only information about conversations and other user-provided data. It does
4
+ not store any information about individual files. Avoid using percent signs unless absolutely necessary. Returns a LLM summary so no post-summary is required
5
+ inputs:
6
+ - sql_query
7
+ - user_query
8
+ - interpret: true
9
+ steps:
10
+ - engine: python
11
+ code: |
12
+ import pandas as pd
13
+ query = "{{ sql_query }}"
14
+ try:
15
+ df = pd.read_sql_query(query, npc.db_conn)
16
+ except Exception as e:
17
+ df = pd.DataFrame({'Error': [str(e)]})
18
+ output = df.to_string()
@@ -0,0 +1,36 @@
1
+ jinx_name: "trigger"
2
+ description: "Execute a trigger command"
3
+ inputs:
4
+ - trigger_description: "" # Required description of the trigger to execute.
5
+ steps:
6
+ - name: "execute_trigger"
7
+ engine: "python"
8
+ code: |
9
+ import traceback
10
+ from npcpy.work.trigger import execute_trigger_command
11
+
12
+ trigger_description = context.get('trigger_description')
13
+ output_messages = context.get('messages', [])
14
+
15
+ if not trigger_description or not trigger_description.strip():
16
+ context['output'] = "Usage: /trigger <trigger_description>"
17
+ context['messages'] = output_messages
18
+ exit()
19
+
20
+ try:
21
+ # Pass all current context as kwargs to execute_trigger_command
22
+ result = execute_trigger_command(command=trigger_description, **context)
23
+
24
+ if isinstance(result, dict):
25
+ context['output'] = result.get('output', 'Trigger executed.')
26
+ context['messages'] = result.get('messages', output_messages)
27
+ else:
28
+ context['output'] = str(result)
29
+ context['messages'] = output_messages
30
+ except NameError:
31
+ context['output'] = "Trigger function (execute_trigger_command) not available."
32
+ context['messages'] = output_messages
33
+ except Exception as e:
34
+ traceback.print_exc()
35
+ context['output'] = f"Error executing trigger: {e}"
36
+ context['messages'] = output_messages
@@ -0,0 +1,129 @@
1
+ jinx_name: "vixynt"
2
+ description: "Generates images from text descriptions or edits existing ones."
3
+ inputs:
4
+ - prompt # Required, the text description for image generation or editing.
5
+ - output_file_base: "" # Optional string, e.g., './my_image', used as base for output file name.
6
+ - attachments: "" # Optional string, comma-separated image paths for editing existing images.
7
+ - n_images: 1 # Optional integer, number of images to generate.
8
+ - height: 1024 # Optional integer, height of the generated image.
9
+ - width: 1024 # Optional integer, width of the generated image.
10
+ - model: "" # Optional string, specific model to use for image generation. Defaults to NPC's model or 'runwayml/stable-diffusion-v1-5'.
11
+ - provider: "" # Optional string, specific provider for image generation. Defaults to NPC's provider or 'diffusers'.
12
+ steps:
13
+ - name: "generate_or_edit_image"
14
+ engine: "python"
15
+ code: |
16
+ import os
17
+ import base64
18
+ from io import BytesIO
19
+ from datetime import datetime
20
+ from PIL import Image
21
+ from npcpy.llm_funcs import gen_image
22
+
23
+ # Extract inputs from context (Jinx execution environment passes them here)
24
+ image_prompt = context.get('prompt', '').strip()
25
+ output_file_base = context.get('output_file_base')
26
+ attachments_str = context.get('attachments')
27
+ n_images = int(context.get('n_images', 1)) # Ensure it's an integer
28
+ height = int(context.get('height', 1024)) # Ensure it's an integer
29
+ width = int(context.get('width', 1024)) # Ensure it's an integer
30
+ model = context.get('model')
31
+ provider = context.get('provider')
32
+
33
+ input_images = []
34
+ if attachments_str and attachments_str.strip():
35
+ input_images = [p.strip() for p in attachments_str.split(',')]
36
+
37
+ # Use NPC's model/provider as fallback if not explicitly provided in jinx inputs
38
+ if not model and npc and npc.model:
39
+ model = npc.model
40
+ if not provider and npc and npc.provider:
41
+ provider = npc.provider
42
+
43
+ # Final fallbacks if still not set
44
+ if not model:
45
+ model = "runwayml/stable-diffusion-v1-5"
46
+ if not provider:
47
+ provider = "diffusers"
48
+
49
+
50
+ output_messages = context.get('messages', [])
51
+
52
+ if not image_prompt:
53
+ context['output'] = "Usage: /vixynt <prompt> [--output_file path] [--attachments path] [--n_images num]"
54
+ context['messages'] = output_messages
55
+ exit() # Exit the jinx execution early
56
+
57
+ try:
58
+ # Generate image(s) or edit
59
+ images_list = gen_image(
60
+ prompt=image_prompt,
61
+ model=model,
62
+ provider=provider,
63
+ npc=npc,
64
+ height=height,
65
+ width=width,
66
+ n_images=n_images,
67
+ input_images=input_images if input_images else None
68
+ )
69
+
70
+ saved_files = []
71
+ compressed_images = []
72
+
73
+ if not isinstance(images_list, list):
74
+ images_list = [images_list] if images_list is not None else []
75
+
76
+ for i, image in enumerate(images_list):
77
+ if image is None:
78
+ continue
79
+
80
+ # Determine output filename
81
+ if output_file_base and output_file_base.strip():
82
+ base_name, ext = os.path.splitext(os.path.expanduser(output_file_base))
83
+ if not ext: # No extension provided, default to .png
84
+ ext = ".png"
85
+ current_output_file = f"{base_name}_{i}{ext}" if len(images_list) > 1 else f"{base_name}{ext}"
86
+ else:
87
+ os.makedirs(os.path.expanduser("~/.npcsh/images/"), exist_ok=True)
88
+ current_output_file = (
89
+ os.path.expanduser("~/.npcsh/images/")
90
+ + f"image_{datetime.now().strftime('%Y%m%d_%H%M%S')}_{i}.png"
91
+ )
92
+
93
+ # Save image to file
94
+ image.save(current_output_file)
95
+ saved_files.append(current_output_file)
96
+
97
+ # Create compressed base64 image for HTML rendering
98
+ img_buffer = BytesIO()
99
+ img_copy = image.copy()
100
+ img_copy.thumbnail((800, 600), Image.Resampling.LANCZOS)
101
+ img_copy.save(img_buffer, format='PNG', optimize=True, quality=85)
102
+ img_buffer.seek(0)
103
+
104
+ img_base64 = base64.b64encode(img_buffer.getvalue()).decode('utf-8')
105
+ compressed_images.append(f"data:image/png;base64,{img_base64}")
106
+
107
+ if saved_files:
108
+ if input_images:
109
+ output = f"Image(s) edited and saved to: {', '.join(saved_files)}"
110
+ else:
111
+ output = f"Image(s) generated and saved to: {', '.join(saved_files)}"
112
+
113
+ html_images = ""
114
+ for img_b64 in compressed_images:
115
+ html_images += f'<img src="{img_b64}" style="max-width: 400px; margin: 10px;" /><br/>'
116
+
117
+ output += f"\n\nGenerated Images:\n{html_images}"
118
+ else:
119
+ output = "No images generated."
120
+
121
+ except Exception as e:
122
+ import traceback
123
+ traceback.print_exc()
124
+ output = f"Error {'editing' if input_images else 'generating'} image: {str(e)}"
125
+
126
+ context['output'] = output # Store output in context
127
+ context['messages'] = output_messages # Ensure messages are returned
128
+ context['model'] = model
129
+ context['provider'] = provider
@@ -0,0 +1,81 @@
1
+ jinx_name: "wander"
2
+ description: "Enter wander mode (experimental)"
3
+ inputs:
4
+ - problem: "" # The problem to wander about.
5
+ - environment: "" # Optional environment for wander mode.
6
+ - low_temp: 0.5 # Low temperature setting for LLM.
7
+ - high_temp: 1.9 # High temperature setting for LLM.
8
+ - interruption_likelihood: 1.0 # Likelihood of interruption.
9
+ - sample_rate: 0.4 # Sample rate.
10
+ - n_high_temp_streams: 5 # Number of high temperature streams.
11
+ - include_events: False # Whether to include events.
12
+ - num_events: 3 # Number of events to include.
13
+ steps:
14
+ - name: "enter_wander"
15
+ engine: "python"
16
+ code: |
17
+ import traceback
18
+ from npcsh.wander import enter_wander_mode
19
+
20
+ problem = context.get('problem')
21
+ environment = context.get('environment')
22
+ low_temp = float(context.get('low_temp', 0.5)) # Ensure float type
23
+ high_temp = float(context.get('high_temp', 1.9)) # Ensure float type
24
+ interruption_likelihood = float(context.get('interruption_likelihood', 1.0)) # Ensure float type
25
+ sample_rate = float(context.get('sample_rate', 0.4)) # Ensure float type
26
+ n_high_temp_streams = int(context.get('n_high_temp_streams', 5)) # Ensure int type
27
+ include_events = context.get('include_events', False) # Boolean type
28
+ num_events = int(context.get('num_events', 3)) # Ensure int type
29
+
30
+ current_npc = context.get('npc')
31
+ llm_model = context.get('model')
32
+ llm_provider = context.get('provider')
33
+ output_messages = context.get('messages', [])
34
+
35
+ if not problem or not problem.strip():
36
+ context['output'] = "Usage: /wander <problem> [key=value...]"
37
+ context['messages'] = output_messages
38
+ exit()
39
+
40
+ # Fallback for model/provider if not explicitly set in Jinx inputs
41
+ if not llm_model and current_npc and current_npc.model:
42
+ llm_model = current_npc.model
43
+ if not llm_provider and current_npc and current_npc.provider:
44
+ llm_provider = current_npc.provider
45
+
46
+ # Final fallbacks (these would ideally come from npcsh._state config)
47
+ if not llm_model: llm_model = "gemini-1.5-pro" # Example default
48
+ if not llm_provider: llm_provider = "gemini" # Example default
49
+
50
+ try:
51
+ mode_args = {
52
+ 'problem': problem,
53
+ 'npc': current_npc,
54
+ 'model': llm_model,
55
+ 'provider': llm_provider,
56
+ 'environment': environment,
57
+ 'low_temp': low_temp,
58
+ 'high_temp': high_temp,
59
+ 'interruption_likelihood': interruption_likelihood,
60
+ 'sample_rate': sample_rate,
61
+ 'n_high_temp_streams': n_high_temp_streams,
62
+ 'include_events': include_events,
63
+ 'num_events': num_events
64
+ }
65
+
66
+ result = enter_wander_mode(**mode_args)
67
+
68
+ output_result = ""
69
+ if isinstance(result, list) and result:
70
+ output_result = result[-1].get("insight", "Wander mode session complete.")
71
+ else:
72
+ output_result = str(result) if result else "Wander mode session complete."
73
+
74
+ output_messages.append({"role": "assistant", "content": output_result})
75
+ context['output'] = output_result
76
+ context['messages'] = output_messages
77
+
78
+ except Exception as e:
79
+ traceback.print_exc()
80
+ context['output'] = f"Error during wander mode: {e}"
81
+ context['messages'] = output_messages
@@ -0,0 +1,25 @@
1
+ jinx_name: "yap"
2
+ description: "Enter voice chat (yap) mode"
3
+ inputs: [] # Yap mode takes its parameters directly from the environment/kwargs
4
+ steps:
5
+ - name: "enter_yap"
6
+ engine: "python"
7
+ code: |
8
+ import traceback
9
+ from npcsh.yap import enter_yap_mode
10
+
11
+ output_messages = context.get('messages', [])
12
+
13
+ try:
14
+ result = enter_yap_mode(**context) # Pass all context as kwargs
15
+
16
+ if isinstance(result, dict):
17
+ context['output'] = result.get('output', 'Exited Yap Mode.')
18
+ context['messages'] = result.get('messages', output_messages)
19
+ else:
20
+ context['output'] = str(result)
21
+ context['messages'] = output_messages
22
+ except Exception as e:
23
+ traceback.print_exc()
24
+ context['output'] = f"Error entering yap mode: {e}"
25
+ context['messages'] = output_messages
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: npcsh
3
- Version: 1.1.4
3
+ Version: 1.1.5
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
@@ -0,0 +1,132 @@
1
+ npcsh/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ npcsh/_state.py,sha256=cwuyzgYt1Rg5HsLPuRHeuPjK73bNliAsJhCiTogn-AI,98930
3
+ npcsh/alicanto.py,sha256=QCuTtMOgjFkjfrwZZdZBhfp-ETbimlOrXJQiZhClzT0,42160
4
+ npcsh/build.py,sha256=UuId0_rQml40A4U1KuvMekRyfB30s8HiLsXFJjqrBmM,7692
5
+ npcsh/corca.py,sha256=bhEzGlmnq_-VXksuQm6yEdDBgd_-x5WKlt27hw7YVcQ,60698
6
+ npcsh/guac.py,sha256=sVdLYVkzkQw6TE7crtLUX0QJZFkzQthWZTe1p7IfAQE,80412
7
+ npcsh/mcp_helpers.py,sha256=9TsCfcquGu_vX4WaKlY3J3P13-uxruQKrXng-jJ5YyY,11176
8
+ npcsh/mcp_server.py,sha256=Lfpabnwi_xu0UudJxQ_YNyyCn2f0_JjzorhWmIeclwY,8777
9
+ npcsh/npc.py,sha256=yqgqZDLwqniIbbDu-vaJf31fWVbOrtgNnFXfjDBk-D8,9853
10
+ npcsh/npcsh.py,sha256=T6iE_tAV_yWYkxFB1Z0qhYrQxrE-eyh1RmaIQA-3xDQ,9383
11
+ npcsh/plonk.py,sha256=IfOuiE5FBvk-EIsrWFjGy0SrNywDpn4a49E7seBtEmY,14246
12
+ npcsh/pti.py,sha256=UciiiH2Kz4ERQFy0-FX6BQEU2VxYQEUril-_Cvj76Y0,7853
13
+ npcsh/routes.py,sha256=97gMh_mk2Ec1ge1BApCdIX7L8_jT5XElylOSONyVPxY,4229
14
+ npcsh/spool.py,sha256=oCive2dbn1o3UGUJnFMzfON6g4bOnauuzyyQBgul6RI,9839
15
+ npcsh/wander.py,sha256=8WOX8az8BXjizXGraEvu-ZVphi6PECKZzo9alTK4gmA,21730
16
+ npcsh/yap.py,sha256=QU-j9eg8zixXG6nyjoIYXsanJ4FjPnzhS4aJ241HLxw,18467
17
+ npcsh/npc_team/alicanto.npc,sha256=y9yDY3lq8ZwxQxpnrgle8w5IJwZqvxDepZFU4OaZCtg,148
18
+ npcsh/npc_team/alicanto.png,sha256=A7xeMbcoKGjlkELxJEVifCEZLVWbOKZarTN5ZFJG-FM,3519858
19
+ npcsh/npc_team/corca.npc,sha256=NtZW1mQ_AMOHlfMCfl8A3uA00UMuHuO95FzRg6kUixo,631
20
+ npcsh/npc_team/corca.png,sha256=0lF70hKu6tY-37YmIPVF2cuaPzvnQ4-UtQOzuAbKEf4,1666776
21
+ npcsh/npc_team/corca_example.png,sha256=p0lVTuwaps4-F-3k4wgp9d897YPyn6FGZugtXMUQjj8,28777
22
+ npcsh/npc_team/foreman.npc,sha256=WqB8jLfBToGmr8c1vip1KOnTHxfXlGXwDUGnZoDMQr0,327
23
+ npcsh/npc_team/frederic.npc,sha256=EE2dOUItp-VKuW3ZMSHffmIEO4evjPcU2W_C4P3WXbY,362
24
+ npcsh/npc_team/frederic4.png,sha256=ll8uoV0npnPp5HVJWv7h0xDSeuq4pqsk_gYGBHLS0VY,1590744
25
+ npcsh/npc_team/guac.png,sha256=MCE7eJuEJwLJEzc9FS7lL62Mm-38jQRHkxXogPfOTuw,211470
26
+ npcsh/npc_team/kadiefa.npc,sha256=Yl5a4wrfe4F2f6Ndw_ukzlVVX7NE9g_mG-3QqJSkg_o,381
27
+ npcsh/npc_team/kadiefa.png,sha256=3CAwL8crKIwJko6o75Z6OYYEEM9Rk--yGzCJg7zoszg,3062528
28
+ npcsh/npc_team/npcsh.ctx,sha256=-jKYaPm2YbZHAGgWAXhyPIwhiNe1H1ZRFg1Zc7tHSxk,1049
29
+ npcsh/npc_team/npcsh_sibiji.png,sha256=9fUqgYMsSHmaH-kBTBQ7N5UCS5-eLZF94Log0O3mtFg,4544
30
+ npcsh/npc_team/plonk.npc,sha256=u1m2a1D512XGQ2kC3eWDAY8Y2IvpkNU73DI_CPE65UE,90
31
+ npcsh/npc_team/plonk.png,sha256=IU5ey-Dl4HEKlwnf75RSWNSHpF8rVqGmdbsa0deL4rQ,2727773
32
+ npcsh/npc_team/plonkjr.npc,sha256=It-i-BEuG0XddKk0d85onk2aJr9Pe5pLnJzNaCWaQIM,87
33
+ npcsh/npc_team/plonkjr.png,sha256=MqLEGwsyECUeODZIti0HQQrMMVxA6XERpW01R06NbpY,2606710
34
+ npcsh/npc_team/sibiji.npc,sha256=Hb4wXKIObKKgibwnio5hLec9yd_9bKDCA87Nm2zijFA,216
35
+ npcsh/npc_team/sibiji.png,sha256=1dlZb7J3E62FcVo9CVOzLb8nu1bIUV7cr97nsFocHCM,35615
36
+ npcsh/npc_team/spool.png,sha256=LWTLkwDxXBfLuSUCX32_lo5yAmLYGsA67Xpsz-7MmWU,2876725
37
+ npcsh/npc_team/yap.png,sha256=_l7UbWnXJdsy4Mx-x5l9DT0R6ize3HTnkwQQnOFlI18,1548649
38
+ npcsh/npc_team/jinxs/code/python.jinx,sha256=lFJubdPVlGxSuUKCxsxjYG4_dnX2ATn8U9ChYKRmL5Q,389
39
+ npcsh/npc_team/jinxs/code/sh.jinx,sha256=r-pS_B51PxND7SFdZIGDLr2Ln6kA3FOqv4Vv1KYBThY,681
40
+ npcsh/npc_team/jinxs/code/sql.jinx,sha256=FHbyGb9WHwzx0CbZis7oJxFMYy8fvOaFtb2kLXj_gCM,666
41
+ npcsh/npc_team/jinxs/modes/alicanto.jinx,sha256=MknpYUX0eIvi5vG9gkoTkJvF_LcFbAp_hQ0qkYEBr3c,4014
42
+ npcsh/npc_team/jinxs/modes/corca.jinx,sha256=OFzxSHoBJ2Yoc34mtTpd9B_CtGdqbpgcCN3Qt39YJeA,1028
43
+ npcsh/npc_team/jinxs/modes/guac.jinx,sha256=UIVXw8c-m-lh10bxL2yl2n94TQ_SjZSwLP3sLFGv0k4,1616
44
+ npcsh/npc_team/jinxs/modes/plonk.jinx,sha256=3f5MvkYBFh5Z3iDhs5vFxPT6acgw7OZLqVA-Mxtm_vc,2559
45
+ npcsh/npc_team/jinxs/modes/pti.jinx,sha256=Yw32GQS9LvYkukEfjq6R1GLAL6fWACYBz9JuVecZJEo,1126
46
+ npcsh/npc_team/jinxs/modes/spool.jinx,sha256=A4upAI4LnXxYUjY0Rz1_kAhRCDpz08XWPTgisiH06A4,1664
47
+ npcsh/npc_team/jinxs/modes/wander.jinx,sha256=Svc6zjmoXr4BbDg5SN4DB1Byhh75AmIeAItcJCBIlcc,3513
48
+ npcsh/npc_team/jinxs/modes/yap.jinx,sha256=eaI665zjaLH2FUwHoO3iC1Uzo9bGA-a1UMtBRBTEHC0,898
49
+ npcsh/npc_team/jinxs/utils/breathe.jinx,sha256=WDw13P3Q0M03HdZu-vqhbOhefLjaMZ5oUcct_W4kUsY,739
50
+ npcsh/npc_team/jinxs/utils/edit_file.jinx,sha256=jExsHctvapG2xlze6E7ZR3oSLS9hJTYKKd41dQwgOLw,3488
51
+ npcsh/npc_team/jinxs/utils/flush.jinx,sha256=ngzFu4-dnKkqqL0QM9iX9XBxyWOmQdVcJTFb1GhajVo,1422
52
+ npcsh/npc_team/jinxs/utils/npc-studio.jinx,sha256=eWXtvQfRG8CFOG0Ut_Sqh0h1Tlm4-a1qKVO1G5vmMAY,2744
53
+ npcsh/npc_team/jinxs/utils/ots.jinx,sha256=5zUaD5b1J1LiU2YmH2HjVjCOxpDUNfZ-PQZiaWENdFw,4111
54
+ npcsh/npc_team/jinxs/utils/plan.jinx,sha256=hCIG9nGI56C1SeGuGAUcR3XnJ25kHaDnUn1VCv8vszY,1234
55
+ npcsh/npc_team/jinxs/utils/roll.jinx,sha256=FHoqXXqFgucaW7UJW_14DcRcRlVPBgFeaPJPoATx5BY,2882
56
+ npcsh/npc_team/jinxs/utils/sample.jinx,sha256=7cWwfAZFgWxaTkIL1gpFFryQ3mjvVjoWYAov-zOFn_E,2237
57
+ npcsh/npc_team/jinxs/utils/serve.jinx,sha256=qly_3MThU3TRyJI2grHlhYOqEY1VT-XxubPIuWdZrpU,1056
58
+ npcsh/npc_team/jinxs/utils/sleep.jinx,sha256=c-7Dn4aLuX7WyBVcvuk3sqcbIutqKIz1N9sBfPNzhck,5301
59
+ npcsh/npc_team/jinxs/utils/trigger.jinx,sha256=rS913e2qJzNBC0wmmecgzN3f4v8o1os8AZQOPjnW8ho,1456
60
+ npcsh/npc_team/jinxs/utils/vixynt.jinx,sha256=ekdKXMQWafAGXgqs83OLNrfrlvXRT1RiaazNCFkumtw,5609
61
+ npcsh/npc_team/jinxs/utils/core/build.jinx,sha256=QrShGspHwP1z073334vhUIIJZ_3pMJWN_DX_DPPVslU,2771
62
+ npcsh/npc_team/jinxs/utils/core/compile.jinx,sha256=Rjdm5jf3ech1E3cnpLz-o2tbJuVvEoQGAp0FQRAU7qo,2526
63
+ npcsh/npc_team/jinxs/utils/core/help.jinx,sha256=OquhUEgcYZp-gu5Wgl3pOZnswxGQ96RoNG08tHjC9-4,2091
64
+ npcsh/npc_team/jinxs/utils/core/init.jinx,sha256=QBb1uOTvMlD-x3S7zPASH5TBZRwNhMQvK6t3DdC2mVw,1596
65
+ npcsh/npc_team/jinxs/utils/core/jinxs.jinx,sha256=rF432zHrVeccbGKm5tHxd_bZ7OQk355xB6LTlEIXiuI,1269
66
+ npcsh/npc_team/jinxs/utils/core/set.jinx,sha256=hQY_0muEtnWtfXsdK9cPwSvIevCimiJJn1-yhGC_VxM,1381
67
+ npcsh/npc_team/jinxs/utils/search/brainblast.jinx,sha256=VvGbl6V5OdPHE8CFWLUXy78iEpHyBJbXogMY_l4Otgg,2279
68
+ npcsh/npc_team/jinxs/utils/search/kg_search.jinx,sha256=zZiXLWtu9MwLn_HDEGmYfYF3ntfqbVqjM6IjhHyu634,1250
69
+ npcsh/npc_team/jinxs/utils/search/memory_search.jinx,sha256=KoHA-FvZ325UQiBNnvnKboz2uIy4i1J6q55frybWPEM,1040
70
+ npcsh/npc_team/jinxs/utils/search/rag.jinx,sha256=hKnjDo6pvtyfqGOcxQGZqfLPOWh0f-NoUzE61nX_bA4,3276
71
+ npcsh/npc_team/jinxs/utils/search/search.jinx,sha256=bh53tVgsvP5mONF5e6X2vj40qRo4iA8NB1jUkwIBn8I,8687
72
+ npcsh-1.1.5.data/data/npcsh/npc_team/alicanto.jinx,sha256=MknpYUX0eIvi5vG9gkoTkJvF_LcFbAp_hQ0qkYEBr3c,4014
73
+ npcsh-1.1.5.data/data/npcsh/npc_team/alicanto.npc,sha256=y9yDY3lq8ZwxQxpnrgle8w5IJwZqvxDepZFU4OaZCtg,148
74
+ npcsh-1.1.5.data/data/npcsh/npc_team/alicanto.png,sha256=A7xeMbcoKGjlkELxJEVifCEZLVWbOKZarTN5ZFJG-FM,3519858
75
+ npcsh-1.1.5.data/data/npcsh/npc_team/brainblast.jinx,sha256=VvGbl6V5OdPHE8CFWLUXy78iEpHyBJbXogMY_l4Otgg,2279
76
+ npcsh-1.1.5.data/data/npcsh/npc_team/breathe.jinx,sha256=WDw13P3Q0M03HdZu-vqhbOhefLjaMZ5oUcct_W4kUsY,739
77
+ npcsh-1.1.5.data/data/npcsh/npc_team/build.jinx,sha256=QrShGspHwP1z073334vhUIIJZ_3pMJWN_DX_DPPVslU,2771
78
+ npcsh-1.1.5.data/data/npcsh/npc_team/compile.jinx,sha256=Rjdm5jf3ech1E3cnpLz-o2tbJuVvEoQGAp0FQRAU7qo,2526
79
+ npcsh-1.1.5.data/data/npcsh/npc_team/corca.jinx,sha256=OFzxSHoBJ2Yoc34mtTpd9B_CtGdqbpgcCN3Qt39YJeA,1028
80
+ npcsh-1.1.5.data/data/npcsh/npc_team/corca.npc,sha256=NtZW1mQ_AMOHlfMCfl8A3uA00UMuHuO95FzRg6kUixo,631
81
+ npcsh-1.1.5.data/data/npcsh/npc_team/corca.png,sha256=0lF70hKu6tY-37YmIPVF2cuaPzvnQ4-UtQOzuAbKEf4,1666776
82
+ npcsh-1.1.5.data/data/npcsh/npc_team/corca_example.png,sha256=p0lVTuwaps4-F-3k4wgp9d897YPyn6FGZugtXMUQjj8,28777
83
+ npcsh-1.1.5.data/data/npcsh/npc_team/edit_file.jinx,sha256=jExsHctvapG2xlze6E7ZR3oSLS9hJTYKKd41dQwgOLw,3488
84
+ npcsh-1.1.5.data/data/npcsh/npc_team/flush.jinx,sha256=ngzFu4-dnKkqqL0QM9iX9XBxyWOmQdVcJTFb1GhajVo,1422
85
+ npcsh-1.1.5.data/data/npcsh/npc_team/foreman.npc,sha256=WqB8jLfBToGmr8c1vip1KOnTHxfXlGXwDUGnZoDMQr0,327
86
+ npcsh-1.1.5.data/data/npcsh/npc_team/frederic.npc,sha256=EE2dOUItp-VKuW3ZMSHffmIEO4evjPcU2W_C4P3WXbY,362
87
+ npcsh-1.1.5.data/data/npcsh/npc_team/frederic4.png,sha256=ll8uoV0npnPp5HVJWv7h0xDSeuq4pqsk_gYGBHLS0VY,1590744
88
+ npcsh-1.1.5.data/data/npcsh/npc_team/guac.jinx,sha256=UIVXw8c-m-lh10bxL2yl2n94TQ_SjZSwLP3sLFGv0k4,1616
89
+ npcsh-1.1.5.data/data/npcsh/npc_team/guac.png,sha256=MCE7eJuEJwLJEzc9FS7lL62Mm-38jQRHkxXogPfOTuw,211470
90
+ npcsh-1.1.5.data/data/npcsh/npc_team/help.jinx,sha256=OquhUEgcYZp-gu5Wgl3pOZnswxGQ96RoNG08tHjC9-4,2091
91
+ npcsh-1.1.5.data/data/npcsh/npc_team/init.jinx,sha256=QBb1uOTvMlD-x3S7zPASH5TBZRwNhMQvK6t3DdC2mVw,1596
92
+ npcsh-1.1.5.data/data/npcsh/npc_team/jinxs.jinx,sha256=rF432zHrVeccbGKm5tHxd_bZ7OQk355xB6LTlEIXiuI,1269
93
+ npcsh-1.1.5.data/data/npcsh/npc_team/kadiefa.npc,sha256=Yl5a4wrfe4F2f6Ndw_ukzlVVX7NE9g_mG-3QqJSkg_o,381
94
+ npcsh-1.1.5.data/data/npcsh/npc_team/kadiefa.png,sha256=3CAwL8crKIwJko6o75Z6OYYEEM9Rk--yGzCJg7zoszg,3062528
95
+ npcsh-1.1.5.data/data/npcsh/npc_team/kg_search.jinx,sha256=zZiXLWtu9MwLn_HDEGmYfYF3ntfqbVqjM6IjhHyu634,1250
96
+ npcsh-1.1.5.data/data/npcsh/npc_team/memory_search.jinx,sha256=KoHA-FvZ325UQiBNnvnKboz2uIy4i1J6q55frybWPEM,1040
97
+ npcsh-1.1.5.data/data/npcsh/npc_team/npc-studio.jinx,sha256=eWXtvQfRG8CFOG0Ut_Sqh0h1Tlm4-a1qKVO1G5vmMAY,2744
98
+ npcsh-1.1.5.data/data/npcsh/npc_team/npcsh.ctx,sha256=-jKYaPm2YbZHAGgWAXhyPIwhiNe1H1ZRFg1Zc7tHSxk,1049
99
+ npcsh-1.1.5.data/data/npcsh/npc_team/npcsh_sibiji.png,sha256=9fUqgYMsSHmaH-kBTBQ7N5UCS5-eLZF94Log0O3mtFg,4544
100
+ npcsh-1.1.5.data/data/npcsh/npc_team/ots.jinx,sha256=5zUaD5b1J1LiU2YmH2HjVjCOxpDUNfZ-PQZiaWENdFw,4111
101
+ npcsh-1.1.5.data/data/npcsh/npc_team/plan.jinx,sha256=hCIG9nGI56C1SeGuGAUcR3XnJ25kHaDnUn1VCv8vszY,1234
102
+ npcsh-1.1.5.data/data/npcsh/npc_team/plonk.jinx,sha256=3f5MvkYBFh5Z3iDhs5vFxPT6acgw7OZLqVA-Mxtm_vc,2559
103
+ npcsh-1.1.5.data/data/npcsh/npc_team/plonk.npc,sha256=u1m2a1D512XGQ2kC3eWDAY8Y2IvpkNU73DI_CPE65UE,90
104
+ npcsh-1.1.5.data/data/npcsh/npc_team/plonk.png,sha256=IU5ey-Dl4HEKlwnf75RSWNSHpF8rVqGmdbsa0deL4rQ,2727773
105
+ npcsh-1.1.5.data/data/npcsh/npc_team/plonkjr.npc,sha256=It-i-BEuG0XddKk0d85onk2aJr9Pe5pLnJzNaCWaQIM,87
106
+ npcsh-1.1.5.data/data/npcsh/npc_team/plonkjr.png,sha256=MqLEGwsyECUeODZIti0HQQrMMVxA6XERpW01R06NbpY,2606710
107
+ npcsh-1.1.5.data/data/npcsh/npc_team/pti.jinx,sha256=Yw32GQS9LvYkukEfjq6R1GLAL6fWACYBz9JuVecZJEo,1126
108
+ npcsh-1.1.5.data/data/npcsh/npc_team/python.jinx,sha256=lFJubdPVlGxSuUKCxsxjYG4_dnX2ATn8U9ChYKRmL5Q,389
109
+ npcsh-1.1.5.data/data/npcsh/npc_team/rag.jinx,sha256=hKnjDo6pvtyfqGOcxQGZqfLPOWh0f-NoUzE61nX_bA4,3276
110
+ npcsh-1.1.5.data/data/npcsh/npc_team/roll.jinx,sha256=FHoqXXqFgucaW7UJW_14DcRcRlVPBgFeaPJPoATx5BY,2882
111
+ npcsh-1.1.5.data/data/npcsh/npc_team/sample.jinx,sha256=7cWwfAZFgWxaTkIL1gpFFryQ3mjvVjoWYAov-zOFn_E,2237
112
+ npcsh-1.1.5.data/data/npcsh/npc_team/search.jinx,sha256=bh53tVgsvP5mONF5e6X2vj40qRo4iA8NB1jUkwIBn8I,8687
113
+ npcsh-1.1.5.data/data/npcsh/npc_team/serve.jinx,sha256=qly_3MThU3TRyJI2grHlhYOqEY1VT-XxubPIuWdZrpU,1056
114
+ npcsh-1.1.5.data/data/npcsh/npc_team/set.jinx,sha256=hQY_0muEtnWtfXsdK9cPwSvIevCimiJJn1-yhGC_VxM,1381
115
+ npcsh-1.1.5.data/data/npcsh/npc_team/sh.jinx,sha256=r-pS_B51PxND7SFdZIGDLr2Ln6kA3FOqv4Vv1KYBThY,681
116
+ npcsh-1.1.5.data/data/npcsh/npc_team/sibiji.npc,sha256=Hb4wXKIObKKgibwnio5hLec9yd_9bKDCA87Nm2zijFA,216
117
+ npcsh-1.1.5.data/data/npcsh/npc_team/sibiji.png,sha256=1dlZb7J3E62FcVo9CVOzLb8nu1bIUV7cr97nsFocHCM,35615
118
+ npcsh-1.1.5.data/data/npcsh/npc_team/sleep.jinx,sha256=c-7Dn4aLuX7WyBVcvuk3sqcbIutqKIz1N9sBfPNzhck,5301
119
+ npcsh-1.1.5.data/data/npcsh/npc_team/spool.jinx,sha256=A4upAI4LnXxYUjY0Rz1_kAhRCDpz08XWPTgisiH06A4,1664
120
+ npcsh-1.1.5.data/data/npcsh/npc_team/spool.png,sha256=LWTLkwDxXBfLuSUCX32_lo5yAmLYGsA67Xpsz-7MmWU,2876725
121
+ npcsh-1.1.5.data/data/npcsh/npc_team/sql.jinx,sha256=FHbyGb9WHwzx0CbZis7oJxFMYy8fvOaFtb2kLXj_gCM,666
122
+ npcsh-1.1.5.data/data/npcsh/npc_team/trigger.jinx,sha256=rS913e2qJzNBC0wmmecgzN3f4v8o1os8AZQOPjnW8ho,1456
123
+ npcsh-1.1.5.data/data/npcsh/npc_team/vixynt.jinx,sha256=ekdKXMQWafAGXgqs83OLNrfrlvXRT1RiaazNCFkumtw,5609
124
+ npcsh-1.1.5.data/data/npcsh/npc_team/wander.jinx,sha256=Svc6zjmoXr4BbDg5SN4DB1Byhh75AmIeAItcJCBIlcc,3513
125
+ npcsh-1.1.5.data/data/npcsh/npc_team/yap.jinx,sha256=eaI665zjaLH2FUwHoO3iC1Uzo9bGA-a1UMtBRBTEHC0,898
126
+ npcsh-1.1.5.data/data/npcsh/npc_team/yap.png,sha256=_l7UbWnXJdsy4Mx-x5l9DT0R6ize3HTnkwQQnOFlI18,1548649
127
+ npcsh-1.1.5.dist-info/licenses/LICENSE,sha256=IKBvAECHP-aCiJtE4cHGCE5Yl0tozYz02PomGeWS3y4,1070
128
+ npcsh-1.1.5.dist-info/METADATA,sha256=j6DiStTuCDO45E5KuL5uGeMLg5kz_kjNXKZivVvBGdk,25841
129
+ npcsh-1.1.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
130
+ npcsh-1.1.5.dist-info/entry_points.txt,sha256=S5yIuGm8ZXQ4siHYgN5gs0J7bxgobSEULXf8L5HaW5o,206
131
+ npcsh-1.1.5.dist-info/top_level.txt,sha256=kHSNgKMCkfjV95-DH0YSp1LLBi0HXdF3w57j7MQON3E,6
132
+ npcsh-1.1.5.dist-info/RECORD,,