@agent-smith/cli 0.0.109 → 0.0.110

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 (43) hide show
  1. package/dist/cli.js +1 -0
  2. package/dist/cmd/clicmds/aliases.js +11 -0
  3. package/dist/cmd/clicmds/base.js +3 -0
  4. package/dist/cmd/clicmds/cmds.js +9 -0
  5. package/dist/cmd/clicmds/updateconf.js +1 -0
  6. package/dist/cmd/cmds.js +70 -0
  7. package/dist/cmd/lib/actions/cmd.js +21 -1
  8. package/dist/cmd/lib/actions/read.js +4 -0
  9. package/dist/cmd/lib/adaptaters/cmd.js +8 -1
  10. package/dist/cmd/lib/agents/cmd.js +2 -1
  11. package/dist/cmd/lib/mcp.js +6 -0
  12. package/dist/cmd/lib/options_parsers.js +5 -0
  13. package/dist/cmd/lib/tasks/cmd.js +89 -4
  14. package/dist/cmd/lib/tasks/conf.js +35 -0
  15. package/dist/cmd/lib/tasks/read.js +30 -1
  16. package/dist/cmd/lib/tools.js +10 -4
  17. package/dist/cmd/lib/user_msgs.js +4 -3
  18. package/dist/cmd/lib/utils.js +5 -0
  19. package/dist/cmd/lib/workflows/cmd.js +24 -1
  20. package/dist/cmd/lib/workflows/read.js +5 -0
  21. package/dist/cmd/options.js +1 -0
  22. package/dist/cmd/sys/clipboard.js +25 -0
  23. package/dist/cmd/sys/execute.js +1 -0
  24. package/dist/cmd/sys/read_cmds.js +2 -2
  25. package/dist/cmd/sys/read_conf.js +1 -0
  26. package/dist/cmd/sys/read_features.js +1 -0
  27. package/dist/cmd/sys/run_python.js +4 -0
  28. package/dist/conf.d.ts +5 -1
  29. package/dist/conf.js +6 -2
  30. package/dist/db/db.js +1 -0
  31. package/dist/db/read.js +1 -0
  32. package/dist/db/write.js +32 -0
  33. package/dist/index.js +8 -0
  34. package/dist/main.d.ts +17 -2
  35. package/dist/main.js +16 -1
  36. package/dist/state/backends.js +14 -0
  37. package/dist/state/plugins.js +3 -0
  38. package/dist/state/state.js +21 -2
  39. package/dist/state/tasks.d.ts +2 -1
  40. package/dist/state/tasks.js +8 -1
  41. package/dist/utils/text.js +4 -0
  42. package/dist/utils/user_msgs.js +2 -0
  43. package/package.json +14 -14
package/dist/cli.js CHANGED
@@ -6,6 +6,7 @@ import { backend } from './state/backends.js';
6
6
  async function query(program) {
7
7
  const data = { message: "$", default: "" };
8
8
  const q = await input(data);
9
+ //console.log("QUERY", q);
9
10
  const args = q.split(" ");
10
11
  await program.parseAsync(args, { from: "user" });
11
12
  if (isChatMode.value) {
@@ -4,6 +4,7 @@ import { executeWorkflowCmd } from "../lib/workflows/cmd.js";
4
4
  import { executeAgentCmd } from "../lib/agents/cmd.js";
5
5
  function initCommandsFromAliases(program, aliases, features) {
6
6
  aliases.forEach((alias) => {
7
+ //console.log("A", alias)
7
8
  switch (alias.type) {
8
9
  case "agent":
9
10
  const agcmd = program.command(`${alias.name} [prompt_and_vars...]`)
@@ -12,6 +13,7 @@ function initCommandsFromAliases(program, aliases, features) {
12
13
  await executeAgentCmd(alias.name, args);
13
14
  });
14
15
  allOptions.forEach(o => agcmd.addOption(o));
16
+ //console.log("TVARS", alias.name, features.task[alias.name]?.variables)
15
17
  if (features.agent[alias.name]?.variables) {
16
18
  const rtv = features.agent[alias.name].variables?.required;
17
19
  if (rtv) {
@@ -34,6 +36,7 @@ function initCommandsFromAliases(program, aliases, features) {
34
36
  await executeTaskCmd(alias.name, args);
35
37
  });
36
38
  allOptions.forEach(o => tcmd.addOption(o));
39
+ //console.log("TVARS", alias.name, features.task[alias.name]?.variables)
37
40
  if (features.task[alias.name]?.variables) {
38
41
  const rtv = features.task[alias.name].variables?.required;
39
42
  if (rtv) {
@@ -49,6 +52,14 @@ function initCommandsFromAliases(program, aliases, features) {
49
52
  }
50
53
  }
51
54
  break;
55
+ /*case "action":
56
+ const acmd = program.command(`${alias.name} [args...]`)
57
+ .description("action: " + alias.name)
58
+ .action(async (...args: Array<any>) => {
59
+ await executeActionCmd(alias.name, args)
60
+ });
61
+ allOptions.forEach(o => acmd.addOption(o));
62
+ break;*/
52
63
  case "workflow":
53
64
  const wcmd = program.command(`${alias.name} [args...]`)
54
65
  .description("workflow: " + alias.name)
@@ -5,6 +5,9 @@ import { processTaskCmd, processTasksCmd, resetDbCmd } from "./cmds.js";
5
5
  import { updateConfCmd, updateFeaturesCmd } from "./updateconf.js";
6
6
  import { displayOptions, inferenceOptions } from "../options.js";
7
7
  function initBaseCommands(program) {
8
+ /*program.command("ping")
9
+ .description("ping inference servers")
10
+ .action(async (...args: Array<any>) => { console.log("Found working inference server(s):", await initAgent(initRemoteBackends())) });*/
8
11
  program.command("exit")
9
12
  .description("exit the cli")
10
13
  .action(() => process.exit(0));
@@ -18,12 +18,14 @@ async function initUserCmds(cmdFeats, program) {
18
18
  const features = Object.values(cmdFeats);
19
19
  const usrCmds = [];
20
20
  for (const feat of features) {
21
+ //console.log("Init cmd", feat);
21
22
  const hasVariables = feat?.variables ? true : false;
22
23
  const vars = hasVariables ? feat.variables : {};
23
24
  let desc = "";
24
25
  if (hasVariables) {
25
26
  desc = vars.description;
26
27
  }
28
+ // @ts-ignore
27
29
  const cmd = program.command(feat.variables.name)
28
30
  .description(desc)
29
31
  .action(async (...args) => {
@@ -43,6 +45,7 @@ async function initUserCmds(cmdFeats, program) {
43
45
  cmd.addOption(new Option(opt[0], opt[1]));
44
46
  }
45
47
  else {
48
+ // predefined option
46
49
  switch (opt) {
47
50
  case "all":
48
51
  allOptions.forEach(o => cmd.addOption(o));
@@ -64,6 +67,7 @@ async function initUserCmds(cmdFeats, program) {
64
67
  }
65
68
  usrCmds.push(cmd);
66
69
  }
70
+ //console.log("USRCMDS", usrCmds.map(c => c.name()))
67
71
  return usrCmds;
68
72
  }
69
73
  async function resetDbCmd() {
@@ -79,6 +83,7 @@ async function processTasksCmd(args, options) {
79
83
  if (!isTaskSettingsInitialized.value) {
80
84
  initTaskSettings();
81
85
  }
86
+ //console.log("PTS", tasksSettings);
82
87
  console.log(YAML.stringify({ "tasks": tasksSettings }));
83
88
  }
84
89
  else {
@@ -87,6 +92,7 @@ async function processTasksCmd(args, options) {
87
92
  }
88
93
  }
89
94
  async function processTaskCmd(args, options) {
95
+ //console.log("TASK OPTS", options);
90
96
  if (args.length == 0) {
91
97
  console.warn("Provide a task name");
92
98
  return;
@@ -101,10 +107,12 @@ async function processTaskCmd(args, options) {
101
107
  console.log("Task", args[0], "reset ok");
102
108
  return;
103
109
  }
110
+ //console.log("RT", path)
104
111
  const res = readTask(path);
105
112
  if (!res.found) {
106
113
  throw new Error(`Task ${args[0]}, ${path} not found`);
107
114
  }
115
+ //const ts = JSON.parse(res.ymlTask);
108
116
  console.log(res.ymlTask);
109
117
  if (Object.keys(options).length > 0) {
110
118
  upsertTaskSettings(args[0], options);
@@ -122,5 +130,6 @@ async function processTaskCmd(args, options) {
122
130
  }
123
131
  console.log(colors.dim("Settings") + ":", display);
124
132
  }
133
+ //console.log(JSON.stringify(ts, null, " "));
125
134
  }
126
135
  export { initUserCmds, processTaskCmd, processTasksCmd, resetDbCmd, };
@@ -42,6 +42,7 @@ async function updateFeaturesCmd(options) {
42
42
  }
43
43
  async function updateConfCmd(args) {
44
44
  initDb(false, true);
45
+ // try to find a conf path in db
45
46
  const { found, path } = readFilePath("conf");
46
47
  const userProvidedConfPath = (args[0] != "conf") ? args[0] : null;
47
48
  if (!found && !userProvidedConfPath) {
package/dist/cmd/cmds.js CHANGED
@@ -7,8 +7,11 @@ import { isChatMode, runMode } from "../state/state.js";
7
7
  import { initCommandsFromAliases } from "./clicmds/aliases.js";
8
8
  import { initBaseCommands } from "./clicmds/base.js";
9
9
  import { initUserCmds } from "./clicmds/cmds.js";
10
+ import { exit } from "node:process";
11
+ //import { usePerfTimer } from "../main.js";
10
12
  const program = new Command();
11
13
  async function chat(program, options, agent, mcpServers) {
14
+ //console.log("CHAT OPTS", options);
12
15
  const data = { message: '>', default: "" };
13
16
  const prompt = await input(data);
14
17
  if (prompt == "/q") {
@@ -21,21 +24,88 @@ async function chat(program, options, agent, mcpServers) {
21
24
  await query(program);
22
25
  }
23
26
  }
27
+ //console.log("CHAT HIST", agent.history);
28
+ //options.history = undefined;
29
+ //console.log("RUN W PROMPT", prompt);
24
30
  await agent.run(prompt, chatInferenceParams, options, chatTemplate ? chatTemplate : undefined);
25
31
  console.log();
26
32
  await chat(program, options, agent, mcpServers);
27
33
  }
28
34
  async function buildCmds() {
35
+ //program.allowUnknownOption(true);
36
+ //const perf = usePerfTimer();
29
37
  initBaseCommands(program);
38
+ //perf.measure("initBaseCommands");
30
39
  const aliases = readAliases();
40
+ //perf.measure("readAliases");
31
41
  const feats = readFeatures();
42
+ //perf.measure("readFeatures");
32
43
  initCommandsFromAliases(program, aliases, feats);
44
+ //perf.measure("initCommandsFromAliases");
33
45
  await initUserCmds(feats.cmd, program);
46
+ //perf.measure("initUserCmds");
47
+ //perf.measure("cmds for each");
48
+ //perf.final("buildCmds");
34
49
  return program;
35
50
  }
51
+ /*async function buildCmds(): Promise<Command> {
52
+ // Performance measurement start
53
+ const startTime = process.hrtime.bigint();
54
+ const measurements: { name: string; time: number; percentage: number }[] = [];
55
+ let lastTime = startTime;
56
+
57
+ function measureFunction(name: string) {
58
+ const currentTime = process.hrtime.bigint();
59
+ const elapsedNs = Number(currentTime - lastTime);
60
+ const elapsedSec = elapsedNs / 1_000_000_000;
61
+ measurements.push({ name, time: elapsedSec, percentage: 0 });
62
+ lastTime = currentTime;
63
+ }
64
+
65
+ //program.allowUnknownOption(true);
66
+ measureFunction("start");
67
+ initBaseCommands(program);
68
+
69
+ measureFunction("initBaseCommands");
70
+ const aliases = readAliases();
71
+
72
+ measureFunction("readAliases");
73
+ const feats = readFeatures();
74
+
75
+ measureFunction("readFeatures");
76
+ initCommandsFromAliases(program, aliases, feats);
77
+
78
+ measureFunction("initCommandsFromAliases");
79
+ const cmds = await initUserCmds(feats.cmd);
80
+
81
+ measureFunction("initUserCmds");
82
+ cmds.forEach(c => {
83
+ //console.log("Add cmd", c.name());
84
+ program.addCommand(c)
85
+ });
86
+ measureFunction("cmds.forEach");
87
+
88
+ // Calculate percentages and display results
89
+ const totalTime = Number(process.hrtime.bigint() - startTime) / 1_000_000_000;
90
+ measurements.forEach(m => {
91
+ m.percentage = (m.time / totalTime) * 100;
92
+ });
93
+
94
+ console.log("\nPerformance Measurements for buildCmds:");
95
+ measurements.forEach(m => {
96
+ console.log(`${m.name}: ${m.time.toFixed(6)}s (${m.percentage.toFixed(2)}%)`);
97
+ });
98
+ console.log(`Total time: ${totalTime.toFixed(6)}s\n`);
99
+
100
+ return program
101
+ }*/
36
102
  async function parseCmd(program) {
37
103
  program.name('Agent Smith terminal client');
38
104
  program.description('Terminal agents toolkit');
39
105
  await program.parseAsync();
106
+ exit(0);
107
+ /*if (isChatMode.value) {
108
+ await chat(program)
109
+ }*/
40
110
  }
41
111
  export { buildCmds, chat, parseCmd, program };
@@ -12,6 +12,7 @@ import { pathToFileURL } from 'url';
12
12
  import { getInputFromOptions } from '../tasks/utils.js';
13
13
  async function executeAction(name, payload, options, quiet = false) {
14
14
  let run;
15
+ //console.log("GET ACTION", name, payload);
15
16
  const inputData = await getInputFromOptions(options);
16
17
  if (inputData) {
17
18
  if (Array.isArray(payload)) {
@@ -22,11 +23,14 @@ async function executeAction(name, payload, options, quiet = false) {
22
23
  if (!found) {
23
24
  throw new Error(`Action ${name} not found at ${path}`);
24
25
  }
26
+ //console.log("CREATE ACTION", name, ext, path);
25
27
  switch (ext) {
26
28
  case "js":
27
29
  const url = pathToFileURL(path).href;
28
- const mjsa = await import(url);
30
+ //console.log("CR JSA", url);
31
+ const mjsa = await import(/* @vite-ignore */ url);
29
32
  run = createJsAction(mjsa.action);
33
+ //console.log("END CR JSA")
30
34
  break;
31
35
  case "yml":
32
36
  run = systemAction(path);
@@ -37,6 +41,7 @@ async function executeAction(name, payload, options, quiet = false) {
37
41
  default:
38
42
  throw new Error(`Action ext ${ext} not implemented`);
39
43
  }
44
+ //console.log("RUN", payload);
40
45
  const res = await run(payload, options);
41
46
  if (!quiet) {
42
47
  if (res) {
@@ -47,7 +52,9 @@ async function executeAction(name, payload, options, quiet = false) {
47
52
  return res;
48
53
  }
49
54
  async function executeActionCmd(name, aargs, quiet = false) {
55
+ //console.log("AARGs", aargs)
50
56
  const { args, options } = parseCommandArgs(aargs);
57
+ //console.log("CMDA", args)
51
58
  const params = args;
52
59
  if (options?.clipBoardInput) {
53
60
  params.push(await readClipboard());
@@ -62,9 +69,12 @@ async function executeActionCmd(name, aargs, quiet = false) {
62
69
  }
63
70
  function systemAction(path) {
64
71
  const run = async (params) => {
72
+ //console.log("SYS ACTION PARAMS", params);
65
73
  let runArgs = new Array();
74
+ // convert args for tool calls
66
75
  if (!Array.isArray(params)) {
67
76
  try {
77
+ // obviously a tool call
68
78
  if (typeof params == "string") {
69
79
  runArgs.push(params);
70
80
  }
@@ -83,9 +93,12 @@ function systemAction(path) {
83
93
  if (!actionSpec.found) {
84
94
  runtimeError("System action yml file", path, "not found");
85
95
  }
96
+ //console.log("Yml action", JSON.stringify(actionSpec.data, null, " "));
97
+ //console.log("Args", args)
86
98
  if (!actionSpec.data?.args) {
87
99
  actionSpec.data.args = [];
88
100
  }
101
+ //console.log("EXEC", actionSpec.data.cmd, [...actionSpec.data.args, ...runArgs]);
89
102
  const out = await execute(actionSpec.data.cmd, [...actionSpec.data.args, ...runArgs]);
90
103
  return out.trim();
91
104
  };
@@ -93,9 +106,11 @@ function systemAction(path) {
93
106
  }
94
107
  function pythonAction(path) {
95
108
  const run = async (params) => {
109
+ //console.log("PY ACTION PARAMS", params);
96
110
  let runArgs = new Array();
97
111
  if (!Array.isArray(params)) {
98
112
  try {
113
+ // obviously a tool call
99
114
  if (typeof params == "string") {
100
115
  runArgs.push(params);
101
116
  }
@@ -110,7 +125,11 @@ function pythonAction(path) {
110
125
  else {
111
126
  runArgs = params;
112
127
  }
128
+ //console.log("Py action", path);
113
129
  const { data, error } = await runPyScript(pyShell, "python3", path, runArgs);
130
+ /*console.log("----------------");
131
+ console.log("PYOUT", data);
132
+ console.log("----------------");*/
114
133
  if (error) {
115
134
  throw new Error(`python error: ${error}`);
116
135
  }
@@ -125,6 +144,7 @@ function pythonAction(path) {
125
144
  }
126
145
  catch (e) {
127
146
  console.warn("Can not parse json from python action", path, e);
147
+ //throw new Error(`python error: ${error}`)
128
148
  }
129
149
  }
130
150
  return final;
@@ -1,10 +1,14 @@
1
1
  function createJsAction(action) {
2
2
  const run = async (args, options) => {
3
+ //console.log("JS ACTION PARAMS", args);
3
4
  try {
4
5
  const res = await action(args, options);
5
6
  return res;
6
7
  }
7
8
  catch (e) {
9
+ /*if (e?.text) {
10
+ throw new Error(`executing action:${e.text()}. Args: ${args}`);
11
+ }*/
8
12
  throw new Error(`executing action:${e}. Args: ${args}`);
9
13
  }
10
14
  };
@@ -3,6 +3,9 @@ import { createJsAction } from "../actions/read.js";
3
3
  import { pathToFileURL } from 'url';
4
4
  import { getInputFromOptions } from "../tasks/utils.js";
5
5
  async function executeAdaptater(name, params, options) {
6
+ /*if (params?.args) {
7
+ params = params.args;
8
+ }*/
6
9
  const { found, path } = getFeatureSpec(name, "adaptater");
7
10
  if (!found) {
8
11
  throw new Error(`adaptater ${name} not found`);
@@ -15,11 +18,13 @@ async function executeAdaptater(name, params, options) {
15
18
  }
16
19
  let run;
17
20
  const url = pathToFileURL(path).href;
18
- const jsa = await import(url);
21
+ const jsa = await import(/* @vite-ignore */ url);
19
22
  run = createJsAction(jsa.action);
20
23
  let res;
21
24
  try {
25
+ //console.log("ADAPT RUN PARAMS", params);
22
26
  res = await run(params, options);
27
+ //console.log("ADAPT RES", res);
23
28
  }
24
29
  catch (e) {
25
30
  throw new Error(`adaptater ${name}: ${e}`);
@@ -27,6 +32,8 @@ async function executeAdaptater(name, params, options) {
27
32
  if (res?.error) {
28
33
  throw res.error;
29
34
  }
35
+ //await processOutput(res);
36
+ //console.log("ADRES", res);
30
37
  return res;
31
38
  }
32
39
  export { executeAdaptater, };
@@ -5,6 +5,7 @@ async function executeAgentCmd(name, targs = []) {
5
5
  const ca = parseCommandArgs(targs);
6
6
  const prompt = await getTaskPrompt(name, ca.args, ca.options);
7
7
  ca.options.isAgent = true;
8
- return await executeTask(name, { prompt: prompt }, ca.options);
8
+ const res = await executeTask(name, { prompt: prompt }, ca.options);
9
+ return res;
9
10
  }
10
11
  export { executeAgentCmd, };
@@ -9,6 +9,9 @@ class McpClient {
9
9
  askUserTools = null;
10
10
  tools = {};
11
11
  constructor(servername, command, args, authorizedTools = null, askUserTools = null) {
12
+ //console.log("MCP servername", servername);
13
+ //console.log("MCP command", command);
14
+ //console.log("MCP ARGS", typeof args, args);
12
15
  this.name = servername;
13
16
  const okargs = new Array();
14
17
  for (const arg of args) {
@@ -59,7 +62,9 @@ class McpClient {
59
62
  argsTypes[k] = vv.type;
60
63
  }
61
64
  }
65
+ //console.log("MCP ARGS TYPES", argsTypes);
62
66
  const exec = async (args) => {
67
+ //console.log("MCP EXEC ARGS", args);
63
68
  const _iargs = args;
64
69
  for (const [k, v] of Object.entries(_iargs)) {
65
70
  if (argsTypes[k] == "array") {
@@ -76,6 +81,7 @@ class McpClient {
76
81
  name: tool.name,
77
82
  arguments: _iargs,
78
83
  };
84
+ //console.log("PAY", payload);
79
85
  const res = await this.client.callTool(payload);
80
86
  return res;
81
87
  };
@@ -1,11 +1,16 @@
1
1
  function parseCommandArgs(args) {
2
+ //return { args: program.args, options: program.opts() }
3
+ //discard the command (last arg)
2
4
  args.pop();
5
+ //console.log("Raw command args:", args);
3
6
  const res = {
4
7
  args: new Array(),
5
8
  options: {},
6
9
  };
7
10
  res.options = args.pop();
8
11
  res.args = Array.isArray(args[0]) ? args[0] : args;
12
+ //console.log("PARSE ARGS RES", res.args);
13
+ //console.log("PARSE OPTS RES", res.options);
9
14
  return res;
10
15
  }
11
16
  function parseTaskConfigOptions(options) {