@elisym/mcp 0.7.0 → 0.8.0

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.
package/README.md CHANGED
@@ -139,9 +139,25 @@ Check my wallet balance
139
139
 
140
140
  The assistant will use elisym MCP tools automatically to discover agents, submit jobs, handle payments, and receive results.
141
141
 
142
- ### Agent Skill (Claude Code, Hermes, OpenClaw)
142
+ ### Agent Skill (Claude Code, Hermes, OpenClaw, Cursor, Windsurf, ...)
143
143
 
144
- Alongside the MCP server, elisym ships an [agentskills.io](https://agentskills.io)-compatible skill at [`skills/elisym/SKILL.md`](../../skills/elisym/SKILL.md) in the monorepo root. Any agent runtime that reads the agentskills format (Claude Code, Hermes by Nous Research, OpenClaw by Bankr) can drop the file into its skills directory - the skill teaches the agent when to reach for elisym and walks it through discovery, job submission, payment, and result handling on top of this MCP server.
144
+ Alongside the MCP server, elisym ships [agentskills.io](https://agentskills.io)-compatible skills in [`skills/`](../../skills/) in the monorepo root. Install them into any agent runtime supported by [Vercel's Skills CLI](https://skills.sh):
145
+
146
+ ```bash
147
+ npx skills add elisymlabs/elisym
148
+ ```
149
+
150
+ This installs [`elisym-customer`](../../skills/elisym-customer/SKILL.md) (discover, hire, and pay agents) and [`elisym-provider`](../../skills/elisym-provider/SKILL.md) (run a provider that accepts paid jobs). The skills teach the host agent when to reach for elisym and walk it through discovery, job submission, payment, and result handling on top of this MCP server.
151
+
152
+ **Hermes (Nous Research)** is not a target of the Vercel Skills CLI yet - copy the files manually:
153
+
154
+ ```bash
155
+ mkdir -p ~/.hermes/skills/elisym-customer ~/.hermes/skills/elisym-provider
156
+ curl -o ~/.hermes/skills/elisym-customer/SKILL.md \
157
+ https://raw.githubusercontent.com/elisymlabs/elisym/main/skills/elisym-customer/SKILL.md
158
+ curl -o ~/.hermes/skills/elisym-provider/SKILL.md \
159
+ https://raw.githubusercontent.com/elisymlabs/elisym/main/skills/elisym-provider/SKILL.md
160
+ ```
145
161
 
146
162
  ## Security
147
163
 
package/dist/index.js CHANGED
@@ -1815,7 +1815,6 @@ ${text}`);
1815
1815
  }
1816
1816
  })
1817
1817
  ];
1818
- var LAST_SEEN_ONLINE_WINDOW_SECS = 10 * 60;
1819
1818
  var SEARCH_PING_TIMEOUT_MS = 3e3;
1820
1819
  var STOP_WORDS = /* @__PURE__ */ new Set([
1821
1820
  "a",
@@ -1982,24 +1981,20 @@ var discoveryTools = [
1982
1981
  )
1983
1982
  );
1984
1983
  }
1985
- if (!include_offline) {
1986
- const freshThreshold = Math.floor(Date.now() / 1e3) - LAST_SEEN_ONLINE_WINDOW_SECS;
1987
- filtered = filtered.filter((a) => a.lastSeen >= freshThreshold);
1988
- if (filtered.length > 0) {
1989
- const probes = await Promise.allSettled(
1990
- filtered.map(
1991
- (candidate) => agent.client.ping.pingAgent(candidate.pubkey, SEARCH_PING_TIMEOUT_MS)
1992
- )
1993
- );
1994
- const survivors = [];
1995
- filtered.forEach((candidate, index) => {
1996
- const probe = probes[index];
1997
- if (probe?.status === "fulfilled" && probe.value.online) {
1998
- survivors.push(candidate);
1999
- }
2000
- });
2001
- filtered = survivors;
2002
- }
1984
+ if (!include_offline && filtered.length > 0) {
1985
+ const probes = await Promise.allSettled(
1986
+ filtered.map(
1987
+ (candidate) => agent.client.ping.pingAgent(candidate.pubkey, SEARCH_PING_TIMEOUT_MS)
1988
+ )
1989
+ );
1990
+ const survivors = [];
1991
+ filtered.forEach((candidate, index) => {
1992
+ const probe = probes[index];
1993
+ if (probe?.status === "fulfilled" && probe.value.online) {
1994
+ survivors.push(candidate);
1995
+ }
1996
+ });
1997
+ filtered = survivors;
2003
1998
  }
2004
1999
  if (query) {
2005
2000
  const isAscii = /^[\u0000-\u007F]*$/.test(query);
@@ -2862,7 +2857,10 @@ program.action(
2862
2857
  await startServer(ctx);
2863
2858
  })
2864
2859
  );
2865
- program.command("init [name]").description("Create a new agent identity").option("-d, --description <desc>", "Agent description", "Elisym MCP agent").option("-n, --network <network>", "Solana network (devnet only)", "devnet").option("--install", "Also install into MCP clients").action(
2860
+ program.command("init [name]").description("Create a new agent identity").option("-d, --description <desc>", "Agent description", "Elisym MCP agent").option("-n, --network <network>", "Solana network (devnet only)", "devnet").option("--install", "Also install into MCP clients").option(
2861
+ "--passphrase <value>",
2862
+ 'Passphrase to encrypt secret keys at rest. Empty string ("") skips encryption. Also reads ELISYM_PASSPHRASE env var. When neither is provided, prompts interactively.'
2863
+ ).action(
2866
2864
  safe(async (name, options) => {
2867
2865
  const { default: inquirer } = await import('inquirer');
2868
2866
  if (!name) {
@@ -2898,14 +2896,23 @@ program.command("init [name]").description("Create a new agent identity").option
2898
2896
  );
2899
2897
  process.exit(1);
2900
2898
  }
2901
- const { passphrase } = await inquirer.prompt([
2902
- {
2903
- type: "password",
2904
- name: "passphrase",
2905
- message: "Passphrase to encrypt secret keys (leave blank for none):",
2906
- mask: "*"
2907
- }
2908
- ]);
2899
+ let passphrase;
2900
+ const envPassphrase = process.env.ELISYM_PASSPHRASE;
2901
+ if (options.passphrase !== void 0) {
2902
+ passphrase = options.passphrase;
2903
+ } else if (envPassphrase !== void 0) {
2904
+ passphrase = envPassphrase;
2905
+ } else {
2906
+ const answer = await inquirer.prompt([
2907
+ {
2908
+ type: "password",
2909
+ name: "passphrase",
2910
+ message: "Passphrase to encrypt secret keys (leave blank for none):",
2911
+ mask: "*"
2912
+ }
2913
+ ]);
2914
+ passphrase = answer.passphrase ?? "";
2915
+ }
2909
2916
  const nostrSecretKey = generateSecretKey();
2910
2917
  const nostrPubkey = getPublicKey(nostrSecretKey);
2911
2918
  const solanaSigner = await generateKeyPairSigner(true);