@ixo/asks-mcp 1.12.0-dev.2 → 1.12.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.
Files changed (2) hide show
  1. package/dist/asks-mcp.mjs +16 -13
  2. package/package.json +1 -1
package/dist/asks-mcp.mjs CHANGED
@@ -263660,7 +263660,7 @@ var init_callTerms = __esm({
263660
263660
  };
263661
263661
  reviewStart = (title) => (
263662
263662
  /* The person copies this into their agent, so it is in their words: no tool names (expert prompts review, 2.6). */
263663
- `I'm taking part in the review "${title ?? "\u2026"}" on pro.asks.world. Show me what the review asks for, then help me try each scenario and keep notes and screenshots as I go: what I did, what I expected and what I saw. Write up my findings with me, each with how serious it is and how to reproduce it, and my recommendations. Show me all of it, and hand it in as my report only when I say so.`
263663
+ `I'm taking part in the review "${title ?? "\u2026"}" on Pro Asks. Show me what the review asks for, then help me try each scenario and keep notes and screenshots as I go: what I did, what I expected and what I saw. Write up my findings with me, each with how serious it is and how to reproduce it, and my recommendations. Show me all of it, and hand it in as my report only when I say so.`
263664
263664
  );
263665
263665
  isReady = (fields) => missingOf(fields, { symbol: "", holds: null }).length === 0;
263666
263666
  legOrder = (fields) => legsOf({ mode: fields.mode === "hire" ? "hire" : void 0, money: fields.money ?? { prize: 0, runnersN: 0, runnersEach: 0, entryEach: 0, entryUpTo: 0 } });
@@ -265400,7 +265400,7 @@ function pageWords(page, site) {
265400
265400
  return [
265401
265401
  `@${p.handle} \xB7 ${p.name}${p.headline ? ` \xB7 ${p.headline}` : ""}`,
265402
265402
  page.linkedin ? `LinkedIn verified since ${page.linkedin.verifiedAt.slice(0, 10)}${page.linkedin.profileUrl ? ` \xB7 ${page.linkedin.profileUrl}` : ""}` : "Not LinkedIn verified yet",
265403
- page.linkedin?.credentialUrl ? `LinkedIn credential (a W3C VC signed by asks.world; it says only that this account logged in to this LinkedIn account): ${page.linkedin.credentialUrl}${page.linkedin.verifyUrl ? ` \xB7 verify: ${page.linkedin.verifyUrl}` : ""}` : page.linkedin?.credential ? "LinkedIn credential: kept private while the page is private (the owner downloads it on their profile page; it is published when the page goes public)." : "",
265403
+ page.linkedin?.credentialUrl ? `LinkedIn credential (it shows this account logged in to this LinkedIn account; any app can check it): ${page.linkedin.credentialUrl}${page.linkedin.verifyUrl ? ` \xB7 check it: ${page.linkedin.verifyUrl}` : ""}` : "",
265404
265404
  `Address: ${page.address}${p.location ? ` \xB7 ${p.location}` : ""}${p.timezone ? ` (${p.timezone})` : ""}`,
265405
265405
  `Does: ${p.does.length ? p.does.join(", ") : "not said"} \xB7 Rate: ${rate} \xB7 Availability: ${p.availability} \xB7 Invitable by handle: ${p.invitable ? "yes" : "no"}`,
265406
265406
  p.listed === false ? "Private: not shown on asks.world or in search; only someone who types the exact handle or address can invite them." : "Public: shown on asks.world, anyone can find it.",
@@ -265421,7 +265421,7 @@ ${p.education.map((one) => ` ${one.year ? `${one.year} \xB7 ` : ""}${one.title}
265421
265421
  ${block2.paragraphs.join("\n")}` : block2.kind === "pictures" ? `Pictures: ${block2.items.map((one) => `${one.alt} ${one.url}`).join("; ")}` : `Files: ${block2.items.map((one) => `${one.name} ${one.url}`).join("; ")}`
265422
265422
  ),
265423
265423
  p.links.length ? `Links: ${p.links.join(" ")}` : "",
265424
- `Page: ${proPage(site, p.handle)} on pro.asks.world; ${site.replace(/\/+$/, "")}/pro/pros/${p.handle} elsewhere on asks.world`
265424
+ `Page: ${proPage(site, p.handle)}`
265425
265425
  ].filter(Boolean).join("\n");
265426
265426
  }
265427
265427
  async function startLinkedin(site, signer2, fetchImpl) {
@@ -292284,7 +292284,7 @@ import { randomBytes as randomBytes7 } from "node:crypto";
292284
292284
  // package.json
292285
292285
  var package_default = {
292286
292286
  name: "@ixo/asks-mcp",
292287
- version: "1.12.0-dev.2",
292287
+ version: "1.12.0",
292288
292288
  description: "The Openhands Network MCP server: read the board, answer asks, post work and get paid on the ixo chain, with a key of its own on your machine.",
292289
292289
  license: "Apache-2.0",
292290
292290
  repository: {
@@ -292647,7 +292647,7 @@ var TOOLS = {
292647
292647
  },
292648
292648
  set_my_page: {
292649
292649
  title: "Write your pro page",
292650
- description: "Make or change the pro page of the person you act for (or this key's own): the page posters find and invite them by, on pro.asks.world and across asks.world. A handle, a name, a headline, what they do, a rate, links, availability, whether posters may invite them by handle, and `listed`: public (the default, anyone can find the page) or private (off asks.world and search; only someone who types the exact handle or address can invite them). Ask once, plainly, which they want. A private page can have a secret link (`share_link`: create, or replace to switch the old one off), said once on confirm. Previews by default; call again with confirm: true to sign. For guided setup, follow /pro/mcp.md#create-your-pro-profile on the matching Pro Asks host. Start with connect_linkedin: its verified profile pre-fills the name, headline, LinkedIn link and handle; ask only for what LinkedIn lacks (the work they take, rate, availability, a line about them). This tool reads no site itself, so build the rest from what the person tells you or pastes. Spends nothing.",
292650
+ description: "Make or change the pro page of the person you act for (or this key's own): the page posters find and invite them by, on Pro Asks and across asks.world. A handle, a name, a headline, what they do, a rate, links, availability, whether posters may invite them by handle, and `listed`: public (the default, anyone can find the page) or private (off asks.world and search; only someone who types the exact handle or address can invite them). Ask once, plainly, which they want. A private page can have a secret link (`share_link`: create, or replace to switch the old one off), said once on confirm. Previews by default; call again with confirm: true to sign. For guided setup, follow /pro/mcp.md#create-your-pro-profile on the matching Pro Asks host. Start with connect_linkedin: its verified profile pre-fills the name, headline, LinkedIn link and handle; ask only for what LinkedIn lacks (the work they take, rate, availability, a line about them). This tool reads no site itself, so build the rest from what the person tells you or pastes. Spends nothing.",
292651
292651
  spends: false,
292652
292652
  hosted: false,
292653
292653
  annotations: { ...acts, idempotentHint: true }
@@ -292668,7 +292668,7 @@ var TOOLS = {
292668
292668
  },
292669
292669
  list_marketplaces: {
292670
292670
  title: "List Zones",
292671
- description: "The Zones of pro.asks.world: a pro ask names one (draft_call's `sponsor`): the pros invited are LinkedIn verified, and it earns the Zone's share of each approved report. For each: its name and slug, what it does, since when, and how many LinkedIn-verified pros are on its roster. A pro gets on every roster with connect_linkedin. Nothing ranks them. Spends nothing.",
292671
+ description: "The Zones of Pro Asks: a pro ask names one (draft_call's `sponsor`): the pros invited are LinkedIn verified, and it earns the Zone's share of each approved report. For each: its name and slug, what it does, since when, and how many LinkedIn-verified pros are on its roster. A pro gets on every roster with connect_linkedin. Nothing ranks them. Spends nothing.",
292672
292672
  spends: false,
292673
292673
  hosted: false,
292674
292674
  annotations: reads
@@ -292689,7 +292689,7 @@ var TOOLS = {
292689
292689
  },
292690
292690
  set_marketplace_page: {
292691
292691
  title: "Write your Zone's page",
292692
- description: "Write the page of the Zone the person you act for hosts (or this key's own, when it is the Zone's account) on pro.asks.world: its own words, under the line every Zone's page opens with. A deck line, a logo, a cover, its story in paragraphs, how it verifies pros as steps, pictures and links; every picture, logo and link is an https address on its own site, and nothing is uploaded. It replaces the page whole. Previews the page as text by default: show it to the person, and call again with confirm: true to sign and publish it only once they say yes. Only an approved Zone's account, or the agent it connected, can. Answers with the page's address. Spends nothing.",
292692
+ description: "Write the page of the Zone the person you act for hosts (or this key's own, when it is the Zone's account) on Pro Asks: its own words, under the line every Zone's page opens with. A deck line, a logo, a cover, its story in paragraphs, how it verifies pros as steps, pictures and links; every picture, logo and link is an https address on its own site, and nothing is uploaded. It replaces the page whole. Previews the page as text by default: show it to the person, and call again with confirm: true to sign and publish it only once they say yes. Only an approved Zone's account, or the agent it connected, can. Answers with the page's address. Spends nothing.",
292693
292693
  spends: false,
292694
292694
  hosted: false,
292695
292695
  annotations: { ...acts, idempotentHint: true }
@@ -296178,7 +296178,7 @@ tx ${result.transactionHash}${leftWords}`);
296178
296178
  };
296179
296179
  if (offered("get_connect_link")) server2.registerTool(
296180
296180
  "get_connect_link",
296181
- { ...meta3("get_connect_link"), inputSchema: { reviews: external_exports.boolean().optional().describe("true when the person is a builder or specialist on pro.asks.world: the link opens the same connect page inside that world.") } },
296181
+ { ...meta3("get_connect_link"), inputSchema: { reviews: external_exports.boolean().optional().describe("true when the person is a builder or specialist on Pro Asks: the link opens the same connect page inside that world.") } },
296182
296182
  async ({ reviews }) => {
296183
296183
  const mine = await address2();
296184
296184
  const pairing = await Promise.resolve().then(() => (init_pairing(), pairing_exports));
@@ -296559,7 +296559,7 @@ Mapping pays for the report. What happens to a mapped pin afterwards is a separa
296559
296559
  brief: external_exports.array(external_exports.string().max(1500)).max(8).optional().describe("The story, up to eight short paragraphs, in the person's words."),
296560
296560
  lines: external_exports.array(external_exports.object({ text: external_exports.string().max(300), fail: external_exports.string().max(300).optional() })).max(5).optional().describe('The five requirements the jury reviews. For each, write the requirement in `text` and the condition that fails it in `fail`. Write `fail` as a clause completing "Fail this only if \u2026", for example "it names no page". Include all five.'),
296561
296561
  mode: external_exports.enum(["competition", "hire"]).optional().describe("competition: a pick and runners-up beside the paid entries. hire: every entry that passes is paid the same, up to a number, and nobody is picked."),
296562
- kind: external_exports.literal("review").optional().describe("review: a pro ask on pro.asks.world, a review of an app or an agent. LinkedIn-verified pros, invited through the Zone you name (sponsor), try the scenarios and hand in review reports; every report that passes the lines is paid the same (a hire); by invitation only; the five lines default to the review's own unless given. Asky Pro Checker, the verifier, checks each report for its own fee per check, held with the reward."),
296562
+ kind: external_exports.literal("review").optional().describe("review: a pro ask on Pro Asks, a review of an app or an agent. LinkedIn-verified pros, invited through the Zone you name (sponsor), try the scenarios and hand in review reports; every report that passes the lines is paid the same (a hire); by invitation only; the five lines default to the review's own unless given. Asky Pro Checker, the verifier, checks each report for its own fee per check, held with the reward."),
296563
296563
  sponsor: external_exports.string().max(40).optional().describe("A pro ask: the Zone's slug, as list_marketplaces gives it. The pros you invite come from its roster; it earns the Zone's share."),
296564
296564
  subject: external_exports.object({ name: external_exports.string().max(120), version: external_exports.string().max(40).optional(), where: external_exports.string().max(2048).optional() }).optional().describe("A review: what is reviewed, the version to test, and where a specialist finds it (a public address). Private access goes in the invitation note, never here."),
296565
296565
  scenarios: external_exports.array(external_exports.string().max(300)).max(8).optional().describe("A review: the scenarios to try, one line each; every report must cover each with a step."),
@@ -297335,7 +297335,7 @@ Here's your private link: ${link5.url}. Anyone with it can see your page; ask me
297335
297335
 
297336
297336
  No private link was made: ${link5.refused}.`;
297337
297337
  if (read9.profile.listed === false) return text4(`Saved the private profile for ${answer.address}. It is not shown on asks.world or in search; posters who type "@${answer.handle}" or the address can still invite them.${linkLine}`);
297338
- return text4(`Published the profile for ${answer.address}: ${proPage(SITE, answer.handle)}. Also available at ${SITE}/pro/pros/${answer.handle}. Posters invite them with "@${answer.handle}".${linkLine}`);
297338
+ return text4(`Published the profile for ${answer.address}: ${proPage(SITE, answer.handle)}. Posters invite them with "@${answer.handle}".${linkLine}`);
297339
297339
  }
297340
297340
  );
297341
297341
  if (offered("my_page")) server2.registerTool("my_page", { ...meta3("my_page"), inputSchema: {} }, async () => {
@@ -297346,7 +297346,9 @@ No private link was made: ${link5.refused}.`;
297346
297346
  return text4(`${invitesModule.pageWords(page, SITE)}
297347
297347
  ${page.shared ? 'Private link: there is one (it is shown only when made; set_my_page with share_link: "replace" gives a new one and switches the old one off).' : 'Private link: none (set_my_page with share_link: "create" makes one).'}
297348
297348
 
297349
- Edit the profile at ${EXPERT_SITE}/pro/profile.${page.linkedin ? "" : " Next: connect_linkedin verifies it, so you can be invited to pro asks."}`);
297349
+ ${page.linkedin?.credentialUrl || page.linkedin?.credential ? `${credentialWords(page.linkedin, page.profile.listed !== false)}
297350
+
297351
+ ` : ""}Edit the profile at ${EXPERT_SITE}/pro/profile.${page.linkedin ? "" : " Next: connect_linkedin verifies it, so you can be invited to pro asks."}`);
297350
297352
  });
297351
297353
  if (offered("list_marketplaces")) server2.registerTool("list_marketplaces", { ...meta3("list_marketplaces"), inputSchema: {} }, async () => {
297352
297354
  const marketplaces = await Promise.resolve().then(() => (init_marketplaces(), marketplaces_exports));
@@ -297437,6 +297439,7 @@ Show it to the person. Then call again with the same page and confirm: true to s
297437
297439
  return text4(`Published ${mine.name}'s page: ${marketplacePage(SITE, answer.slug)}. Signed ${acting ? `for ${owner} by this agent` : `by ${owner}`}. Pages refresh within five minutes.`);
297438
297440
  }
297439
297441
  );
297442
+ const credentialWords = (linkedin, listed) => linkedin?.credentialUrl && listed ? `You also have a LinkedIn credential: it shows you logged in to this LinkedIn account, and any app can check it. Its public link: ${linkedin.credentialUrl}. Download it at ${EXPERT_SITE}/pro/profile.` : `You also have a LinkedIn credential: it shows you logged in to this LinkedIn account, and any app can check it. ${listed && !linkedin?.credential && !linkedin?.credentialUrl ? "It appears on your page once the page is published." : "Only you can see it while your page is private; it goes public when the page does."} Download it at ${EXPERT_SITE}/pro/profile.`;
297440
297443
  if (offered("connect_linkedin")) server2.registerTool(
297441
297444
  "connect_linkedin",
297442
297445
  {
@@ -297469,7 +297472,7 @@ Show it to the person. Then call again with the same page and confirm: true to s
297469
297472
  ...!page && /^[a-z][a-z0-9-]{2,29}$/.test(vanity) ? { handle: vanity } : {}
297470
297473
  };
297471
297474
  return text4(
297472
- `LinkedIn verified${profile?.name ? ` as ${profile.name}` : ""}. Next: I'll fill your pro page from LinkedIn; you only add the work you take and your rate.
297475
+ `LinkedIn verified${profile?.name ? ` as ${profile.name}` : ""}. ${status.credential ? `${credentialWords(page?.linkedin ?? null, page?.profile.listed !== false)} ` : ""}Next: I'll fill your pro page from LinkedIn; you only add the work you take and your rate.
297473
297476
 
297474
297477
  (Pre-fill set_my_page with this, only where the page does not already say it${page ? "; they have a page, so keep its handle" : ""}. Ask only what LinkedIn lacks: the work they take, rate, availability, a line about them. Then preview.)
297475
297478
  ${asData("linkedin", JSON.stringify(prefill, null, 2))}`
@@ -297489,7 +297492,7 @@ ${asData("linkedin", JSON.stringify(prefill, null, 2))}`
297489
297492
  if (!confirm)
297490
297493
  return text4(
297491
297494
  [
297492
- `This takes down @${page.profile.handle} (${where2}, ${proPage(SITE, page.profile.handle)} on pro.asks.world), the page of ${owner}${acting ? ", the person this key acts for" : ""}:`,
297495
+ `This takes down @${page.profile.handle} (${where2}), the page of ${owner}${acting ? ", the person this key acts for" : ""}:`,
297493
297496
  `- The page and everything on it are deleted: the CV, the rate, the links, and the LinkedIn tick (that LinkedIn can verify again later). It leaves the Hands directory. This can't be undone.`,
297494
297497
  `- The handle @${page.profile.handle} is freed, and anybody may take it. Posters can no longer invite them by it.`,
297495
297498
  `- Invitations already on a call's list name the address, and stay. Their work and decisions are the public record and are not touched.`,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ixo/asks-mcp",
3
- "version": "1.12.0-dev.2",
3
+ "version": "1.12.0",
4
4
  "description": "The Openhands Network MCP server: read the board, answer asks, post work and get paid on the ixo chain, with a key of its own on your machine.",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {