@ixo/asks-mcp 1.12.0-dev.3 → 1.12.1-dev.1

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 +44 -38
  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 } });
@@ -263835,6 +263835,7 @@ __export(call_exports2, {
263835
263835
  confirms: () => confirms,
263836
263836
  doorOf: () => doorOf,
263837
263837
  draftOfEntries: () => draftOfEntries,
263838
+ feeUnpaid: () => feeUnpaid,
263838
263839
  freshDraft: () => freshDraft,
263839
263840
  indexLookup: () => indexLookup,
263840
263841
  indexLookupWith: () => indexLookupWith,
@@ -264262,6 +264263,13 @@ async function postNextLegNow(slug, ctx) {
264262
264263
  if (!leg) return { done: true, draft };
264263
264264
  if (draft.coin && draft.coin !== ctx.askDenom && Object.values(draft.posted).some(Boolean)) throw new PostRefused("Refused: this call's posted legs pay in another coin than this network pays in now; every leg of a call pays in one. Nothing was posted.");
264264
264265
  draft = { ...draft, coin: ctx.askDenom };
264266
+ if (ctx.acting && legs.some((one) => one.feeBase > 0)) throw new Error(callTwoCoins);
264267
+ const plan = legs.find((one) => one.leg === leg);
264268
+ const oracle = { kind: "oracle", address: ctx.checker, rewardUixo: plan.checkBase || legs.find((one) => one.leg === "entries").checkBase };
264269
+ const terms = legTerms(draft, leg, { poster: shortPoster, dates, oracle, approver: ctx.approver ?? null, share: priced.share, sponsor: ctx.sponsor });
264270
+ const screen = await steps.screen(ctx.site, terms.task, terms);
264271
+ if (screen?.verdict === "refuse") throw new Error(refusedWords(screen.reason));
264272
+ await steps.fund(actor.address, ctx.site, ctx.acting?.principal);
264265
264273
  if (!draft.campaign && steps.createCampaign && !ctx.acting) {
264266
264274
  const remember2 = async (made2) => {
264267
264275
  draft = { ...draft, campaign: made2, updatedAt: (/* @__PURE__ */ new Date()).toISOString() };
@@ -264283,13 +264291,6 @@ async function postNextLegNow(slug, ctx) {
264283
264291
  if (!draft.campaign) await remember2(made);
264284
264292
  }
264285
264293
  const campaign = draft.campaign ? { protocolDid: draft.campaign.protocolDid, claimProtocolDid: null } : null;
264286
- if (ctx.acting && legs.some((one) => one.feeBase > 0)) throw new Error(callTwoCoins);
264287
- const plan = legs.find((one) => one.leg === leg);
264288
- const oracle = { kind: "oracle", address: ctx.checker, rewardUixo: plan.checkBase || legs.find((one) => one.leg === "entries").checkBase };
264289
- const terms = legTerms(draft, leg, { poster: shortPoster, dates, oracle, approver: ctx.approver ?? null, share: priced.share, sponsor: ctx.sponsor });
264290
- const screen = await steps.screen(ctx.site, terms.task, terms);
264291
- if (screen?.verdict === "refuse") throw new Error(refusedWords(screen.reason));
264292
- await steps.fund(actor.address, ctx.site, ctx.acting?.principal);
264293
264294
  const published = await steps.publish(terms);
264294
264295
  if (!published) throw new Error("the store would not take the terms. Nothing was posted. Try again shortly");
264295
264296
  let inFlight2 = { leg, poster, doneMeansCid: published.cid, startedAt: new Date(ctx.now ?? Date.now()).toISOString() };
@@ -264378,7 +264379,7 @@ function confirms(said3, totalBase, symbol2) {
264378
264379
  const figure = said3.replace(/[$,\s]|USDC|PAY|IXO/gi, "");
264379
264380
  return /^\d+(\.\d+)?$/.test(figure) && Math.round(Number(figure) * MICRO5) === totalBase;
264380
264381
  }
264381
- var MICRO5, callsDir, fileOf, askInvitesFile, freshDraft, L3, ENTRIES_MAX, INVITES_MAX, INVITE_NOTE_MAX, ADDRESS2, HANDLE_ITEM, isInviteItem, PRO_ASK_INVITE_ONLY, PRO_ASK_NEEDS_MARKETPLACE, manyLines, overCap, callTwoCoins, SETTLE_MS, chainCheck, InFlightError, PostRefused, said2, indexLookupWith, indexLookup, posting, isAskPending, isTxFailed, tagOf, TESTNET_CALL_DEFAULTS, payWords;
264382
+ var MICRO5, callsDir, fileOf, askInvitesFile, freshDraft, L3, ENTRIES_MAX, INVITES_MAX, INVITE_NOTE_MAX, ADDRESS2, HANDLE_ITEM, isInviteItem, PRO_ASK_INVITE_ONLY, PRO_ASK_NEEDS_MARKETPLACE, manyLines, overCap, callTwoCoins, SETTLE_MS, chainCheck, InFlightError, PostRefused, feeUnpaid, said2, indexLookupWith, indexLookup, posting, isAskPending, isTxFailed, tagOf, TESTNET_CALL_DEFAULTS, payWords;
264382
264383
  var init_call2 = __esm({
264383
264384
  "src/call.ts"() {
264384
264385
  "use strict";
@@ -264435,6 +264436,7 @@ var init_call2 = __esm({
264435
264436
  this.name = "PostRefused";
264436
264437
  }
264437
264438
  };
264439
+ feeUnpaid = (error54, askDenom2) => askDenom2 !== "uixo" && /spendable balance \d+uixo is smaller than \d+uixo/i.test(error54 instanceof Error ? error54.message : String(error54));
264438
264440
  said2 = (error54) => error54 instanceof Error ? error54.message : String(error54);
264439
264441
  indexLookupWith = (fetchImpl = fetch) => async (inFlight2) => {
264440
264442
  const { resolveAsk: resolveAsk2 } = await Promise.resolve().then(() => (init_ask(), ask_exports));
@@ -265421,7 +265423,7 @@ ${p.education.map((one) => ` ${one.year ? `${one.year} \xB7 ` : ""}${one.title}
265421
265423
  ${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
265424
  ),
265423
265425
  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`
265426
+ `Page: ${proPage(site, p.handle)}`
265425
265427
  ].filter(Boolean).join("\n");
265426
265428
  }
265427
265429
  async function startLinkedin(site, signer2, fetchImpl) {
@@ -292284,7 +292286,7 @@ import { randomBytes as randomBytes7 } from "node:crypto";
292284
292286
  // package.json
292285
292287
  var package_default = {
292286
292288
  name: "@ixo/asks-mcp",
292287
- version: "1.12.0-dev.3",
292289
+ version: "1.12.1-dev.1",
292288
292290
  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
292291
  license: "Apache-2.0",
292290
292292
  repository: {
@@ -292647,7 +292649,7 @@ var TOOLS = {
292647
292649
  },
292648
292650
  set_my_page: {
292649
292651
  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.",
292652
+ 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
292653
  spends: false,
292652
292654
  hosted: false,
292653
292655
  annotations: { ...acts, idempotentHint: true }
@@ -292668,7 +292670,7 @@ var TOOLS = {
292668
292670
  },
292669
292671
  list_marketplaces: {
292670
292672
  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.",
292673
+ 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
292674
  spends: false,
292673
292675
  hosted: false,
292674
292676
  annotations: reads
@@ -292689,7 +292691,7 @@ var TOOLS = {
292689
292691
  },
292690
292692
  set_marketplace_page: {
292691
292693
  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.",
292694
+ 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
292695
  spends: false,
292694
292696
  hosted: false,
292695
292697
  annotations: { ...acts, idempotentHint: true }
@@ -294936,7 +294938,7 @@ You cannot complete it, and trying would spend the gate's network fee to be reje
294936
294938
  let lane = null;
294937
294939
  if (isPrivate) {
294938
294940
  const kit = await laneKit();
294939
- const opened = await kit.lanes.openLane({ connectLink: connectLink2(SITE, actor.address), acting: acting?.principal ?? null, entityDid: receipt.entityDid, collectionId, desk: kit.desk, agent: kit.agent });
294941
+ const opened = await kit.lanes.openLane({ connectLink: acting ? "" : await codeLink(), acting: acting?.principal ?? null, entityDid: receipt.entityDid, collectionId, desk: kit.desk, agent: kit.agent });
294940
294942
  if ("said" in opened) return text4(opened.said);
294941
294943
  lane = opened;
294942
294944
  }
@@ -296176,18 +296178,19 @@ tx ${result.transactionHash}${leftWords}`);
296176
296178
  }
296177
296179
  return { code: live.code, link: pairing.connectLinkWithCode(pairing.pairingSite(SITE, live), agent, live.code), account, done: () => store2.write({ ...live, used: true }) };
296178
296180
  };
296181
+ const codeLink = async (reviews = false) => {
296182
+ const mine = await address2();
296183
+ const pairing = await Promise.resolve().then(() => (init_pairing(), pairing_exports));
296184
+ const store2 = await pairingFile();
296185
+ let { pairing: code10 } = pairing.currentPairing(store2, mine);
296186
+ if (reviews && !code10.reviews) store2.write(code10 = { ...code10, reviews: true });
296187
+ return pairing.connectLinkWithCode(pairing.pairingSite(SITE, code10), mine, code10.code);
296188
+ };
296179
296189
  if (offered("get_connect_link")) server2.registerTool(
296180
296190
  "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.") } },
296182
- async ({ reviews }) => {
296183
- const mine = await address2();
296184
- const pairing = await Promise.resolve().then(() => (init_pairing(), pairing_exports));
296185
- const store2 = await pairingFile();
296186
- let { pairing: code10 } = pairing.currentPairing(store2, mine);
296187
- if (reviews && !code10.reviews) store2.write(code10 = { ...code10, reviews: true });
296188
- return text4(`${pairing.connectLinkWithCode(pairing.pairingSite(SITE, code10), mine, code10.code)}
296189
- Open this, sign in with Google, tap Connect. Then tell me 'done'.`);
296190
- }
296191
+ { ...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.") } },
296192
+ async ({ reviews }) => text4(`${await codeLink(reviews)}
296193
+ Open this, sign in with Google, tap Connect. Then tell me 'done'.`)
296191
296194
  );
296192
296195
  if (offered("connection_status")) server2.registerTool("connection_status", { ...meta3("connection_status"), inputSchema: {} }, async () => {
296193
296196
  const pairing = await pairingNow(await address2(), 0);
@@ -296216,6 +296219,7 @@ ${pairing.link}`);
296216
296219
  was?.principal === "self" ? "Forgotten: this key is no longer pinned to act as itself. It still does, until connect_account pins the person's address; my_status names any account that has connected." : was ? `Forgotten: this key no longer acts for ${was.principal}. Asks it posts now are its own, paid from what it has itself. Their grants stay in place until they revoke them at ${SITE}/connect.` : "This key was not pinned to any account. Nothing changed."
296217
296220
  );
296218
296221
  }
296222
+ let pending = { code: null, link: "" };
296219
296223
  if (!chosen2) {
296220
296224
  const pairing = await pairingNow(mine, wait_seconds ?? 0);
296221
296225
  if (pairing.account) {
@@ -296226,12 +296230,10 @@ ${pairing.link}`);
296226
296230
  const { shortStr: shortStr2 } = await Promise.resolve().then(() => (init_format(), format_exports));
296227
296231
  return text4(`Connected as ${shortStr2(pairing.account, 8, 4)}. They can disconnect at ${SITE}/connect.`);
296228
296232
  }
296229
- } else if (pairing.code) {
296230
- return text4(`Nobody has approved the link yet. Ask the person to open it, sign in with Google and tap Connect, then call connect_account again:
296231
- ${pairing.link}`);
296232
296233
  }
296234
+ pending = pairing;
296233
296235
  }
296234
- const deadline = Date.now() + (wait_seconds ?? 0) * 1e3;
296236
+ const deadline = Date.now() + (pending.code ? 0 : wait_seconds ?? 0) * 1e3;
296235
296237
  let found = await connectAs2(mine, chosen2);
296236
296238
  while ((found.kind === "none" || found.kind === "gone") && Date.now() < deadline) {
296237
296239
  await new Promise((resolve2) => setTimeout(resolve2, 3e3));
@@ -296264,16 +296266,19 @@ They can disconnect at ${SITE}/connect.`);
296264
296266
  return text4(
296265
296267
  [
296266
296268
  `${found.principals.length === 1 ? "An account has" : `${found.principals.length} accounts have`} connected this key: ${found.principals.join(", ")}.`,
296267
- "Anybody can grant to a public address, so this server pins nobody it was not told to. Call get_connect_link and show the person that link: once they tap Connect there, connect_account connects exactly them. Until then this key acts as itself."
296269
+ "Anybody can grant to a public address, so this server pins nobody it was not told to. Ask the person you work for to open this one-time link and sign in with Google. If it says this agent is already connected, they disconnect it there and tap Connect again. Then call connect_account. Until then this key acts as itself:",
296270
+ pending.link || await codeLink()
296268
296271
  ].join("\n")
296269
296272
  );
296270
296273
  }
296274
+ if (pending.code) return text4(`Nobody has approved the link yet. Ask the person to open it, sign in with Google and tap Connect, then call connect_account again:
296275
+ ${pending.link}`);
296271
296276
  return text4(
296272
296277
  [
296273
- "Not connected yet. Ask the person you work for to open this link on their phone and tap Connect:",
296274
- link5,
296278
+ "Not connected yet. Ask the person you work for to open this link, sign in with Google and tap Connect:",
296279
+ await codeLink(),
296275
296280
  "",
296276
- `It names this key's address (${mine}) and nothing else. They sign in with IXO mobile, set a cap, and tap once. Then call connect_account again. Nothing is spent by this.`
296281
+ `It names this key's address (${mine}) and a one-time code that lasts 30 minutes, so this server connects exactly the account that taps Connect. They set a cap and tap once. Then call connect_account again. Nothing is spent by this.`
296277
296282
  ].join("\n")
296278
296283
  );
296279
296284
  }
@@ -296559,7 +296564,7 @@ Mapping pays for the report. What happens to a mapped pin afterwards is a separa
296559
296564
  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
296565
  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
296566
  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."),
296567
+ 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
296568
  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
296569
  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
296570
  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."),
@@ -296754,8 +296759,8 @@ The call: ${linkOf(draft.posted)}`);
296754
296759
  const sponsor = marketplace?.sponsor ?? null;
296755
296760
  const acting = card || plain_key && review ? null : await principal2();
296756
296761
  if (!acting && !plain_key && !card) {
296757
- return text4(`Not connected. A call uses the connected account as its poster and funding source. Ask them to connect this key first:
296758
- ${connectLink2(review ? `${EXPERT_SITE}/pro` : SITE, await address2())}
296762
+ return text4(`Not connected. A call uses the connected account as its poster and funding source. Ask them to open this link, sign in with Google and tap Connect, then call connect_account:
296763
+ ${await codeLink(review)}
296759
296764
  Then call post_call again. Nothing was posted.`);
296760
296765
  }
296761
296766
  const { checkerLegBase: checkerLegBase2 } = await Promise.resolve().then(() => (init_leg(), leg_exports));
@@ -296854,6 +296859,7 @@ Then call post_call again. Nothing was posted.`);
296854
296859
  if (error54 instanceof call2.InFlightError || error54 instanceof call2.PostRefused) return text4(error54.message);
296855
296860
  if (isUnanchored(error54)) return text4(unanchoredWords(error54));
296856
296861
  if (error54 instanceof Error && error54.name === "TxFailed") {
296862
+ if (call2.feeUnpaid(error54, coin)) return text4(`Nothing moved: this agent's key could not pay the network fee for ${LEG_WORDS[next]}. Call post_call again in a minute; it arranges the fee before it signs anything. If it is refused again, tell the person the network fee could not be arranged just now.`);
296857
296863
  return text4(`The network refused ${LEG_WORDS[next]}: ${error54.message}. Nothing moved. Fix that (often what the account holds, or its cap) and call post_call again.`);
296858
296864
  }
296859
296865
  return text4(
@@ -297335,7 +297341,7 @@ Here's your private link: ${link5.url}. Anyone with it can see your page; ask me
297335
297341
 
297336
297342
  No private link was made: ${link5.refused}.`;
297337
297343
  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}`);
297344
+ return text4(`Published the profile for ${answer.address}: ${proPage(SITE, answer.handle)}. Posters invite them with "@${answer.handle}".${linkLine}`);
297339
297345
  }
297340
297346
  );
297341
297347
  if (offered("my_page")) server2.registerTool("my_page", { ...meta3("my_page"), inputSchema: {} }, async () => {
@@ -297492,7 +297498,7 @@ ${asData("linkedin", JSON.stringify(prefill, null, 2))}`
297492
297498
  if (!confirm)
297493
297499
  return text4(
297494
297500
  [
297495
- `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" : ""}:`,
297501
+ `This takes down @${page.profile.handle} (${where2}), the page of ${owner}${acting ? ", the person this key acts for" : ""}:`,
297496
297502
  `- 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.`,
297497
297503
  `- The handle @${page.profile.handle} is freed, and anybody may take it. Posters can no longer invite them by it.`,
297498
297504
  `- 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.3",
3
+ "version": "1.12.1-dev.1",
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": {