npcsh 1.1.16__py3-none-any.whl → 1.1.17__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 (176) hide show
  1. npcsh/_state.py +24 -9
  2. npcsh/benchmark/__init__.py +22 -0
  3. npcsh/benchmark/npcsh_agent.py +262 -0
  4. npcsh/benchmark/runner.py +569 -0
  5. npcsh/npc_team/jinxs/bin/benchmark.jinx +146 -0
  6. npcsh/npc_team/jinxs/bin/nql.jinx +7 -7
  7. npcsh/npc_team/jinxs/bin/roll.jinx +20 -23
  8. npcsh/npc_team/jinxs/bin/sample.jinx +6 -7
  9. npcsh/npc_team/jinxs/bin/spool.jinx +4 -4
  10. npcsh/npc_team/jinxs/bin/sync.jinx +6 -6
  11. npcsh/npc_team/jinxs/bin/vixynt.jinx +8 -8
  12. npcsh/npc_team/jinxs/bin/wander.jinx +109 -19
  13. npcsh/npc_team/jinxs/bin/yap.jinx +5 -5
  14. npcsh/npc_team/jinxs/incognide/add_tab.jinx +11 -0
  15. npcsh/npc_team/jinxs/incognide/close_pane.jinx +9 -0
  16. npcsh/npc_team/jinxs/incognide/close_tab.jinx +10 -0
  17. npcsh/npc_team/jinxs/incognide/confirm.jinx +10 -0
  18. npcsh/npc_team/jinxs/incognide/focus_pane.jinx +9 -0
  19. npcsh/npc_team/jinxs/{npc_studio/npc-studio.jinx → incognide/incognide.jinx} +2 -2
  20. npcsh/npc_team/jinxs/incognide/list_panes.jinx +8 -0
  21. npcsh/npc_team/jinxs/incognide/navigate.jinx +10 -0
  22. npcsh/npc_team/jinxs/incognide/notify.jinx +10 -0
  23. npcsh/npc_team/jinxs/incognide/open_pane.jinx +13 -0
  24. npcsh/npc_team/jinxs/incognide/read_pane.jinx +9 -0
  25. npcsh/npc_team/jinxs/incognide/run_terminal.jinx +10 -0
  26. npcsh/npc_team/jinxs/incognide/send_message.jinx +10 -0
  27. npcsh/npc_team/jinxs/incognide/split_pane.jinx +12 -0
  28. npcsh/npc_team/jinxs/incognide/switch_npc.jinx +10 -0
  29. npcsh/npc_team/jinxs/incognide/switch_tab.jinx +10 -0
  30. npcsh/npc_team/jinxs/incognide/write_file.jinx +11 -0
  31. npcsh/npc_team/jinxs/incognide/zen_mode.jinx +9 -0
  32. npcsh/npc_team/jinxs/lib/browser/browser_action.jinx +4 -4
  33. npcsh/npc_team/jinxs/lib/browser/browser_screenshot.jinx +1 -1
  34. npcsh/npc_team/jinxs/lib/browser/open_browser.jinx +2 -2
  35. npcsh/npc_team/jinxs/lib/computer_use/click.jinx +2 -2
  36. npcsh/npc_team/jinxs/lib/computer_use/key_press.jinx +1 -1
  37. npcsh/npc_team/jinxs/lib/computer_use/launch_app.jinx +1 -1
  38. npcsh/npc_team/jinxs/lib/computer_use/screenshot.jinx +1 -1
  39. npcsh/npc_team/jinxs/lib/computer_use/trigger.jinx +2 -2
  40. npcsh/npc_team/jinxs/lib/computer_use/type_text.jinx +1 -1
  41. npcsh/npc_team/jinxs/lib/computer_use/wait.jinx +1 -1
  42. npcsh/npc_team/jinxs/lib/core/chat.jinx +4 -4
  43. npcsh/npc_team/jinxs/lib/core/cmd.jinx +4 -4
  44. npcsh/npc_team/jinxs/lib/core/compress.jinx +8 -8
  45. npcsh/npc_team/jinxs/lib/core/edit_file.jinx +3 -0
  46. npcsh/npc_team/jinxs/lib/core/ots.jinx +7 -7
  47. npcsh/npc_team/jinxs/lib/core/search/db_search.jinx +44 -0
  48. npcsh/npc_team/jinxs/lib/core/search/file_search.jinx +94 -0
  49. npcsh/npc_team/jinxs/lib/core/search/kg_search.jinx +96 -0
  50. npcsh/npc_team/jinxs/lib/core/search/mem_search.jinx +80 -0
  51. npcsh/npc_team/jinxs/lib/core/search/web_search.jinx +51 -0
  52. npcsh/npc_team/jinxs/lib/core/search.jinx +52 -129
  53. npcsh/npc_team/jinxs/lib/core/sh.jinx +1 -1
  54. npcsh/npc_team/jinxs/lib/core/sleep.jinx +7 -7
  55. npcsh/npc_team/jinxs/lib/core/sql.jinx +7 -7
  56. npcsh/npc_team/jinxs/lib/orchestration/convene.jinx +7 -7
  57. npcsh/npc_team/jinxs/lib/orchestration/delegate.jinx +8 -9
  58. npcsh/npc_team/jinxs/lib/research/arxiv.jinx +2 -2
  59. npcsh/npc_team/jinxs/lib/research/paper_search.jinx +3 -3
  60. npcsh/npc_team/jinxs/lib/research/semantic_scholar.jinx +2 -2
  61. npcsh/npc_team/jinxs/lib/utils/build.jinx +5 -5
  62. npcsh/npc_team/jinxs/lib/utils/compile.jinx +2 -2
  63. npcsh/npc_team/jinxs/lib/utils/help.jinx +1 -1
  64. npcsh/npc_team/jinxs/lib/utils/init.jinx +5 -5
  65. npcsh/npc_team/jinxs/lib/utils/jinxs.jinx +1 -1
  66. npcsh/npc_team/jinxs/lib/utils/serve.jinx +2 -2
  67. npcsh/npc_team/jinxs/lib/utils/set.jinx +2 -2
  68. npcsh/npc_team/jinxs/lib/utils/switch.jinx +3 -3
  69. npcsh/npc_team/jinxs/lib/utils/switches.jinx +1 -1
  70. npcsh/npc_team/jinxs/lib/utils/teamviz.jinx +2 -2
  71. npcsh/npc_team/sibiji.npc +1 -1
  72. npcsh/npcsh.py +81 -43
  73. npcsh-1.1.17.data/data/npcsh/npc_team/add_tab.jinx +11 -0
  74. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/arxiv.jinx +2 -2
  75. npcsh-1.1.17.data/data/npcsh/npc_team/benchmark.jinx +146 -0
  76. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/browser_action.jinx +4 -4
  77. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/browser_screenshot.jinx +1 -1
  78. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/build.jinx +5 -5
  79. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/chat.jinx +4 -4
  80. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/click.jinx +2 -2
  81. npcsh-1.1.17.data/data/npcsh/npc_team/close_pane.jinx +9 -0
  82. npcsh-1.1.17.data/data/npcsh/npc_team/close_tab.jinx +10 -0
  83. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/cmd.jinx +4 -4
  84. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/compile.jinx +2 -2
  85. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/compress.jinx +8 -8
  86. npcsh-1.1.17.data/data/npcsh/npc_team/confirm.jinx +10 -0
  87. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/convene.jinx +7 -7
  88. npcsh-1.1.17.data/data/npcsh/npc_team/db_search.jinx +44 -0
  89. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/delegate.jinx +8 -9
  90. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/edit_file.jinx +3 -0
  91. npcsh-1.1.17.data/data/npcsh/npc_team/file_search.jinx +94 -0
  92. npcsh-1.1.17.data/data/npcsh/npc_team/focus_pane.jinx +9 -0
  93. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/help.jinx +1 -1
  94. npcsh-1.1.16.data/data/npcsh/npc_team/npc-studio.jinx → npcsh-1.1.17.data/data/npcsh/npc_team/incognide.jinx +2 -2
  95. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/init.jinx +5 -5
  96. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/jinxs.jinx +1 -1
  97. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/key_press.jinx +1 -1
  98. npcsh-1.1.17.data/data/npcsh/npc_team/kg_search.jinx +96 -0
  99. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/launch_app.jinx +1 -1
  100. npcsh-1.1.17.data/data/npcsh/npc_team/list_panes.jinx +8 -0
  101. npcsh-1.1.17.data/data/npcsh/npc_team/mem_search.jinx +80 -0
  102. npcsh-1.1.17.data/data/npcsh/npc_team/navigate.jinx +10 -0
  103. npcsh-1.1.17.data/data/npcsh/npc_team/notify.jinx +10 -0
  104. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/nql.jinx +7 -7
  105. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/open_browser.jinx +2 -2
  106. npcsh-1.1.17.data/data/npcsh/npc_team/open_pane.jinx +13 -0
  107. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/ots.jinx +7 -7
  108. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/paper_search.jinx +3 -3
  109. npcsh-1.1.17.data/data/npcsh/npc_team/read_pane.jinx +9 -0
  110. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/roll.jinx +20 -23
  111. npcsh-1.1.17.data/data/npcsh/npc_team/run_terminal.jinx +10 -0
  112. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/sample.jinx +6 -7
  113. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/screenshot.jinx +1 -1
  114. npcsh-1.1.17.data/data/npcsh/npc_team/search.jinx +54 -0
  115. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/semantic_scholar.jinx +2 -2
  116. npcsh-1.1.17.data/data/npcsh/npc_team/send_message.jinx +10 -0
  117. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/serve.jinx +2 -2
  118. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/set.jinx +2 -2
  119. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/sh.jinx +1 -1
  120. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/sibiji.npc +1 -1
  121. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/sleep.jinx +7 -7
  122. npcsh-1.1.17.data/data/npcsh/npc_team/split_pane.jinx +12 -0
  123. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/spool.jinx +4 -4
  124. npcsh-1.1.17.data/data/npcsh/npc_team/sql.jinx +16 -0
  125. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/switch.jinx +3 -3
  126. npcsh-1.1.17.data/data/npcsh/npc_team/switch_npc.jinx +10 -0
  127. npcsh-1.1.17.data/data/npcsh/npc_team/switch_tab.jinx +10 -0
  128. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/switches.jinx +1 -1
  129. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/sync.jinx +6 -6
  130. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/teamviz.jinx +2 -2
  131. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/trigger.jinx +2 -2
  132. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/type_text.jinx +1 -1
  133. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/vixynt.jinx +8 -8
  134. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/wait.jinx +1 -1
  135. npcsh-1.1.17.data/data/npcsh/npc_team/wander.jinx +242 -0
  136. npcsh-1.1.17.data/data/npcsh/npc_team/web_search.jinx +51 -0
  137. npcsh-1.1.17.data/data/npcsh/npc_team/write_file.jinx +11 -0
  138. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/yap.jinx +5 -5
  139. npcsh-1.1.17.data/data/npcsh/npc_team/zen_mode.jinx +9 -0
  140. {npcsh-1.1.16.dist-info → npcsh-1.1.17.dist-info}/METADATA +10 -7
  141. npcsh-1.1.17.dist-info/RECORD +219 -0
  142. {npcsh-1.1.16.dist-info → npcsh-1.1.17.dist-info}/entry_points.txt +2 -0
  143. npcsh-1.1.16.data/data/npcsh/npc_team/search.jinx +0 -131
  144. npcsh-1.1.16.data/data/npcsh/npc_team/sql.jinx +0 -16
  145. npcsh-1.1.16.data/data/npcsh/npc_team/wander.jinx +0 -152
  146. npcsh-1.1.16.dist-info/RECORD +0 -170
  147. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/alicanto.npc +0 -0
  148. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/alicanto.png +0 -0
  149. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/close_browser.jinx +0 -0
  150. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/corca.npc +0 -0
  151. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/corca.png +0 -0
  152. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/corca_example.png +0 -0
  153. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/frederic.npc +0 -0
  154. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/frederic4.png +0 -0
  155. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/guac.npc +0 -0
  156. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/guac.png +0 -0
  157. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/kadiefa.npc +0 -0
  158. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/kadiefa.png +0 -0
  159. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/load_file.jinx +0 -0
  160. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/npcsh.ctx +0 -0
  161. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/npcsh_sibiji.png +0 -0
  162. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/paste.jinx +0 -0
  163. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/plonk.npc +0 -0
  164. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/plonk.png +0 -0
  165. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/plonkjr.npc +0 -0
  166. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/plonkjr.png +0 -0
  167. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/python.jinx +0 -0
  168. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/shh.jinx +0 -0
  169. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/sibiji.png +0 -0
  170. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/spool.png +0 -0
  171. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/usage.jinx +0 -0
  172. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/verbose.jinx +0 -0
  173. {npcsh-1.1.16.data → npcsh-1.1.17.data}/data/npcsh/npc_team/yap.png +0 -0
  174. {npcsh-1.1.16.dist-info → npcsh-1.1.17.dist-info}/WHEEL +0 -0
  175. {npcsh-1.1.16.dist-info → npcsh-1.1.17.dist-info}/licenses/LICENSE +0 -0
  176. {npcsh-1.1.16.dist-info → npcsh-1.1.17.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,51 @@
1
+ jinx_name: web_search
2
+ description: Search the web for information
3
+ inputs:
4
+ - query: ""
5
+ - provider: ""
6
+ - num_results: "10"
7
+
8
+ steps:
9
+ - name: search_web
10
+ engine: python
11
+ code: |
12
+ from npcpy.data.web import search_web
13
+
14
+ query = context.get('query', '').strip()
15
+ if not query:
16
+ lines = [
17
+ "Usage: /web_search <query>",
18
+ "",
19
+ "Options:",
20
+ " provider - Search provider (default uses state.search_provider)",
21
+ " num_results - Number of results (default 10)",
22
+ "",
23
+ "Examples:",
24
+ " /web_search python asyncio tutorial",
25
+ " /web_search react hooks num_results=20",
26
+ ]
27
+ context['output'] = "\n".join(lines)
28
+ else:
29
+ provider = context.get('provider') or None
30
+ try:
31
+ provider = provider or (state.search_provider if 'state' in dir() and state else None)
32
+ except:
33
+ pass
34
+ num_results = int(context.get('num_results') or 10)
35
+ try:
36
+ results = search_web(query, provider=provider, num_results=num_results)
37
+ if results:
38
+ lines = []
39
+ for res in results:
40
+ if isinstance(res, dict):
41
+ title = res.get('title', '')
42
+ url = res.get('url', res.get('link', ''))
43
+ lines.append("- " + title + " " + url)
44
+ else:
45
+ lines.append("- " + str(res))
46
+ context['output'] = "\n".join(lines)
47
+ else:
48
+ context['output'] = "No web results found."
49
+ except Exception as e:
50
+ import traceback
51
+ context['output'] = "Web search error: " + str(e) + "\n" + traceback.format_exc()
@@ -1,131 +1,54 @@
1
- jinx_name: "search"
2
- description: >
3
- Executes a search across various sources.
4
- Usage:
5
- /search <query> (Default: Web Search)
6
- /search --memory <query> (Search approved memories)
7
- /search --kg <query> (Search the knowledge graph)
8
- /search --rag [-f <paths>] <query> (Execute a RAG search)
9
- /search --brainblast <query> (Advanced history search)
1
+ jinx_name: search
2
+ description: Unified search - routes to web_search, mem_search, kg_search, file_search, db_search
10
3
  inputs:
11
- - query: ""
12
- - sprovider: ""
13
- - memory: false
14
- - kg: false
15
- - rag: false
16
- - brainblast: false
17
- - file_paths: ""
18
- - history_db_path: "~/npcsh_history.db"
19
- - vector_db_path: "~/npcsh_chroma.db"
20
- - emodel: ""
21
- - eprovider: ""
22
- steps:
23
- - name: "execute_unified_search"
24
- engine: "python"
25
- code: |
26
- import os
27
- import traceback
28
- from npcpy.data.web import search_web
29
-
30
- # Access query from context
31
- query = context.get('query')
32
- if not query or not query.strip():
33
- context['output'] = "Usage: /search [--memory|--kg|--rag|--brainblast] <query>"
34
- else:
35
- # state is available as a GLOBAL variable (from extra_globals)
36
- # Access it directly, not from context
37
- try:
38
- current_state = state # This should work now
39
- except NameError:
40
- context['output'] = "Error: Shell state not available in jinx context"
41
- raise
42
-
43
- current_npc = current_state.npc
44
- current_team = current_state.team
45
-
46
- npc_name = getattr(current_npc, 'name', '__none__') if current_npc else '__none__'
47
- team_name = getattr(current_team, 'name', '__none__') if current_team else '__none__'
48
- current_path = os.getcwd()
49
- db_path = os.path.expanduser(context.get("history_db_path") or "~/.npcsh/npcsh_history.db")
50
-
51
- try:
52
- cmd_history = CommandHistory(db_path)
53
-
54
- if context.get('memory'):
55
- memories = get_relevant_memories(
56
- command_history=cmd_history,
57
- npc_name=npc_name,
58
- team_name=team_name,
59
- path=current_path,
60
- query=query,
61
- max_memories=10,
62
- state=current_state # Pass the state object
63
- )
64
- print(memories)
65
-
66
- if not memories:
67
- output = f"No memories found for query: '{query}'"
68
- else:
69
- output = f"Found {len(memories)} memories:\n\n" + "\n".join(
70
- f"{i}. [{mem.get('timestamp', 'unknown')}] {mem.get('final_memory') or mem.get('initial_memory')}"
71
- for i, mem in enumerate(memories, 1)
72
- )
73
-
74
- elif context.get('kg'):
75
- facts = search_kg_facts(
76
- cmd_history,
77
- npc_name,
78
- team_name,
79
- current_path,
80
- query
81
- )
82
- print(facts)
83
-
84
- if not facts:
85
- output = f"No KG facts found for query: '{query}'"
86
- else:
87
- output = f"Found {len(facts)} KG facts:\n\n" + "\n".join(
88
- f"{i}. {fact.get('statement')}" for i, fact in enumerate(facts, 1)
89
- )
90
-
91
- elif context.get('rag'):
92
- file_paths_str = context.get('file_paths', '')
93
- file_paths = [os.path.abspath(os.path.expanduser(p.strip())) for p in file_paths_str.split(',') if p.strip()]
94
- emodel = context.get('emodel') or current_state.embedding_model
95
- eprovider = context.get('eprovider') or current_state.embedding_provider
96
-
97
- file_contents = []
98
- for path in file_paths:
99
- chunks = load_file_contents(path)
100
- basename = os.path.basename(path)
101
- file_contents.extend([f"{basename}: {chunk}" for chunk in chunks])
102
-
103
- result = execute_rag_command(
104
- command=query,
105
- vector_db_path=os.path.expanduser(context.get('vector_db_path') or "~/.npcsh/npcsh_chroma.db"),
106
- embedding_model=emodel,
107
- embedding_provider=eprovider,
108
- file_contents=file_contents or None
109
- )
110
- print(result)
111
- output = result.get('response', 'No response from RAG.')
4
+ - query: ""
5
+ - type: "web"
6
+ - provider: ""
7
+ - num_results: ""
8
+ - status: ""
9
+ - npc_name: ""
10
+ - team_name: ""
11
+ - file_paths: ""
12
+ - emodel: ""
13
+ - eprovider: ""
14
+ - concept: ""
15
+ - db_path: ""
16
+ - limit: ""
112
17
 
113
- elif context.get('brainblast'):
114
- result = execute_brainblast_command(
115
- command=query,
116
- command_history=cmd_history,
117
- **context
118
- )
119
- print(result)
120
- output = result.get('output', 'Brainblast search executed.')
121
-
122
- else:
123
- # Default to web search
124
- provider = context.get('sprovider') or current_state.search_provider
125
- results = search_web(query, provider=provider)
126
- output = "\n".join([f"- {res}" for res in results]) if results else "No web results found."
127
-
128
- except Exception as e:
129
- output = f"An error occurred in the search jinx: {e}\n{traceback.format_exc()}"
130
-
131
- context['output'] = output
18
+ steps:
19
+ {% if type == "mem" %}
20
+ - name: search
21
+ engine: mem_search
22
+ query: "{{ query }}"
23
+ status: "{{ status }}"
24
+ npc_name: "{{ npc_name }}"
25
+ team_name: "{{ team_name }}"
26
+ db_path: "{{ db_path }}"
27
+ {% elif type == "kg" %}
28
+ - name: search
29
+ engine: kg_search
30
+ query: "{{ query }}"
31
+ concept: "{{ concept }}"
32
+ npc_name: "{{ npc_name }}"
33
+ team_name: "{{ team_name }}"
34
+ db_path: "{{ db_path }}"
35
+ {% elif type == "file" %}
36
+ - name: search
37
+ engine: file_search
38
+ query: "{{ query }}"
39
+ file_paths: "{{ file_paths }}"
40
+ emodel: "{{ emodel }}"
41
+ eprovider: "{{ eprovider }}"
42
+ {% elif type == "db" %}
43
+ - name: search
44
+ engine: db_search
45
+ query: "{{ query }}"
46
+ db_path: "{{ db_path }}"
47
+ limit: "{{ limit }}"
48
+ {% else %}
49
+ - name: search
50
+ engine: web_search
51
+ query: "{{ query }}"
52
+ provider: "{{ provider }}"
53
+ num_results: "{{ num_results }}"
54
+ {% endif %}
@@ -1,7 +1,7 @@
1
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. NEVER use ls -R on directories that may contain node_modules, .git, or other large dependency folders - this will exceed token limits. Use targeted ls commands instead.
3
3
  inputs:
4
- - bash_command
4
+ - bash_command
5
5
  steps:
6
6
  - name: execute_bash
7
7
  engine: python
@@ -1,10 +1,10 @@
1
1
  jinx_name: "sleep"
2
2
  description: "Evolve knowledge graph. Use --dream to also run creative synthesis."
3
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.
4
+ - dream: False
5
+ - ops: ""
6
+ - model: ""
7
+ - provider: ""
8
8
  steps:
9
9
  - name: "evolve_knowledge_graph"
10
10
  engine: "python"
@@ -33,9 +33,9 @@ steps:
33
33
  if not llm_provider and current_npc and current_npc.provider:
34
34
  llm_provider = current_npc.provider
35
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
36
+ # Final fallbacks from state
37
+ if not llm_model: llm_model = state.chat_model if state else "llama3.2"
38
+ if not llm_provider: llm_provider = state.chat_provider if state else "ollama"
39
39
 
40
40
  team_name = current_team.name if current_team else "__none__"
41
41
  npc_name = current_npc.name if isinstance(current_npc, type(None).__class__) else "__none__"
@@ -1,16 +1,16 @@
1
1
  jinx_name: sql
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.
2
+ description: Execute queries on the ~/npcsh_history.db to pull data. The database contains only information about conversations and other user-provided data. It does not store any information about individual files.
5
3
  inputs:
6
- - sql_query
4
+ - sql_query: ""
5
+
7
6
  steps:
8
- - engine: python
7
+ - name: execute_sql
8
+ engine: python
9
9
  code: |
10
10
  import pandas as pd
11
11
  query = {{ sql_query | tojson }}
12
12
  try:
13
- df = pd.read_sql_query(query, npc.db_conn)
13
+ df = pd.read_sql_query(query, npc.db_conn)
14
14
  except Exception as e:
15
- df = pd.DataFrame({'Error': [str(e)]})
15
+ df = pd.DataFrame({'Error': [str(e)]})
16
16
  output = df.to_string()
@@ -1,11 +1,11 @@
1
1
  jinx_name: convene
2
2
  description: Run a cycle of discussions between NPCs on a topic. The orchestrator convenes agents to discuss and synthesize.
3
3
  inputs:
4
- - topic: ""
5
- - npcs: "alicanto,corca,guac"
6
- - rounds: 3
7
- - model: null
8
- - provider: null
4
+ - topic: ""
5
+ - npcs: "alicanto,corca,guac"
6
+ - rounds: 3
7
+ - model: null
8
+ - provider: null
9
9
  steps:
10
10
  - name: convene_discussion
11
11
  engine: python
@@ -21,8 +21,8 @@ steps:
21
21
  team = context.get('team')
22
22
  messages = context.get('messages', [])
23
23
 
24
- model = context.get('model') or (npc.model if npc else 'gemini-1.5-flash')
25
- provider = context.get('provider') or (npc.provider if npc else 'gemini')
24
+ model = context.get('model') or (npc.model if npc else (state.chat_model if state else 'llama3.2'))
25
+ provider = context.get('provider') or (npc.provider if npc else (state.chat_provider if state else 'ollama'))
26
26
 
27
27
  if not topic:
28
28
  context['output'] = """Usage: /convene <topic>
@@ -1,11 +1,11 @@
1
1
  jinx_name: delegate
2
2
  description: Delegate a task to another NPC with review and feedback loop until completion. Choose the NPC whose directive best matches the task.
3
3
  inputs:
4
- - npc_name:
4
+ - npc_name:
5
5
  description: "Name of the NPC to delegate to"
6
- - task:
6
+ - task:
7
7
  description: "The task or request to delegate to the NPC"
8
- - max_iterations: "10"
8
+ - max_iterations: "10"
9
9
  steps:
10
10
  - name: delegate_with_review
11
11
  engine: python
@@ -43,8 +43,7 @@ steps:
43
43
  sep = '-' * 60
44
44
  print(colored("\n" + sep, "cyan"))
45
45
  print(colored(" Delegating to @" + target_name, "yellow", attrs=["bold"]))
46
- task_preview = task_request[:100] + ('...' if len(task_request) > 100 else '')
47
- print(colored(" Task: " + task_preview, "white", attrs=["dark"]))
46
+ print(colored(" Task: " + task_request, "white", attrs=["dark"]))
48
47
  print(colored(sep + "\n", "cyan"))
49
48
  print(colored(" [{}] Model: {}".format(target_name, target_npc.model), "white", attrs=["dark"]))
50
49
  jinx_list = ', '.join(list(target_jinxs.keys())[:8])
@@ -127,8 +126,8 @@ steps:
127
126
 
128
127
  review_result = get_llm_response(
129
128
  review_prompt,
130
- model=getattr(orchestrator, 'model', 'gemini-2.5-flash'),
131
- provider=getattr(orchestrator, 'provider', 'gemini'),
129
+ model=getattr(orchestrator, 'model', None) or (state.chat_model if state else 'llama3.2'),
130
+ provider=getattr(orchestrator, 'provider', None) or (state.chat_provider if state else 'ollama'),
132
131
  npc=orchestrator,
133
132
  temperature=0.3
134
133
  )
@@ -150,12 +149,12 @@ steps:
150
149
  task_complete = True
151
150
  print(colored("\n Task completed successfully", "green", attrs=["bold"]))
152
151
  if summary:
153
- print(colored(" Summary: " + summary[:200], "white", attrs=["dark"]))
152
+ print(colored(" Summary: " + summary, "white", attrs=["dark"]))
154
153
  final_output = "[{}] Task completed.\n{}".format(target_name, summary)
155
154
  else:
156
155
  print(colored("\n Task incomplete - providing feedback", "yellow"))
157
156
  if feedback:
158
- print(colored(" Feedback: " + feedback[:200] + "...", "white", attrs=["dark"]))
157
+ print(colored(" Feedback: " + feedback, "white", attrs=["dark"]))
159
158
 
160
159
  followup_lines = [
161
160
  "Continue the previous task. Feedback from orchestrator:",
@@ -1,8 +1,8 @@
1
1
  jinx_name: arxiv
2
2
  description: Search arXiv for preprints and papers
3
3
  inputs:
4
- - query: ""
5
- - limit: 10
4
+ - query: ""
5
+ - limit: 10
6
6
  steps:
7
7
  - name: search_arxiv
8
8
  engine: python
@@ -1,9 +1,9 @@
1
1
  jinx_name: paper_search
2
2
  description: Search for academic papers across multiple sources (Semantic Scholar, arXiv, local datasets)
3
3
  inputs:
4
- - query: ""
5
- - limit: 10
6
- - source: "all"
4
+ - query: ""
5
+ - limit: 10
6
+ - source: "all"
7
7
  steps:
8
8
  - name: search_papers
9
9
  engine: python
@@ -1,8 +1,8 @@
1
1
  jinx_name: semantic_scholar
2
2
  description: Search Semantic Scholar for academic papers. Requires S2_API_KEY env var.
3
3
  inputs:
4
- - query: ""
5
- - limit: 10
4
+ - query: ""
5
+ - limit: 10
6
6
  steps:
7
7
  - name: search_s2
8
8
  engine: python
@@ -1,11 +1,11 @@
1
1
  jinx_name: "build"
2
2
  description: "Build deployment artifacts for NPC team"
3
3
  inputs:
4
- - target: "flask" # The type of deployment target (e.g., flask, docker, cli, static).
5
- - outdir: "./build" # The output directory for built artifacts.
6
- - team: "./npc_team" # The path to the NPC team directory.
7
- - port: 5337 # The port for flask server builds.
8
- - cors: "" # Comma-separated CORS origins for flask server builds.
4
+ - target: "flask"
5
+ - outdir: "./build"
6
+ - team: "./npc_team"
7
+ - port: 5337
8
+ - cors: ""
9
9
  steps:
10
10
  - name: "execute_build"
11
11
  engine: "python"
@@ -1,8 +1,8 @@
1
1
  jinx_name: "compile"
2
2
  description: "Compile NPC profiles"
3
3
  inputs:
4
- - npc_file_path: "" # Optional path to a specific NPC file to compile.
5
- - npc_team_dir: "./npc_team" # Directory containing NPC profiles to compile, if no specific file is given.
4
+ - npc_file_path: ""
5
+ - npc_team_dir: "./npc_team"
6
6
  steps:
7
7
  - name: "compile_npcs"
8
8
  engine: "python"
@@ -1,7 +1,7 @@
1
1
  jinx_name: help
2
2
  description: Show help for commands, NPCs, or Jinxs
3
3
  inputs:
4
- - topic: null
4
+ - topic: null
5
5
  steps:
6
6
  - name: show_help
7
7
  engine: python
@@ -1,11 +1,11 @@
1
1
  jinx_name: "init"
2
2
  description: "Initialize NPC project"
3
3
  inputs:
4
- - directory: "." # The directory where the NPC project should be initialized.
5
- - templates: "" # Optional templates to use for initialization.
6
- - context: "" # Optional context for project initialization.
7
- - model: "" # Optional LLM model to set as default for the project.
8
- - provider: "" # Optional LLM provider to set as default for the project.
4
+ - directory: "."
5
+ - templates: ""
6
+ - context: ""
7
+ - model: ""
8
+ - provider: ""
9
9
  steps:
10
10
  - name: "initialize_project"
11
11
  engine: "python"
@@ -1,7 +1,7 @@
1
1
  jinx_name: jinxs
2
2
  description: "Show available jinxs organized by folder. Use /jinxs <path> for details on a specific folder."
3
3
  inputs:
4
- - path: "" # Optional path to show details for (e.g., "lib/core", "bin")
4
+ - path: ""
5
5
  steps:
6
6
  - name: list_jinxs
7
7
  engine: python
@@ -1,8 +1,8 @@
1
1
  jinx_name: "serve"
2
2
  description: "Serve an NPC Team"
3
3
  inputs:
4
- - port: 5337 # The port to run the Flask server on.
5
- - cors: "" # Comma-separated CORS origins.
4
+ - port: 5337
5
+ - cors: ""
6
6
  steps:
7
7
  - name: "start_flask_server"
8
8
  engine: "python"
@@ -1,8 +1,8 @@
1
1
  jinx_name: "set"
2
2
  description: "Set configuration values"
3
3
  inputs:
4
- - key: "" # The configuration key to set.
5
- - value: "" # The value to set for the configuration key.
4
+ - key: ""
5
+ - value: ""
6
6
  steps:
7
7
  - name: "set_config_value"
8
8
  engine: "python"
@@ -1,9 +1,9 @@
1
1
  jinx_name: switch
2
2
  description: Get or set a switch in the .ctx file
3
3
  inputs:
4
- - name: "" # Switch name
5
- - value: null # Value to set (omit to get current value)
6
- - scope: "workspace" # "workspace" or "global"
4
+ - name: ""
5
+ - value: null
6
+ - scope: "workspace"
7
7
 
8
8
  steps:
9
9
  - name: manage_switch
@@ -1,7 +1,7 @@
1
1
  jinx_name: switches
2
2
  description: List all switches from .ctx files
3
3
  inputs:
4
- - scope: "all" # "workspace", "global", or "all"
4
+ - scope: "all"
5
5
 
6
6
  steps:
7
7
  - name: list_switches
@@ -1,8 +1,8 @@
1
1
  jinx_name: teamviz
2
2
  description: "Visualize NPC team structure - NPCs, jinxs, and their relationships"
3
3
  inputs:
4
- - team_path: ""
5
- - save: ""
4
+ - team_path: ""
5
+ - save: ""
6
6
 
7
7
  steps:
8
8
  - name: visualize_team
npcsh/npc_team/sibiji.npc CHANGED
@@ -14,7 +14,7 @@ primary_directive: |
14
14
  You are sibiji, the orchestrator and general manager of the NPC team.
15
15
  Your role is to delegate tasks to appropriate specialist agents based on their expertise.
16
16
 
17
- When delegating, match the task to the agent whose primary_directive best fits.
17
+ When delegating, match the task to the agent whose primary_directive best fits. Basic search inquiries can be handled by yourself. Do not delegate unnecessarily.
18
18
  You have access to the delegate tool to pass tasks to other agents.
19
19
  jinxs:
20
20
  - lib/orchestration/delegate