npcsh 1.1.6__py3-none-any.whl → 1.1.8__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 +46 -18
- npcsh/corca.py +97 -38
- npcsh/npc_team/jinxs/modes/corca.jinx +18 -18
- npcsh/npc_team/jinxs/modes/plonk.jinx +0 -4
- npcsh/npc_team/jinxs/utils/ots.jinx +2 -2
- npcsh/npc_team/jinxs/utils/roll.jinx +6 -4
- npcsh/npc_team/jinxs/utils/search.jinx +1 -1
- npcsh/npcsh.py +18 -17
- npcsh-1.1.8.data/data/npcsh/npc_team/corca.jinx +28 -0
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/ots.jinx +2 -2
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/plonk.jinx +0 -4
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/roll.jinx +6 -4
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/search.jinx +1 -1
- {npcsh-1.1.6.dist-info → npcsh-1.1.8.dist-info}/METADATA +52 -24
- {npcsh-1.1.6.dist-info → npcsh-1.1.8.dist-info}/RECORD +65 -65
- npcsh-1.1.6.data/data/npcsh/npc_team/corca.jinx +0 -28
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/alicanto.jinx +0 -0
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/alicanto.npc +0 -0
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/alicanto.png +0 -0
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/breathe.jinx +0 -0
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/build.jinx +0 -0
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/compile.jinx +0 -0
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/corca.npc +0 -0
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/corca.png +0 -0
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/corca_example.png +0 -0
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/edit_file.jinx +0 -0
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/flush.jinx +0 -0
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/foreman.npc +0 -0
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/frederic.npc +0 -0
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/frederic4.png +0 -0
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/guac.jinx +0 -0
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/guac.png +0 -0
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/help.jinx +0 -0
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/init.jinx +0 -0
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/jinxs.jinx +0 -0
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/kadiefa.npc +0 -0
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/kadiefa.png +0 -0
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/npc-studio.jinx +0 -0
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/npcsh.ctx +0 -0
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/npcsh_sibiji.png +0 -0
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/plan.jinx +0 -0
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/plonk.npc +0 -0
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/plonk.png +0 -0
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/plonkjr.npc +0 -0
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/plonkjr.png +0 -0
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/pti.jinx +0 -0
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/python.jinx +0 -0
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/sample.jinx +0 -0
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/serve.jinx +0 -0
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/set.jinx +0 -0
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/sh.jinx +0 -0
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/sibiji.npc +0 -0
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/sibiji.png +0 -0
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/sleep.jinx +0 -0
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/spool.jinx +0 -0
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/spool.png +0 -0
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/sql.jinx +0 -0
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/trigger.jinx +0 -0
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/vixynt.jinx +0 -0
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/wander.jinx +0 -0
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/yap.jinx +0 -0
- {npcsh-1.1.6.data → npcsh-1.1.8.data}/data/npcsh/npc_team/yap.png +0 -0
- {npcsh-1.1.6.dist-info → npcsh-1.1.8.dist-info}/WHEEL +0 -0
- {npcsh-1.1.6.dist-info → npcsh-1.1.8.dist-info}/entry_points.txt +0 -0
- {npcsh-1.1.6.dist-info → npcsh-1.1.8.dist-info}/licenses/LICENSE +0 -0
- {npcsh-1.1.6.dist-info → npcsh-1.1.8.dist-info}/top_level.txt +0 -0
npcsh/_state.py
CHANGED
|
@@ -317,7 +317,6 @@ def get_npc_path(npc_name: str, db_path: str) -> str:
|
|
|
317
317
|
|
|
318
318
|
raise ValueError(f"NPC file not found: {npc_name}")
|
|
319
319
|
|
|
320
|
-
|
|
321
320
|
def initialize_base_npcs_if_needed(db_path: str) -> None:
|
|
322
321
|
"""
|
|
323
322
|
Function Description:
|
|
@@ -337,7 +336,7 @@ def initialize_base_npcs_if_needed(db_path: str) -> None:
|
|
|
337
336
|
conn = sqlite3.connect(db_path)
|
|
338
337
|
cursor = conn.cursor()
|
|
339
338
|
|
|
340
|
-
|
|
339
|
+
# Create table
|
|
341
340
|
cursor.execute(
|
|
342
341
|
"""
|
|
343
342
|
CREATE TABLE IF NOT EXISTS compiled_npcs (
|
|
@@ -348,7 +347,7 @@ def initialize_base_npcs_if_needed(db_path: str) -> None:
|
|
|
348
347
|
"""
|
|
349
348
|
)
|
|
350
349
|
|
|
351
|
-
|
|
350
|
+
# Package directories
|
|
352
351
|
package_dir = os.path.dirname(__file__)
|
|
353
352
|
package_npc_team_dir = os.path.join(package_dir, "npc_team")
|
|
354
353
|
|
|
@@ -360,6 +359,7 @@ def initialize_base_npcs_if_needed(db_path: str) -> None:
|
|
|
360
359
|
os.makedirs(user_jinxs_dir, exist_ok=True)
|
|
361
360
|
os.makedirs(user_templates_dir, exist_ok=True)
|
|
362
361
|
|
|
362
|
+
# Copy .npc and .ctx files
|
|
363
363
|
for filename in os.listdir(package_npc_team_dir):
|
|
364
364
|
if filename.endswith(".npc"):
|
|
365
365
|
source_path = os.path.join(package_npc_team_dir, filename)
|
|
@@ -378,19 +378,33 @@ def initialize_base_npcs_if_needed(db_path: str) -> None:
|
|
|
378
378
|
shutil.copy2(source_path, destination_path)
|
|
379
379
|
print(f"Copied ctx {filename} to {destination_path}")
|
|
380
380
|
|
|
381
|
-
|
|
381
|
+
# Copy jinxs directory RECURSIVELY
|
|
382
382
|
package_jinxs_dir = os.path.join(package_npc_team_dir, "jinxs")
|
|
383
383
|
if os.path.exists(package_jinxs_dir):
|
|
384
|
-
for
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
384
|
+
for root, dirs, files in os.walk(package_jinxs_dir):
|
|
385
|
+
# Calculate relative path from package_jinxs_dir
|
|
386
|
+
rel_path = os.path.relpath(root, package_jinxs_dir)
|
|
387
|
+
|
|
388
|
+
# Create corresponding directory in user jinxs
|
|
389
|
+
if rel_path == '.':
|
|
390
|
+
dest_dir = user_jinxs_dir
|
|
391
|
+
else:
|
|
392
|
+
dest_dir = os.path.join(user_jinxs_dir, rel_path)
|
|
393
|
+
os.makedirs(dest_dir, exist_ok=True)
|
|
394
|
+
|
|
395
|
+
# Copy all .jinx files in this directory
|
|
396
|
+
for filename in files:
|
|
397
|
+
if filename.endswith(".jinx"):
|
|
398
|
+
source_jinx_path = os.path.join(root, filename)
|
|
399
|
+
destination_jinx_path = os.path.join(dest_dir, filename)
|
|
400
|
+
|
|
401
|
+
if not os.path.exists(destination_jinx_path) or file_has_changed(
|
|
402
|
+
source_jinx_path, destination_jinx_path
|
|
403
|
+
):
|
|
404
|
+
shutil.copy2(source_jinx_path, destination_jinx_path)
|
|
405
|
+
print(f"Copied jinx {os.path.join(rel_path, filename)} to {destination_jinx_path}")
|
|
393
406
|
|
|
407
|
+
# Copy templates directory
|
|
394
408
|
templates = os.path.join(package_npc_team_dir, "templates")
|
|
395
409
|
if os.path.exists(templates):
|
|
396
410
|
for folder in os.listdir(templates):
|
|
@@ -414,6 +428,7 @@ def initialize_base_npcs_if_needed(db_path: str) -> None:
|
|
|
414
428
|
set_npcsh_initialized()
|
|
415
429
|
add_npcshrc_to_shell_config()
|
|
416
430
|
|
|
431
|
+
|
|
417
432
|
def get_shell_config_file() -> str:
|
|
418
433
|
"""
|
|
419
434
|
|
|
@@ -2563,7 +2578,6 @@ def execute_command(
|
|
|
2563
2578
|
state.messages = response['messages']
|
|
2564
2579
|
return state, response['response']
|
|
2565
2580
|
|
|
2566
|
-
|
|
2567
2581
|
def setup_shell() -> Tuple[CommandHistory, Team, Optional[NPC]]:
|
|
2568
2582
|
setup_npcsh_config()
|
|
2569
2583
|
|
|
@@ -2586,9 +2600,13 @@ def setup_shell() -> Tuple[CommandHistory, Team, Optional[NPC]]:
|
|
|
2586
2600
|
|
|
2587
2601
|
project_team_path = os.path.abspath(PROJECT_NPC_TEAM_PATH)
|
|
2588
2602
|
global_team_path = os.path.expanduser(DEFAULT_NPC_TEAM_PATH)
|
|
2603
|
+
|
|
2589
2604
|
team_dir = None
|
|
2590
2605
|
default_forenpc_name = None
|
|
2591
|
-
|
|
2606
|
+
global_team_path = os.path.expanduser(DEFAULT_NPC_TEAM_PATH)
|
|
2607
|
+
if not os.path.exists(global_team_path):
|
|
2608
|
+
print(f"Global NPC team directory doesn't exist. Initializing...")
|
|
2609
|
+
initialize_base_npcs_if_needed(db_path)
|
|
2592
2610
|
if os.path.exists(project_team_path):
|
|
2593
2611
|
team_dir = project_team_path
|
|
2594
2612
|
default_forenpc_name = "forenpc"
|
|
@@ -2635,9 +2653,17 @@ def setup_shell() -> Tuple[CommandHistory, Team, Optional[NPC]]:
|
|
|
2635
2653
|
pass
|
|
2636
2654
|
team_dir = global_team_path
|
|
2637
2655
|
default_forenpc_name = "sibiji"
|
|
2638
|
-
|
|
2656
|
+
else:
|
|
2639
2657
|
team_dir = global_team_path
|
|
2640
|
-
default_forenpc_name = "sibiji"
|
|
2658
|
+
default_forenpc_name = "sibiji"
|
|
2659
|
+
|
|
2660
|
+
if team_dir is None:
|
|
2661
|
+
team_dir = global_team_path
|
|
2662
|
+
default_forenpc_name = "sibiji"
|
|
2663
|
+
|
|
2664
|
+
if not os.path.exists(team_dir):
|
|
2665
|
+
print(f"Creating team directory: {team_dir}")
|
|
2666
|
+
os.makedirs(team_dir, exist_ok=True)
|
|
2641
2667
|
|
|
2642
2668
|
team_ctx = {}
|
|
2643
2669
|
team_ctx_path = get_team_ctx_path(team_dir)
|
|
@@ -2647,7 +2673,10 @@ def setup_shell() -> Tuple[CommandHistory, Team, Optional[NPC]]:
|
|
|
2647
2673
|
team_ctx = yaml.safe_load(f) or {}
|
|
2648
2674
|
except Exception as e:
|
|
2649
2675
|
print(f"Warning: Could not load context file {os.path.basename(team_ctx_path)}: {e}")
|
|
2676
|
+
|
|
2650
2677
|
forenpc_name = team_ctx.get("forenpc", default_forenpc_name)
|
|
2678
|
+
if forenpc_name is None:
|
|
2679
|
+
forenpc_name = "sibiji"
|
|
2651
2680
|
|
|
2652
2681
|
print('forenpc_name:', forenpc_name)
|
|
2653
2682
|
|
|
@@ -2684,7 +2713,6 @@ def setup_shell() -> Tuple[CommandHistory, Team, Optional[NPC]]:
|
|
|
2684
2713
|
team.name = "npcsh"
|
|
2685
2714
|
|
|
2686
2715
|
return command_history, team, forenpc_obj
|
|
2687
|
-
|
|
2688
2716
|
def initialize_router_with_jinxs(team, router):
|
|
2689
2717
|
"""Load global and team Jinxs into router"""
|
|
2690
2718
|
global_jinxs_dir = os.path.expanduser("~/.npcsh/npc_team/jinxs")
|
npcsh/corca.py
CHANGED
|
@@ -1235,68 +1235,98 @@ def create_corca_state_and_mcp_client(conversation_id,
|
|
|
1235
1235
|
|
|
1236
1236
|
return state
|
|
1237
1237
|
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
state: ShellState =
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
parser = argparse.ArgumentParser(prog="/corca", description="Enter Corca MCP-powered mode.")
|
|
1248
|
-
parser.add_argument("--mcp-server-path", type=str, help="Path to an MCP server script.")
|
|
1249
|
-
parser.add_argument("-g", "--global", dest="force_global", action="store_true", help="Force use of global MCP server.")
|
|
1238
|
+
def corca_session(
|
|
1239
|
+
command_history: CommandHistory,
|
|
1240
|
+
state: Optional[ShellState] = None,
|
|
1241
|
+
mcp_server_path: Optional[str] = None,
|
|
1242
|
+
force_global: bool = False,
|
|
1243
|
+
initial_command: Optional[str] = None
|
|
1244
|
+
) -> Dict[str, Any]:
|
|
1245
|
+
"""
|
|
1246
|
+
Clean programmatic entry to Corca mode.
|
|
1250
1247
|
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1248
|
+
Args:
|
|
1249
|
+
command_history: CommandHistory instance
|
|
1250
|
+
state: Optional existing ShellState, will create if None
|
|
1251
|
+
mcp_server_path: Optional explicit path to MCP server
|
|
1252
|
+
force_global: Force use of global MCP server
|
|
1253
|
+
initial_command: Optional command to execute before entering loop
|
|
1254
|
+
|
|
1255
|
+
Returns:
|
|
1256
|
+
Dict with 'output' and 'messages' keys
|
|
1257
|
+
"""
|
|
1258
|
+
# Setup state if not provided
|
|
1259
|
+
if state is None:
|
|
1260
|
+
_, team, default_npc = setup_shell()
|
|
1261
|
+
|
|
1262
|
+
# Load corca.npc if available
|
|
1263
|
+
project_corca_path = os.path.join('./npc_team/', "corca.npc")
|
|
1264
|
+
global_corca_path = os.path.expanduser('~/.npcsh/npc_team/corca.npc')
|
|
1265
|
+
|
|
1266
|
+
if os.path.exists(project_corca_path):
|
|
1267
|
+
default_npc = NPC(file=project_corca_path, db_conn=command_history.engine)
|
|
1268
|
+
elif os.path.exists(global_corca_path):
|
|
1269
|
+
default_npc = NPC(file=global_corca_path, db_conn=command_history.engine)
|
|
1270
|
+
|
|
1271
|
+
# Set defaults
|
|
1272
|
+
if default_npc.model is None:
|
|
1273
|
+
default_npc.model = team.model or NPCSH_CHAT_MODEL
|
|
1274
|
+
if default_npc.provider is None:
|
|
1275
|
+
default_npc.provider = team.provider or NPCSH_CHAT_PROVIDER
|
|
1276
|
+
|
|
1277
|
+
from npcsh._state import initial_state
|
|
1278
|
+
state = initial_state
|
|
1279
|
+
state.team = team
|
|
1280
|
+
state.npc = default_npc
|
|
1281
|
+
state.command_history = command_history
|
|
1255
1282
|
|
|
1256
1283
|
print_corca_welcome_message()
|
|
1257
1284
|
|
|
1285
|
+
# Resolve MCP server path
|
|
1258
1286
|
auto_copy_bypass = os.getenv("NPCSH_CORCA_AUTO_COPY_MCP_SERVER", "false").lower() == "true"
|
|
1259
|
-
|
|
1287
|
+
|
|
1260
1288
|
resolved_server_path = _resolve_and_copy_mcp_server_path(
|
|
1261
|
-
explicit_path=
|
|
1289
|
+
explicit_path=mcp_server_path,
|
|
1262
1290
|
current_path=state.current_path,
|
|
1263
1291
|
team_ctx_mcp_servers=state.team.team_ctx.get('mcp_servers', []) if state.team and hasattr(state.team, 'team_ctx') else None,
|
|
1264
1292
|
interactive=True,
|
|
1265
1293
|
auto_copy_bypass=auto_copy_bypass,
|
|
1266
|
-
force_global=
|
|
1294
|
+
force_global=force_global
|
|
1267
1295
|
)
|
|
1268
1296
|
|
|
1269
|
-
|
|
1297
|
+
# Connect to MCP server
|
|
1270
1298
|
if resolved_server_path:
|
|
1271
1299
|
try:
|
|
1272
1300
|
mcp_client = MCPClientNPC()
|
|
1273
1301
|
if mcp_client.connect_sync(resolved_server_path):
|
|
1274
1302
|
state.mcp_client = mcp_client
|
|
1275
1303
|
else:
|
|
1276
|
-
cprint(f"Failed to connect to MCP server
|
|
1304
|
+
cprint(f"Failed to connect to MCP server. Limited functionality.", "yellow")
|
|
1277
1305
|
state.mcp_client = None
|
|
1278
1306
|
except Exception as e:
|
|
1279
|
-
cprint(f"Error connecting to MCP server: {e}
|
|
1307
|
+
cprint(f"Error connecting to MCP server: {e}", "red")
|
|
1280
1308
|
traceback.print_exc()
|
|
1281
1309
|
state.mcp_client = None
|
|
1282
1310
|
else:
|
|
1283
|
-
cprint("No MCP server path
|
|
1311
|
+
cprint("No MCP server path found. Limited functionality.", "yellow")
|
|
1284
1312
|
state.mcp_client = None
|
|
1285
1313
|
|
|
1314
|
+
# Execute initial command if provided
|
|
1315
|
+
if initial_command:
|
|
1316
|
+
try:
|
|
1317
|
+
state, output = execute_command_corca(initial_command, state, command_history)
|
|
1318
|
+
if not (isinstance(output, dict) and output.get('interrupted')):
|
|
1319
|
+
process_corca_result(initial_command, state, output, command_history)
|
|
1320
|
+
except Exception as e:
|
|
1321
|
+
print(colored(f'Error executing initial command: {e}', "red"))
|
|
1322
|
+
|
|
1323
|
+
# Main loop
|
|
1286
1324
|
while True:
|
|
1287
1325
|
try:
|
|
1288
|
-
prompt_npc_name = "npc"
|
|
1289
|
-
if state.npc:
|
|
1290
|
-
prompt_npc_name = state.npc.name
|
|
1291
|
-
|
|
1326
|
+
prompt_npc_name = state.npc.name if state.npc else "npc"
|
|
1292
1327
|
prompt_str = f"{colored(os.path.basename(state.current_path), 'blue')}:{prompt_npc_name}🦌> "
|
|
1293
1328
|
prompt = readline_safe_prompt(prompt_str)
|
|
1294
|
-
|
|
1295
|
-
if remaining_args:
|
|
1296
|
-
user_input = " ".join(remaining_args)
|
|
1297
|
-
remaining_args = []
|
|
1298
|
-
else:
|
|
1299
|
-
user_input = get_multiline_input(prompt).strip()
|
|
1329
|
+
user_input = get_multiline_input(prompt).strip()
|
|
1300
1330
|
|
|
1301
1331
|
if user_input.lower() in ["exit", "quit", "done"]:
|
|
1302
1332
|
break
|
|
@@ -1311,11 +1341,7 @@ def enter_corca_mode(command: str, **kwargs):
|
|
|
1311
1341
|
print(colored("\n⚠️ Command interrupted. MCP session maintained.", "yellow"))
|
|
1312
1342
|
continue
|
|
1313
1343
|
|
|
1314
|
-
process_corca_result(user_input,
|
|
1315
|
-
state,
|
|
1316
|
-
output,
|
|
1317
|
-
command_history,
|
|
1318
|
-
)
|
|
1344
|
+
process_corca_result(user_input, state, output, command_history)
|
|
1319
1345
|
except KeyboardInterrupt:
|
|
1320
1346
|
print(colored("\n⚠️ Interrupted. Type 'exit' to quit Corca mode.", "yellow"))
|
|
1321
1347
|
continue
|
|
@@ -1330,12 +1356,45 @@ def enter_corca_mode(command: str, **kwargs):
|
|
|
1330
1356
|
print("\nExiting Corca Mode.")
|
|
1331
1357
|
break
|
|
1332
1358
|
|
|
1359
|
+
# Cleanup
|
|
1333
1360
|
if state.mcp_client:
|
|
1334
1361
|
state.mcp_client.disconnect_sync()
|
|
1335
1362
|
state.mcp_client = None
|
|
1336
1363
|
|
|
1337
1364
|
render_markdown("\n# Exiting Corca Mode")
|
|
1338
1365
|
return {"output": "", "messages": state.messages}
|
|
1366
|
+
def enter_corca_mode(command: str, **kwargs):
|
|
1367
|
+
"""Legacy wrapper for command-line entry"""
|
|
1368
|
+
state: ShellState = kwargs.get('shell_state')
|
|
1369
|
+
command_history: CommandHistory = kwargs.get('command_history')
|
|
1370
|
+
|
|
1371
|
+
if not state or not command_history:
|
|
1372
|
+
return {"output": "Error: Corca mode requires shell state and history.", "messages": kwargs.get('messages', [])}
|
|
1373
|
+
|
|
1374
|
+
# Parse command arguments
|
|
1375
|
+
all_command_parts = shlex.split(command)
|
|
1376
|
+
parser = argparse.ArgumentParser(prog="/corca", description="Enter Corca MCP-powered mode.")
|
|
1377
|
+
parser.add_argument("--mcp-server-path", type=str, help="Path to an MCP server script.")
|
|
1378
|
+
parser.add_argument("-g", "--global", dest="force_global", action="store_true", help="Force use of global MCP server.")
|
|
1379
|
+
|
|
1380
|
+
try:
|
|
1381
|
+
known_args, remaining_args = parser.parse_known_args(all_command_parts[1:])
|
|
1382
|
+
except SystemExit:
|
|
1383
|
+
return {"output": "Invalid arguments for /corca. See /help corca.", "messages": state.messages}
|
|
1384
|
+
|
|
1385
|
+
# Get initial command from remaining args
|
|
1386
|
+
initial_command = " ".join(remaining_args) if remaining_args else None
|
|
1387
|
+
|
|
1388
|
+
# Call the clean entry point
|
|
1389
|
+
return corca_session(
|
|
1390
|
+
command_history=command_history,
|
|
1391
|
+
state=state,
|
|
1392
|
+
mcp_server_path=known_args.mcp_server_path,
|
|
1393
|
+
force_global=known_args.force_global,
|
|
1394
|
+
initial_command=initial_command
|
|
1395
|
+
)
|
|
1396
|
+
|
|
1397
|
+
|
|
1339
1398
|
def main():
|
|
1340
1399
|
parser = argparse.ArgumentParser(description="Corca - An MCP-powered npcsh shell.")
|
|
1341
1400
|
parser.add_argument("--mcp-server-path", type=str, help="Path to an MCP server script to connect to.")
|
|
@@ -1,28 +1,28 @@
|
|
|
1
1
|
jinx_name: "corca"
|
|
2
|
-
description: "Enter the Corca MCP-powered agentic shell
|
|
2
|
+
description: "Enter the Corca MCP-powered agentic shell"
|
|
3
3
|
inputs:
|
|
4
|
-
-
|
|
4
|
+
- mcp_server_path: '~/.npcsh/npc_team/mcp_server.py'
|
|
5
|
+
- force_global: false
|
|
6
|
+
- initial_command: null
|
|
5
7
|
steps:
|
|
6
8
|
- name: "enter_corca"
|
|
7
9
|
engine: "python"
|
|
8
10
|
code: |
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
from npcsh._state import initial_state, setup_shell
|
|
12
|
-
from npcsh.corca import enter_corca_mode
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
full_command_str = context.get('command')
|
|
16
|
-
output_messages = context.get('messages', [])
|
|
11
|
+
from npcsh._state import setup_shell
|
|
12
|
+
from npcsh.corca import corca_session
|
|
17
13
|
|
|
18
|
-
|
|
14
|
+
mcp_server_path = context.get('mcp_server_path')
|
|
15
|
+
force_global = context.get('force_global', False)
|
|
16
|
+
initial_command = context.get('initial_command')
|
|
19
17
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
18
|
+
command_history, _, _ = setup_shell()
|
|
19
|
+
|
|
20
|
+
result = corca_session(
|
|
21
|
+
command_history=command_history,
|
|
22
|
+
mcp_server_path=mcp_server_path,
|
|
23
|
+
force_global=force_global,
|
|
24
|
+
initial_command=initial_command
|
|
25
25
|
)
|
|
26
26
|
|
|
27
|
-
context['output'] = result.get('output', '
|
|
28
|
-
context['messages'] = result.get('messages',
|
|
27
|
+
context['output'] = result.get('output', 'Exited Corca mode.')
|
|
28
|
+
context['messages'] = result.get('messages', [])
|
|
@@ -30,10 +30,6 @@ steps:
|
|
|
30
30
|
if not vision_provider and current_npc and current_npc.provider:
|
|
31
31
|
vision_provider = current_npc.provider
|
|
32
32
|
|
|
33
|
-
# Final fallbacks (these would ideally come from npcsh._state config)
|
|
34
|
-
if not vision_model: vision_model = "gemini-1.5-pro-vision" # Example default
|
|
35
|
-
if not vision_provider: vision_provider = "gemini" # Example default
|
|
36
|
-
|
|
37
33
|
try:
|
|
38
34
|
summary_data = execute_plonk_command(
|
|
39
35
|
request=task_description,
|
|
@@ -38,10 +38,10 @@ steps:
|
|
|
38
38
|
print(f"📸 Screenshot captured: {screenshot_info.get('filename', os.path.basename(screenshot_info['file_path']))}")
|
|
39
39
|
|
|
40
40
|
if not vision_model:
|
|
41
|
-
vision_model = getattr(current_npc, 'model', '
|
|
41
|
+
vision_model = getattr(current_npc, 'model', 'gemma3:4b')
|
|
42
42
|
|
|
43
43
|
if not vision_provider:
|
|
44
|
-
vision_provider = getattr(current_npc, 'provider', '
|
|
44
|
+
vision_provider = getattr(current_npc, 'provider', 'ollama')
|
|
45
45
|
|
|
46
46
|
response_data = get_llm_response(
|
|
47
47
|
prompt=user_prompt,
|
|
@@ -2,12 +2,12 @@ jinx_name: "roll"
|
|
|
2
2
|
description: "Generate a video from a text prompt."
|
|
3
3
|
inputs:
|
|
4
4
|
- prompt: "" # Required text prompt for video generation.
|
|
5
|
+
- vgmodel: "" # Video generation model to use. Defaults to NPCSH_VIDEO_GEN_MODEL or NPC's model.
|
|
6
|
+
- vgprovider: "" # Video generation provider to use. Defaults to NPCSH_VIDEO_GEN_PROVIDER or NPC's provider.
|
|
5
7
|
- num_frames: 125 # Number of frames for the video.
|
|
6
8
|
- width: 256 # Width of the video.
|
|
7
9
|
- height: 256 # Height of the video.
|
|
8
10
|
- output_path: "output.mp4" # Output file path for the video.
|
|
9
|
-
- vgmodel: "" # Video generation model to use. Defaults to NPCSH_VIDEO_GEN_MODEL or NPC's model.
|
|
10
|
-
- vgprovider: "" # Video generation provider to use. Defaults to NPCSH_VIDEO_GEN_PROVIDER or NPC's provider.
|
|
11
11
|
steps:
|
|
12
12
|
- name: "generate_video"
|
|
13
13
|
engine: "python"
|
|
@@ -38,8 +38,10 @@ steps:
|
|
|
38
38
|
video_gen_provider = current_npc.provider
|
|
39
39
|
|
|
40
40
|
# Final fallbacks (these would ideally come from npcsh._state config)
|
|
41
|
-
if not video_gen_model:
|
|
42
|
-
|
|
41
|
+
if not video_gen_model:
|
|
42
|
+
video_gen_model = "stable-video-diffusion" # Example default
|
|
43
|
+
if not video_gen_provider:
|
|
44
|
+
video_gen_provider = "diffusers" # Example default
|
|
43
45
|
|
|
44
46
|
try:
|
|
45
47
|
result = gen_video(
|
|
@@ -9,6 +9,7 @@ description: >
|
|
|
9
9
|
/search --brainblast <query> (Advanced history search)
|
|
10
10
|
inputs:
|
|
11
11
|
- query: ""
|
|
12
|
+
- sprovider: ""
|
|
12
13
|
- memory: false
|
|
13
14
|
- kg: false
|
|
14
15
|
- rag: false
|
|
@@ -16,7 +17,6 @@ inputs:
|
|
|
16
17
|
- file_paths: ""
|
|
17
18
|
- history_db_path: "~/npcsh_history.db"
|
|
18
19
|
- vector_db_path: "~/npcsh_chroma.db"
|
|
19
|
-
- sprovider: ""
|
|
20
20
|
- emodel: ""
|
|
21
21
|
- eprovider: ""
|
|
22
22
|
steps:
|
npcsh/npcsh.py
CHANGED
|
@@ -140,23 +140,24 @@ def run_repl(command_history: CommandHistory, initial_state: ShellState, router)
|
|
|
140
140
|
|
|
141
141
|
while True:
|
|
142
142
|
try:
|
|
143
|
-
if
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
143
|
+
if state.messages is not None:
|
|
144
|
+
if len(state.messages) > 20:
|
|
145
|
+
planning_state = {
|
|
146
|
+
"goal": "ongoing npcsh session",
|
|
147
|
+
"facts": [f"Working in {state.current_path}", f"Current mode: {state.current_mode}"],
|
|
148
|
+
"successes": [],
|
|
149
|
+
"mistakes": [],
|
|
150
|
+
"todos": [],
|
|
151
|
+
"constraints": ["Follow user requests", "Use appropriate mode for tasks"]
|
|
152
|
+
}
|
|
153
|
+
compressed_state = state.npc.compress_planning_state(planning_state)
|
|
154
|
+
state.messages = [{"role": "system", "content": f"Session context: {compressed_state}"}]
|
|
155
|
+
|
|
156
|
+
try:
|
|
157
|
+
completer = make_completer(state, router)
|
|
158
|
+
readline.set_completer(completer)
|
|
159
|
+
except:
|
|
160
|
+
pass
|
|
160
161
|
|
|
161
162
|
display_model = state.chat_model
|
|
162
163
|
if isinstance(state.npc, NPC) and state.npc.model:
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
jinx_name: "corca"
|
|
2
|
+
description: "Enter the Corca MCP-powered agentic shell"
|
|
3
|
+
inputs:
|
|
4
|
+
- mcp_server_path: '~/.npcsh/npc_team/mcp_server.py'
|
|
5
|
+
- force_global: false
|
|
6
|
+
- initial_command: null
|
|
7
|
+
steps:
|
|
8
|
+
- name: "enter_corca"
|
|
9
|
+
engine: "python"
|
|
10
|
+
code: |
|
|
11
|
+
from npcsh._state import setup_shell
|
|
12
|
+
from npcsh.corca import corca_session
|
|
13
|
+
|
|
14
|
+
mcp_server_path = context.get('mcp_server_path')
|
|
15
|
+
force_global = context.get('force_global', False)
|
|
16
|
+
initial_command = context.get('initial_command')
|
|
17
|
+
|
|
18
|
+
command_history, _, _ = setup_shell()
|
|
19
|
+
|
|
20
|
+
result = corca_session(
|
|
21
|
+
command_history=command_history,
|
|
22
|
+
mcp_server_path=mcp_server_path,
|
|
23
|
+
force_global=force_global,
|
|
24
|
+
initial_command=initial_command
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
context['output'] = result.get('output', 'Exited Corca mode.')
|
|
28
|
+
context['messages'] = result.get('messages', [])
|
|
@@ -38,10 +38,10 @@ steps:
|
|
|
38
38
|
print(f"📸 Screenshot captured: {screenshot_info.get('filename', os.path.basename(screenshot_info['file_path']))}")
|
|
39
39
|
|
|
40
40
|
if not vision_model:
|
|
41
|
-
vision_model = getattr(current_npc, 'model', '
|
|
41
|
+
vision_model = getattr(current_npc, 'model', 'gemma3:4b')
|
|
42
42
|
|
|
43
43
|
if not vision_provider:
|
|
44
|
-
vision_provider = getattr(current_npc, 'provider', '
|
|
44
|
+
vision_provider = getattr(current_npc, 'provider', 'ollama')
|
|
45
45
|
|
|
46
46
|
response_data = get_llm_response(
|
|
47
47
|
prompt=user_prompt,
|
|
@@ -30,10 +30,6 @@ steps:
|
|
|
30
30
|
if not vision_provider and current_npc and current_npc.provider:
|
|
31
31
|
vision_provider = current_npc.provider
|
|
32
32
|
|
|
33
|
-
# Final fallbacks (these would ideally come from npcsh._state config)
|
|
34
|
-
if not vision_model: vision_model = "gemini-1.5-pro-vision" # Example default
|
|
35
|
-
if not vision_provider: vision_provider = "gemini" # Example default
|
|
36
|
-
|
|
37
33
|
try:
|
|
38
34
|
summary_data = execute_plonk_command(
|
|
39
35
|
request=task_description,
|
|
@@ -2,12 +2,12 @@ jinx_name: "roll"
|
|
|
2
2
|
description: "Generate a video from a text prompt."
|
|
3
3
|
inputs:
|
|
4
4
|
- prompt: "" # Required text prompt for video generation.
|
|
5
|
+
- vgmodel: "" # Video generation model to use. Defaults to NPCSH_VIDEO_GEN_MODEL or NPC's model.
|
|
6
|
+
- vgprovider: "" # Video generation provider to use. Defaults to NPCSH_VIDEO_GEN_PROVIDER or NPC's provider.
|
|
5
7
|
- num_frames: 125 # Number of frames for the video.
|
|
6
8
|
- width: 256 # Width of the video.
|
|
7
9
|
- height: 256 # Height of the video.
|
|
8
10
|
- output_path: "output.mp4" # Output file path for the video.
|
|
9
|
-
- vgmodel: "" # Video generation model to use. Defaults to NPCSH_VIDEO_GEN_MODEL or NPC's model.
|
|
10
|
-
- vgprovider: "" # Video generation provider to use. Defaults to NPCSH_VIDEO_GEN_PROVIDER or NPC's provider.
|
|
11
11
|
steps:
|
|
12
12
|
- name: "generate_video"
|
|
13
13
|
engine: "python"
|
|
@@ -38,8 +38,10 @@ steps:
|
|
|
38
38
|
video_gen_provider = current_npc.provider
|
|
39
39
|
|
|
40
40
|
# Final fallbacks (these would ideally come from npcsh._state config)
|
|
41
|
-
if not video_gen_model:
|
|
42
|
-
|
|
41
|
+
if not video_gen_model:
|
|
42
|
+
video_gen_model = "stable-video-diffusion" # Example default
|
|
43
|
+
if not video_gen_provider:
|
|
44
|
+
video_gen_provider = "diffusers" # Example default
|
|
43
45
|
|
|
44
46
|
try:
|
|
45
47
|
result = gen_video(
|
|
@@ -9,6 +9,7 @@ description: >
|
|
|
9
9
|
/search --brainblast <query> (Advanced history search)
|
|
10
10
|
inputs:
|
|
11
11
|
- query: ""
|
|
12
|
+
- sprovider: ""
|
|
12
13
|
- memory: false
|
|
13
14
|
- kg: false
|
|
14
15
|
- rag: false
|
|
@@ -16,7 +17,6 @@ inputs:
|
|
|
16
17
|
- file_paths: ""
|
|
17
18
|
- history_db_path: "~/npcsh_history.db"
|
|
18
19
|
- vector_db_path: "~/npcsh_chroma.db"
|
|
19
|
-
- sprovider: ""
|
|
20
20
|
- emodel: ""
|
|
21
21
|
- eprovider: ""
|
|
22
22
|
steps:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: npcsh
|
|
3
|
-
Version: 1.1.
|
|
3
|
+
Version: 1.1.8
|
|
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
|
|
@@ -143,17 +143,49 @@ and you will enter the NPC shell. Additionally, the pip installation includes th
|
|
|
143
143
|
```
|
|
144
144
|
|
|
145
145
|
|
|
146
|
-
- **Search
|
|
146
|
+
- **Search**
|
|
147
|
+
- search the web
|
|
147
148
|
```bash
|
|
148
|
-
/search "
|
|
149
|
+
/search "cerulean city" perplexity
|
|
150
|
+
|
|
149
151
|
```
|
|
150
152
|
<p align="center">
|
|
151
|
-
<img src="https://raw.githubusercontent.com/npc-worldwide/npcsh/main/test_data/
|
|
152
|
-
|
|
153
|
+
<img src="https://raw.githubusercontent.com/npc-worldwide/npcsh/main/test_data/search.gif" alt="example of search results", width=600>
|
|
154
|
+
</p>
|
|
155
|
+
|
|
156
|
+
- search approved memories
|
|
157
|
+
```bash
|
|
158
|
+
/search query="how to deploy python apps" memory=true
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
- search the knowledge graph
|
|
162
|
+
|
|
163
|
+
```bash
|
|
164
|
+
/search query="user preferences for database" kg=true
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
- execute a RAG search across files
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
/search --rag -f ~/docs/api.md,~/docs/config.yaml "authentication setup"
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
- brainblast search (searches many keyword combinations)
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
/search query="git commands" brainblast=true
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
- web search with specific provider
|
|
180
|
+
|
|
181
|
+
```bash
|
|
182
|
+
/search query="family vacations" sprovider="perplexity"
|
|
183
|
+
```
|
|
153
184
|
|
|
154
185
|
- **Computer Use**
|
|
186
|
+
|
|
155
187
|
```bash
|
|
156
|
-
/plonk 'find out the latest news on cnn'
|
|
188
|
+
/plonk 'find out the latest news on cnn' gemma3:12b ollama
|
|
157
189
|
```
|
|
158
190
|
|
|
159
191
|
- **Generate Image**
|
|
@@ -165,12 +197,12 @@ and you will enter the NPC shell. Additionally, the pip installation includes th
|
|
|
165
197
|
</p>
|
|
166
198
|
- **Generate Video**
|
|
167
199
|
```bash
|
|
168
|
-
/roll 'generate a video of a hat riding a dog'
|
|
200
|
+
/roll 'generate a video of a hat riding a dog' veo-3.1-fast-generate-preview gemini
|
|
169
201
|
```
|
|
170
|
-
|
|
202
|
+
|
|
171
203
|
<p align="center">
|
|
172
|
-
<img src="https://raw.githubusercontent.com/
|
|
173
|
-
</p>
|
|
204
|
+
<img src="https://raw.githubusercontent.com/NPC-Worldwide/npcsh/main/test_data/hatridingdog.gif" alt="video of a hat riding a dog", width=250>
|
|
205
|
+
</p>
|
|
174
206
|
|
|
175
207
|
- **Serve an NPC Team**
|
|
176
208
|
```bash
|
|
@@ -212,16 +244,13 @@ This architecture enables users to build complex AI workflows while maintaining
|
|
|
212
244
|
|
|
213
245
|
Importantly, users can switch easily between the NPCs they are chatting with by typing `/n npc_name` within the NPC shell. Likewise, they can create Jinxs and then use them from within the NPC shell by invoking the jinx name and the arguments required for the Jinx; `/<jinx_name> arg1 arg2`
|
|
214
246
|
|
|
215
|
-
#
|
|
216
|
-
- activated by invoking `/<
|
|
217
|
-
|
|
247
|
+
# Jinx as macros
|
|
248
|
+
- activated by invoking `/<jinx_name> ...` in `npcsh`, jinxs can be called in bash or through the `npc` CLI. In our examples, we provide both `npcsh` calls as well as bash calls with the `npc` cli where relevant. For converting any `/<command>` in `npcsh` to a bash version, replace the `/` with `npc ` and the macro command will be invoked as a positional argument.
|
|
218
249
|
- `/alicanto` - Conduct deep research with multiple perspectives, identifying gold insights and cliff warnings. Usage: `/alicanto 'query to be researched' --num-npcs <int> --depth <int>`
|
|
219
250
|
- `/build` - Builds the current npc team to an executable format . Usage: `/build <output[flask,docker,cli,static]> --options`
|
|
220
|
-
- `/brainblast` - Execute an advanced chunked search on command history. Usage: `/brainblast 'query' --top_k 10`
|
|
221
251
|
- `/breathe` - Condense context on a regular cadence. Usage: `/breathe -p <provider: NPCSH_CHAT_PROVIDER> -m <model: NPCSH_CHAT_MODEL>`
|
|
222
252
|
- `/compile` - Compile NPC profiles. Usage: `/compile <path_to_npc> `
|
|
223
253
|
- `/corca` - Enter the Corca MCP-powered agentic shell. Usage: `/corca [--mcp-server-path path]`
|
|
224
|
-
- `/flush` - Flush the last N messages. Usage: `/flush N=10`
|
|
225
254
|
- `/guac` - Enter guac mode. Usage: `/guac`
|
|
226
255
|
- `/help` - Show help for commands, NPCs, or Jinxs. Usage: `/help`
|
|
227
256
|
- `/init` - Initialize NPC project. Usage: `/init`
|
|
@@ -229,13 +258,11 @@ Importantly, users can switch easily between the NPCs they are chatting with by
|
|
|
229
258
|
- `/<jinx_name>` - Run a jinx with specified command line arguments. `/<jinx_name> jinx_arg1 jinx_arg2`
|
|
230
259
|
- `/npc-studio` - Start npc studio. Pulls NPC Studio github to `~/.npcsh/npc-studio` and launches it in development mode after installing necessary NPM dependencies.Usage: `/npc-studio`
|
|
231
260
|
- `/ots` - Take screenshot and analyze with vision model. Usage: `/ots filename=<output_file_name_for_screenshot>` then select an area, and you will be prompted for your request.
|
|
232
|
-
- `/plan` - Execute a plan command. Usage: `/plan 'idea for a cron job to be set up to accomplish'`
|
|
233
261
|
- `/plonk` - Use vision model to interact with GUI. Usage: `/plonk '<task description>' `
|
|
234
262
|
- `/pti` - Use pardon-the-interruption mode to interact with reasoning model LLM. Usage: `/pti`
|
|
235
|
-
- `/rag` - Execute a RAG command using ChromaDB embeddings with optional file input (-f/--file). Usage: `/rag '<query_to_rag>' --emodel <NPCSH_EMBEDDING_MODEL> --eprovider <NPCSH_EMBEDDING_PROVIDER>`
|
|
236
263
|
- `/roll` - generate a video with video generation model. Usage: `/roll '<description_for_a_movie>' --vgmodel <NPCSH_VIDEO_GEN_MODEL> --vgprovider <NPCSH_VIDEO_GEN_PROVIDER>`
|
|
237
264
|
- `/sample` - Send a context-free prompt to an LLM, letting you get fresh answers without needing to start a separate conversation/shell. Usage: `/sample -m <NPCSH_CHAT_MODEL> 'question to sample --temp <float> --top_k int`
|
|
238
|
-
- `/search` - Execute a web
|
|
265
|
+
- `/search` - Execute a search command on the web, in your memories, in the knowledge graph, or in documents with rag. Usage: `/search 'search query' --sprovider <provider>` where provider is currently limited to DuckDuckGo, Perplexity, and Exa with more coming soon through litellm. Wikipedia integration ongoing. See above for more search specific examples.
|
|
239
266
|
- `/serve` - Serve an NPC Team server.
|
|
240
267
|
- `/set` - Set configuration values.
|
|
241
268
|
- Usage:
|
|
@@ -249,7 +276,6 @@ Importantly, users can switch easily between the NPCs they are chatting with by
|
|
|
249
276
|
- Usage:
|
|
250
277
|
- Gen Image: `/vixynt -igp <NPCSH_IMAGE_GEN_PROVIDER> --igmodel <NPCSH_IMAGE_GEN_MODEL> --output_file <path_to_file> width=<int:1024> height =<int:1024> 'description of image`
|
|
251
278
|
- Edit Image: `/vixynt 'edit this....' --attachments '/path/to/image.png,/path/to/image.jpeg'`
|
|
252
|
-
|
|
253
279
|
- `/wander` - A method for LLMs to think on a problem by switching between states of high temperature and low temperature. Usage: `/wander 'query to wander about' --provider "ollama" --model "deepseek-r1:32b" environment="a vast dark ocean" interruption-likelihood=.1`
|
|
254
280
|
- `/yap` - Enter voice chat (yap) mode. Usage: `/yap -n <npc_to_chat_with>`
|
|
255
281
|
|
|
@@ -271,24 +297,26 @@ Importantly, users can switch easily between the NPCs they are chatting with by
|
|
|
271
297
|
'
|
|
272
298
|
|
|
273
299
|
## Read the Docs
|
|
274
|
-
To see more about how to use the
|
|
300
|
+
To see more about how to use the jinxs and modes in the NPC Shell, read the docs at [npc-shell.readthedocs.io](https://npc-shell.readthedocs.io/en/latest/)
|
|
275
301
|
|
|
276
302
|
|
|
277
303
|
## Inference Capabilities
|
|
278
304
|
- `npcsh` works with local and enterprise LLM providers through its LiteLLM integration, allowing users to run inference from Ollama, LMStudio, vLLM, MLX, OpenAI, Anthropic, Gemini, and Deepseek, making it a versatile tool for both simple commands and sophisticated AI-driven tasks.
|
|
279
305
|
|
|
280
306
|
## NPC Studio
|
|
281
|
-
There is a graphical user interface that makes use of the NPC Toolkit through the NPC Studio. See the source code for NPC Studio [here](https://github.com/npc-worldwide/npc-studio). Download the executables at [our website](https://enpisi.com/
|
|
307
|
+
There is a graphical user interface that makes use of the NPC Toolkit through the NPC Studio. See the source code for NPC Studio [here](https://github.com/npc-worldwide/npc-studio). Download the executables at [our website](https://enpisi.com/downloads). For the most up to date development version, you can use NPC Studio by invoking it in npcsh
|
|
308
|
+
|
|
282
309
|
```
|
|
283
310
|
/npc-studio
|
|
284
311
|
```
|
|
285
|
-
which will download and set up and serve the NPC Studio application within your `~/.npcsh` folder. It requires `npm` and `node` to work
|
|
312
|
+
which will download and set up and serve the NPC Studio application within your `~/.npcsh` folder. It requires `npm` and `node` to work, and of course npcpy !
|
|
286
313
|
|
|
287
|
-
## Mailing List
|
|
314
|
+
## Mailing List and Community
|
|
288
315
|
Interested to stay in the loop and to hear the latest and greatest about `npcpy`, `npcsh`, and NPC Studio? Be sure to sign up for the [newsletter](https://forms.gle/n1NzQmwjsV4xv1B2A)!
|
|
289
316
|
|
|
317
|
+
[Join the discord to discuss ideas for npc tools](https://discord.gg/VvYVT5YC)
|
|
290
318
|
## Support
|
|
291
|
-
If you appreciate the work here, [consider supporting NPC Worldwide with a monthly donation](https://buymeacoffee.com/npcworldwide), [buying NPC-WW themed merch](https://enpisi.com/shop), or hiring us to help you explore how to use the NPC Toolkit and AI tools to help your business or research team, please reach out to info@npcworldwi.de .
|
|
319
|
+
If you appreciate the work here, [consider supporting NPC Worldwide with a monthly donation](https://buymeacoffee.com/npcworldwide), [buying NPC-WW themed merch](https://enpisi.com/shop), [using and subscribing to Lavanzaro](lavanzaro.com),s or hiring us to help you explore how to use the NPC Toolkit and AI tools to help your business or research team, please reach out to info@npcworldwi.de .
|
|
292
320
|
|
|
293
321
|
|
|
294
322
|
## Installation
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
npcsh/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
-
npcsh/_state.py,sha256=
|
|
2
|
+
npcsh/_state.py,sha256=VZs5snF-jWNXO5S8ALdiqdeQ9Ytw0q8qlBTEojtLtcI,101688
|
|
3
3
|
npcsh/alicanto.py,sha256=QCuTtMOgjFkjfrwZZdZBhfp-ETbimlOrXJQiZhClzT0,42160
|
|
4
4
|
npcsh/build.py,sha256=UuId0_rQml40A4U1KuvMekRyfB30s8HiLsXFJjqrBmM,7692
|
|
5
|
-
npcsh/corca.py,sha256=
|
|
5
|
+
npcsh/corca.py,sha256=Z2j5z1TNBhtKpShDrPSWKQ1uZ205bqo2dSWenc08gFA,62853
|
|
6
6
|
npcsh/guac.py,sha256=sVdLYVkzkQw6TE7crtLUX0QJZFkzQthWZTe1p7IfAQE,80412
|
|
7
7
|
npcsh/mcp_helpers.py,sha256=9TsCfcquGu_vX4WaKlY3J3P13-uxruQKrXng-jJ5YyY,11176
|
|
8
8
|
npcsh/mcp_server.py,sha256=Lfpabnwi_xu0UudJxQ_YNyyCn2f0_JjzorhWmIeclwY,8777
|
|
9
9
|
npcsh/npc.py,sha256=yqgqZDLwqniIbbDu-vaJf31fWVbOrtgNnFXfjDBk-D8,9853
|
|
10
|
-
npcsh/npcsh.py,sha256=
|
|
10
|
+
npcsh/npcsh.py,sha256=mHvLVz_NbJUvnTU3ktOcg5NnxliAtRuTBbmp7Ky028A,9490
|
|
11
11
|
npcsh/plonk.py,sha256=IfOuiE5FBvk-EIsrWFjGy0SrNywDpn4a49E7seBtEmY,14246
|
|
12
12
|
npcsh/pti.py,sha256=UciiiH2Kz4ERQFy0-FX6BQEU2VxYQEUril-_Cvj76Y0,7853
|
|
13
13
|
npcsh/routes.py,sha256=nlp_rd8eDyg2vTuXom9JMtmkWSzISu9u6Oc0lJjxKsQ,5024
|
|
@@ -39,9 +39,9 @@ npcsh/npc_team/jinxs/code/python.jinx,sha256=lFJubdPVlGxSuUKCxsxjYG4_dnX2ATn8U9C
|
|
|
39
39
|
npcsh/npc_team/jinxs/code/sh.jinx,sha256=Z_Cuok4FDUxuZGPCuqWS9D3TPI9SdkaZY4U_TCnie2g,666
|
|
40
40
|
npcsh/npc_team/jinxs/code/sql.jinx,sha256=U3scchBO3tqCQRIErC-W87eLtiCv-YGmN7ftqyIvcVc,582
|
|
41
41
|
npcsh/npc_team/jinxs/modes/alicanto.jinx,sha256=MknpYUX0eIvi5vG9gkoTkJvF_LcFbAp_hQ0qkYEBr3c,4014
|
|
42
|
-
npcsh/npc_team/jinxs/modes/corca.jinx,sha256=
|
|
42
|
+
npcsh/npc_team/jinxs/modes/corca.jinx,sha256=HTSyjoR2Hc4zEyQudapddOyP3paLcpxhWld5R4XipCk,905
|
|
43
43
|
npcsh/npc_team/jinxs/modes/guac.jinx,sha256=UIVXw8c-m-lh10bxL2yl2n94TQ_SjZSwLP3sLFGv0k4,1616
|
|
44
|
-
npcsh/npc_team/jinxs/modes/plonk.jinx,sha256=
|
|
44
|
+
npcsh/npc_team/jinxs/modes/plonk.jinx,sha256=teHS1A2Ov5imAWp9oHW1RNUVV2k4cfFQo-ro30mxuS8,2323
|
|
45
45
|
npcsh/npc_team/jinxs/modes/pti.jinx,sha256=Yw32GQS9LvYkukEfjq6R1GLAL6fWACYBz9JuVecZJEo,1126
|
|
46
46
|
npcsh/npc_team/jinxs/modes/spool.jinx,sha256=A4upAI4LnXxYUjY0Rz1_kAhRCDpz08XWPTgisiH06A4,1664
|
|
47
47
|
npcsh/npc_team/jinxs/modes/wander.jinx,sha256=Svc6zjmoXr4BbDg5SN4DB1Byhh75AmIeAItcJCBIlcc,3513
|
|
@@ -50,11 +50,11 @@ npcsh/npc_team/jinxs/utils/breathe.jinx,sha256=WDw13P3Q0M03HdZu-vqhbOhefLjaMZ5oU
|
|
|
50
50
|
npcsh/npc_team/jinxs/utils/edit_file.jinx,sha256=jExsHctvapG2xlze6E7ZR3oSLS9hJTYKKd41dQwgOLw,3488
|
|
51
51
|
npcsh/npc_team/jinxs/utils/flush.jinx,sha256=ngzFu4-dnKkqqL0QM9iX9XBxyWOmQdVcJTFb1GhajVo,1422
|
|
52
52
|
npcsh/npc_team/jinxs/utils/npc-studio.jinx,sha256=0aY-z399BRIXIL3TLMTcYDiHjDm-krZy0CnYfiskQUo,2234
|
|
53
|
-
npcsh/npc_team/jinxs/utils/ots.jinx,sha256=
|
|
53
|
+
npcsh/npc_team/jinxs/utils/ots.jinx,sha256=DKoSVgH_ZcmOaZ2-R-Yn80KyCiYgqG25JG6e4wQwP64,2301
|
|
54
54
|
npcsh/npc_team/jinxs/utils/plan.jinx,sha256=hCIG9nGI56C1SeGuGAUcR3XnJ25kHaDnUn1VCv8vszY,1234
|
|
55
|
-
npcsh/npc_team/jinxs/utils/roll.jinx,sha256=
|
|
55
|
+
npcsh/npc_team/jinxs/utils/roll.jinx,sha256=RhYhDDdyKcWjVhVSU7dX_DMn5s4rz-nY6pXmtr6tytM,2908
|
|
56
56
|
npcsh/npc_team/jinxs/utils/sample.jinx,sha256=7cWwfAZFgWxaTkIL1gpFFryQ3mjvVjoWYAov-zOFn_E,2237
|
|
57
|
-
npcsh/npc_team/jinxs/utils/search.jinx,sha256=
|
|
57
|
+
npcsh/npc_team/jinxs/utils/search.jinx,sha256=qTICVdk1QrbQ_ulCOaAnbXnGCKk9MgO0MI4MKbDbbRI,5421
|
|
58
58
|
npcsh/npc_team/jinxs/utils/serve.jinx,sha256=qly_3MThU3TRyJI2grHlhYOqEY1VT-XxubPIuWdZrpU,1056
|
|
59
59
|
npcsh/npc_team/jinxs/utils/sleep.jinx,sha256=c-7Dn4aLuX7WyBVcvuk3sqcbIutqKIz1N9sBfPNzhck,5301
|
|
60
60
|
npcsh/npc_team/jinxs/utils/trigger.jinx,sha256=rS913e2qJzNBC0wmmecgzN3f4v8o1os8AZQOPjnW8ho,1456
|
|
@@ -65,60 +65,60 @@ npcsh/npc_team/jinxs/utils/core/help.jinx,sha256=OquhUEgcYZp-gu5Wgl3pOZnswxGQ96R
|
|
|
65
65
|
npcsh/npc_team/jinxs/utils/core/init.jinx,sha256=QBb1uOTvMlD-x3S7zPASH5TBZRwNhMQvK6t3DdC2mVw,1596
|
|
66
66
|
npcsh/npc_team/jinxs/utils/core/jinxs.jinx,sha256=rF432zHrVeccbGKm5tHxd_bZ7OQk355xB6LTlEIXiuI,1269
|
|
67
67
|
npcsh/npc_team/jinxs/utils/core/set.jinx,sha256=hQY_0muEtnWtfXsdK9cPwSvIevCimiJJn1-yhGC_VxM,1381
|
|
68
|
-
npcsh-1.1.
|
|
69
|
-
npcsh-1.1.
|
|
70
|
-
npcsh-1.1.
|
|
71
|
-
npcsh-1.1.
|
|
72
|
-
npcsh-1.1.
|
|
73
|
-
npcsh-1.1.
|
|
74
|
-
npcsh-1.1.
|
|
75
|
-
npcsh-1.1.
|
|
76
|
-
npcsh-1.1.
|
|
77
|
-
npcsh-1.1.
|
|
78
|
-
npcsh-1.1.
|
|
79
|
-
npcsh-1.1.
|
|
80
|
-
npcsh-1.1.
|
|
81
|
-
npcsh-1.1.
|
|
82
|
-
npcsh-1.1.
|
|
83
|
-
npcsh-1.1.
|
|
84
|
-
npcsh-1.1.
|
|
85
|
-
npcsh-1.1.
|
|
86
|
-
npcsh-1.1.
|
|
87
|
-
npcsh-1.1.
|
|
88
|
-
npcsh-1.1.
|
|
89
|
-
npcsh-1.1.
|
|
90
|
-
npcsh-1.1.
|
|
91
|
-
npcsh-1.1.
|
|
92
|
-
npcsh-1.1.
|
|
93
|
-
npcsh-1.1.
|
|
94
|
-
npcsh-1.1.
|
|
95
|
-
npcsh-1.1.
|
|
96
|
-
npcsh-1.1.
|
|
97
|
-
npcsh-1.1.
|
|
98
|
-
npcsh-1.1.
|
|
99
|
-
npcsh-1.1.
|
|
100
|
-
npcsh-1.1.
|
|
101
|
-
npcsh-1.1.
|
|
102
|
-
npcsh-1.1.
|
|
103
|
-
npcsh-1.1.
|
|
104
|
-
npcsh-1.1.
|
|
105
|
-
npcsh-1.1.
|
|
106
|
-
npcsh-1.1.
|
|
107
|
-
npcsh-1.1.
|
|
108
|
-
npcsh-1.1.
|
|
109
|
-
npcsh-1.1.
|
|
110
|
-
npcsh-1.1.
|
|
111
|
-
npcsh-1.1.
|
|
112
|
-
npcsh-1.1.
|
|
113
|
-
npcsh-1.1.
|
|
114
|
-
npcsh-1.1.
|
|
115
|
-
npcsh-1.1.
|
|
116
|
-
npcsh-1.1.
|
|
117
|
-
npcsh-1.1.
|
|
118
|
-
npcsh-1.1.
|
|
119
|
-
npcsh-1.1.
|
|
120
|
-
npcsh-1.1.
|
|
121
|
-
npcsh-1.1.
|
|
122
|
-
npcsh-1.1.
|
|
123
|
-
npcsh-1.1.
|
|
124
|
-
npcsh-1.1.
|
|
68
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/alicanto.jinx,sha256=MknpYUX0eIvi5vG9gkoTkJvF_LcFbAp_hQ0qkYEBr3c,4014
|
|
69
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/alicanto.npc,sha256=y9yDY3lq8ZwxQxpnrgle8w5IJwZqvxDepZFU4OaZCtg,148
|
|
70
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/alicanto.png,sha256=A7xeMbcoKGjlkELxJEVifCEZLVWbOKZarTN5ZFJG-FM,3519858
|
|
71
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/breathe.jinx,sha256=WDw13P3Q0M03HdZu-vqhbOhefLjaMZ5oUcct_W4kUsY,739
|
|
72
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/build.jinx,sha256=QrShGspHwP1z073334vhUIIJZ_3pMJWN_DX_DPPVslU,2771
|
|
73
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/compile.jinx,sha256=Rjdm5jf3ech1E3cnpLz-o2tbJuVvEoQGAp0FQRAU7qo,2526
|
|
74
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/corca.jinx,sha256=HTSyjoR2Hc4zEyQudapddOyP3paLcpxhWld5R4XipCk,905
|
|
75
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/corca.npc,sha256=NtZW1mQ_AMOHlfMCfl8A3uA00UMuHuO95FzRg6kUixo,631
|
|
76
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/corca.png,sha256=0lF70hKu6tY-37YmIPVF2cuaPzvnQ4-UtQOzuAbKEf4,1666776
|
|
77
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/corca_example.png,sha256=p0lVTuwaps4-F-3k4wgp9d897YPyn6FGZugtXMUQjj8,28777
|
|
78
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/edit_file.jinx,sha256=jExsHctvapG2xlze6E7ZR3oSLS9hJTYKKd41dQwgOLw,3488
|
|
79
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/flush.jinx,sha256=ngzFu4-dnKkqqL0QM9iX9XBxyWOmQdVcJTFb1GhajVo,1422
|
|
80
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/foreman.npc,sha256=WqB8jLfBToGmr8c1vip1KOnTHxfXlGXwDUGnZoDMQr0,327
|
|
81
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/frederic.npc,sha256=EE2dOUItp-VKuW3ZMSHffmIEO4evjPcU2W_C4P3WXbY,362
|
|
82
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/frederic4.png,sha256=ll8uoV0npnPp5HVJWv7h0xDSeuq4pqsk_gYGBHLS0VY,1590744
|
|
83
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/guac.jinx,sha256=UIVXw8c-m-lh10bxL2yl2n94TQ_SjZSwLP3sLFGv0k4,1616
|
|
84
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/guac.png,sha256=MCE7eJuEJwLJEzc9FS7lL62Mm-38jQRHkxXogPfOTuw,211470
|
|
85
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/help.jinx,sha256=OquhUEgcYZp-gu5Wgl3pOZnswxGQ96RoNG08tHjC9-4,2091
|
|
86
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/init.jinx,sha256=QBb1uOTvMlD-x3S7zPASH5TBZRwNhMQvK6t3DdC2mVw,1596
|
|
87
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/jinxs.jinx,sha256=rF432zHrVeccbGKm5tHxd_bZ7OQk355xB6LTlEIXiuI,1269
|
|
88
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/kadiefa.npc,sha256=Yl5a4wrfe4F2f6Ndw_ukzlVVX7NE9g_mG-3QqJSkg_o,381
|
|
89
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/kadiefa.png,sha256=3CAwL8crKIwJko6o75Z6OYYEEM9Rk--yGzCJg7zoszg,3062528
|
|
90
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/npc-studio.jinx,sha256=0aY-z399BRIXIL3TLMTcYDiHjDm-krZy0CnYfiskQUo,2234
|
|
91
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/npcsh.ctx,sha256=-jKYaPm2YbZHAGgWAXhyPIwhiNe1H1ZRFg1Zc7tHSxk,1049
|
|
92
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/npcsh_sibiji.png,sha256=9fUqgYMsSHmaH-kBTBQ7N5UCS5-eLZF94Log0O3mtFg,4544
|
|
93
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/ots.jinx,sha256=DKoSVgH_ZcmOaZ2-R-Yn80KyCiYgqG25JG6e4wQwP64,2301
|
|
94
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/plan.jinx,sha256=hCIG9nGI56C1SeGuGAUcR3XnJ25kHaDnUn1VCv8vszY,1234
|
|
95
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/plonk.jinx,sha256=teHS1A2Ov5imAWp9oHW1RNUVV2k4cfFQo-ro30mxuS8,2323
|
|
96
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/plonk.npc,sha256=u1m2a1D512XGQ2kC3eWDAY8Y2IvpkNU73DI_CPE65UE,90
|
|
97
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/plonk.png,sha256=IU5ey-Dl4HEKlwnf75RSWNSHpF8rVqGmdbsa0deL4rQ,2727773
|
|
98
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/plonkjr.npc,sha256=It-i-BEuG0XddKk0d85onk2aJr9Pe5pLnJzNaCWaQIM,87
|
|
99
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/plonkjr.png,sha256=MqLEGwsyECUeODZIti0HQQrMMVxA6XERpW01R06NbpY,2606710
|
|
100
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/pti.jinx,sha256=Yw32GQS9LvYkukEfjq6R1GLAL6fWACYBz9JuVecZJEo,1126
|
|
101
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/python.jinx,sha256=lFJubdPVlGxSuUKCxsxjYG4_dnX2ATn8U9ChYKRmL5Q,389
|
|
102
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/roll.jinx,sha256=RhYhDDdyKcWjVhVSU7dX_DMn5s4rz-nY6pXmtr6tytM,2908
|
|
103
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/sample.jinx,sha256=7cWwfAZFgWxaTkIL1gpFFryQ3mjvVjoWYAov-zOFn_E,2237
|
|
104
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/search.jinx,sha256=qTICVdk1QrbQ_ulCOaAnbXnGCKk9MgO0MI4MKbDbbRI,5421
|
|
105
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/serve.jinx,sha256=qly_3MThU3TRyJI2grHlhYOqEY1VT-XxubPIuWdZrpU,1056
|
|
106
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/set.jinx,sha256=hQY_0muEtnWtfXsdK9cPwSvIevCimiJJn1-yhGC_VxM,1381
|
|
107
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/sh.jinx,sha256=Z_Cuok4FDUxuZGPCuqWS9D3TPI9SdkaZY4U_TCnie2g,666
|
|
108
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/sibiji.npc,sha256=Hb4wXKIObKKgibwnio5hLec9yd_9bKDCA87Nm2zijFA,216
|
|
109
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/sibiji.png,sha256=1dlZb7J3E62FcVo9CVOzLb8nu1bIUV7cr97nsFocHCM,35615
|
|
110
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/sleep.jinx,sha256=c-7Dn4aLuX7WyBVcvuk3sqcbIutqKIz1N9sBfPNzhck,5301
|
|
111
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/spool.jinx,sha256=A4upAI4LnXxYUjY0Rz1_kAhRCDpz08XWPTgisiH06A4,1664
|
|
112
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/spool.png,sha256=LWTLkwDxXBfLuSUCX32_lo5yAmLYGsA67Xpsz-7MmWU,2876725
|
|
113
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/sql.jinx,sha256=U3scchBO3tqCQRIErC-W87eLtiCv-YGmN7ftqyIvcVc,582
|
|
114
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/trigger.jinx,sha256=rS913e2qJzNBC0wmmecgzN3f4v8o1os8AZQOPjnW8ho,1456
|
|
115
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/vixynt.jinx,sha256=ECNE02omzgvJ2B8ZO8K6OylMa3lLGBNEEeFZ-oXiKC0,4070
|
|
116
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/wander.jinx,sha256=Svc6zjmoXr4BbDg5SN4DB1Byhh75AmIeAItcJCBIlcc,3513
|
|
117
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/yap.jinx,sha256=eaI665zjaLH2FUwHoO3iC1Uzo9bGA-a1UMtBRBTEHC0,898
|
|
118
|
+
npcsh-1.1.8.data/data/npcsh/npc_team/yap.png,sha256=_l7UbWnXJdsy4Mx-x5l9DT0R6ize3HTnkwQQnOFlI18,1548649
|
|
119
|
+
npcsh-1.1.8.dist-info/licenses/LICENSE,sha256=IKBvAECHP-aCiJtE4cHGCE5Yl0tozYz02PomGeWS3y4,1070
|
|
120
|
+
npcsh-1.1.8.dist-info/METADATA,sha256=Ostqrq7lKbRHEcIW-uvBBZC-dLtkYCqQHPvyLfzRcLg,25804
|
|
121
|
+
npcsh-1.1.8.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
122
|
+
npcsh-1.1.8.dist-info/entry_points.txt,sha256=S5yIuGm8ZXQ4siHYgN5gs0J7bxgobSEULXf8L5HaW5o,206
|
|
123
|
+
npcsh-1.1.8.dist-info/top_level.txt,sha256=kHSNgKMCkfjV95-DH0YSp1LLBi0HXdF3w57j7MQON3E,6
|
|
124
|
+
npcsh-1.1.8.dist-info/RECORD,,
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
jinx_name: "corca"
|
|
2
|
-
description: "Enter the Corca MCP-powered agentic shell. Usage: /corca [--mcp-server-path path]"
|
|
3
|
-
inputs:
|
|
4
|
-
- command: "/corca" # The full command string, e.g., "/corca --mcp-server-path /tmp/mcp"
|
|
5
|
-
steps:
|
|
6
|
-
- name: "enter_corca"
|
|
7
|
-
engine: "python"
|
|
8
|
-
code: |
|
|
9
|
-
# Assume npcsh._state and enter_corca_mode are accessible in the environment
|
|
10
|
-
|
|
11
|
-
from npcsh._state import initial_state, setup_shell
|
|
12
|
-
from npcsh.corca import enter_corca_mode
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
full_command_str = context.get('command')
|
|
16
|
-
output_messages = context.get('messages', [])
|
|
17
|
-
|
|
18
|
-
command_history, team, default_npc = setup_shell()
|
|
19
|
-
|
|
20
|
-
result = enter_corca_mode(
|
|
21
|
-
command=full_command_str,
|
|
22
|
-
command_history=command_history,
|
|
23
|
-
shell_state=initial_state,
|
|
24
|
-
**context # Pass all context as kwargs to enter_corca_mode as it expects
|
|
25
|
-
)
|
|
26
|
-
|
|
27
|
-
context['output'] = result.get('output', 'Entered Corca mode.')
|
|
28
|
-
context['messages'] = result.get('messages', output_messages)
|
|
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
|
|
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
|