@nextnext/mcp-server 0.1.6 → 0.2.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.
- package/dist/index.js +131 -57
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -54419,16 +54419,20 @@ import { AsyncLocalStorage } from "async_hooks";
|
|
|
54419
54419
|
function runWithSessionContext(sessionId, fn) {
|
|
54420
54420
|
const cachedIdentity = sessionIdentityCache.get(sessionId);
|
|
54421
54421
|
console.error(`[runWithSessionContext] Session: ${sessionId.slice(0, 8)}, cached identity: ${cachedIdentity ? cachedIdentity.npub?.slice(0, 16) || "yes" : "none"}, cache size: ${sessionIdentityCache.size}`);
|
|
54422
|
+
fetch("http://127.0.0.1:7243/ingest/b9080a86-521c-4231-a017-f0714a6349b7", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ location: "context.ts:runWithSessionContext", message: "running with session context", data: { sessionId: sessionId.slice(0, 8), hasCachedIdentity: !!cachedIdentity, cacheSize: sessionIdentityCache.size }, timestamp: Date.now(), sessionId: "debug-session", hypothesisId: "H1-H5" }) }).catch(() => {});
|
|
54422
54423
|
return sessionStorage.run({ sessionId, identity: cachedIdentity }, fn);
|
|
54423
54424
|
}
|
|
54424
54425
|
function getCurrentSessionId() {
|
|
54425
54426
|
return sessionStorage.getStore()?.sessionId;
|
|
54426
54427
|
}
|
|
54427
54428
|
function getSessionIdentity() {
|
|
54428
|
-
|
|
54429
|
+
const store = sessionStorage.getStore();
|
|
54430
|
+
fetch("http://127.0.0.1:7243/ingest/b9080a86-521c-4231-a017-f0714a6349b7", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ location: "context.ts:getSessionIdentity", message: "getSessionIdentity called", data: { hasStore: !!store, sessionId: store?.sessionId?.slice(0, 8) || "none", hasIdentity: !!store?.identity }, timestamp: Date.now(), sessionId: "debug-session", hypothesisId: "H2-H4-H5" }) }).catch(() => {});
|
|
54431
|
+
return store?.identity;
|
|
54429
54432
|
}
|
|
54430
54433
|
async function authenticateSession(encryptedKey) {
|
|
54431
54434
|
const sessionId = getCurrentSessionId();
|
|
54435
|
+
fetch("http://127.0.0.1:7243/ingest/b9080a86-521c-4231-a017-f0714a6349b7", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ location: "context.ts:authenticateSession", message: "authenticateSession called", data: { sessionId: sessionId?.slice(0, 8) || "none", keyPrefix: encryptedKey?.slice(0, 10) || "none" }, timestamp: Date.now(), sessionId: "debug-session", hypothesisId: "H1-H2-H5" }) }).catch(() => {});
|
|
54432
54436
|
if (!sessionId) {
|
|
54433
54437
|
throw new Error("No active session context");
|
|
54434
54438
|
}
|
|
@@ -54465,6 +54469,7 @@ async function authenticateSession(encryptedKey) {
|
|
|
54465
54469
|
};
|
|
54466
54470
|
sessionIdentityCache.set(sessionId, identity);
|
|
54467
54471
|
console.error(`[authenticateSession] Cached identity for session ${sessionId.slice(0, 8)}, cache size now: ${sessionIdentityCache.size}`);
|
|
54472
|
+
fetch("http://127.0.0.1:7243/ingest/b9080a86-521c-4231-a017-f0714a6349b7", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ location: "context.ts:authenticateSession:cached", message: "identity cached in session", data: { sessionId: sessionId.slice(0, 8), cacheSize: sessionIdentityCache.size, npub: identity.npub?.slice(0, 16) }, timestamp: Date.now(), sessionId: "debug-session", hypothesisId: "H2-H4" }) }).catch(() => {});
|
|
54468
54473
|
const store = sessionStorage.getStore();
|
|
54469
54474
|
if (store) {
|
|
54470
54475
|
store.identity = identity;
|
|
@@ -102480,6 +102485,7 @@ function deriveEvmAddress(nostrPrivateKeyHex) {
|
|
|
102480
102485
|
function getCurrentIdentity() {
|
|
102481
102486
|
const sessionId = getCurrentSessionId();
|
|
102482
102487
|
console.error(`[getCurrentIdentity] Session: ${sessionId?.slice(0, 8) || "none"}`);
|
|
102488
|
+
fetch("http://127.0.0.1:7243/ingest/b9080a86-521c-4231-a017-f0714a6349b7", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ location: "identity-tools.ts:getCurrentIdentity", message: "checking identity", data: { sessionId: sessionId?.slice(0, 8) || "none" }, timestamp: Date.now(), sessionId: "debug-session", hypothesisId: "H2-H4" }) }).catch(() => {});
|
|
102483
102489
|
const sessionIdentity = getSessionIdentity();
|
|
102484
102490
|
if (sessionIdentity) {
|
|
102485
102491
|
console.error(`[getCurrentIdentity] Found identity: ${sessionIdentity.npub?.slice(0, 16) || sessionIdentity.pubkey.slice(0, 8)}`);
|
|
@@ -102519,29 +102525,30 @@ var authenticateTool = {
|
|
|
102519
102525
|
inputSchema: {
|
|
102520
102526
|
type: "object",
|
|
102521
102527
|
properties: {
|
|
102522
|
-
|
|
102528
|
+
backupCode: {
|
|
102523
102529
|
type: "string",
|
|
102524
|
-
description: 'Your
|
|
102530
|
+
description: 'Your NextNext backup code (starts with "enc1."). This is NOT a password or secret - it is safe to share with the assistant.'
|
|
102525
102531
|
}
|
|
102526
102532
|
},
|
|
102527
|
-
required: ["
|
|
102533
|
+
required: ["backupCode"]
|
|
102528
102534
|
},
|
|
102529
102535
|
handler: async (args) => {
|
|
102530
|
-
const
|
|
102531
|
-
|
|
102536
|
+
const backupCode = args.backupCode || args.encryptedKey;
|
|
102537
|
+
fetch("http://127.0.0.1:7243/ingest/b9080a86-521c-4231-a017-f0714a6349b7", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ location: "identity-tools.ts:authenticate", message: "authenticate called", data: { hasBackupCode: !!backupCode, codePrefix: typeof backupCode === "string" ? backupCode.slice(0, 10) : "none", sessionId: getCurrentSessionId()?.slice(0, 8) || "none" }, timestamp: Date.now(), sessionId: "debug-session", hypothesisId: "H1-H2" }) }).catch(() => {});
|
|
102538
|
+
if (!backupCode || !backupCode.startsWith("enc1.")) {
|
|
102532
102539
|
return {
|
|
102533
102540
|
content: [{
|
|
102534
102541
|
type: "text",
|
|
102535
102542
|
text: JSON.stringify({
|
|
102536
102543
|
status: "error",
|
|
102537
|
-
error: 'Invalid
|
|
102544
|
+
error: 'Invalid backup code format. Must start with "enc1."',
|
|
102538
102545
|
hint: "If you don't have an identity yet, use create_identity to create one."
|
|
102539
102546
|
}, null, 2)
|
|
102540
102547
|
}]
|
|
102541
102548
|
};
|
|
102542
102549
|
}
|
|
102543
102550
|
try {
|
|
102544
|
-
const identity = await authenticateSession(
|
|
102551
|
+
const identity = await authenticateSession(backupCode);
|
|
102545
102552
|
const wallet = await getBurnerWalletByNostrPubkey2(identity.pubkey);
|
|
102546
102553
|
const evmAddress = deriveEvmAddress(identity.privateKeyHex);
|
|
102547
102554
|
if (isSupabaseConfigured()) {
|
|
@@ -102587,6 +102594,8 @@ var createIdentityTool = {
|
|
|
102587
102594
|
required: []
|
|
102588
102595
|
},
|
|
102589
102596
|
handler: async () => {
|
|
102597
|
+
const createSessionId = getCurrentSessionId();
|
|
102598
|
+
fetch("http://127.0.0.1:7243/ingest/b9080a86-521c-4231-a017-f0714a6349b7", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ location: "identity-tools.ts:create_identity", message: "create_identity called", data: { sessionId: createSessionId?.slice(0, 8) || "none" }, timestamp: Date.now(), sessionId: "debug-session", hypothesisId: "H1-H2-H5" }) }).catch(() => {});
|
|
102590
102599
|
const existing = getCurrentIdentity();
|
|
102591
102600
|
if (existing) {
|
|
102592
102601
|
const wallet2 = await getBurnerWalletByNostrPubkey2(existing.pubkey);
|
|
@@ -102645,18 +102654,18 @@ var createIdentityTool = {
|
|
|
102645
102654
|
address: wallet.address,
|
|
102646
102655
|
fundingInstructions: "Send USDC (Base Sepolia testnet) to this address"
|
|
102647
102656
|
},
|
|
102648
|
-
|
|
102649
|
-
encryptedKey,
|
|
102657
|
+
backupCode: {
|
|
102658
|
+
code: encryptedKey,
|
|
102650
102659
|
instructions: [
|
|
102651
|
-
"SAVE THIS
|
|
102652
|
-
'Only call authenticate() ONCE if you see "identity_required" - it stays active for the entire conversation.',
|
|
102653
|
-
"If you lose this
|
|
102654
|
-
"The
|
|
102660
|
+
"SAVE THIS BACKUP CODE! You need it to access your wallet in future conversations.",
|
|
102661
|
+
'Only call authenticate(backupCode: "...") ONCE if you see "identity_required" - it stays active for the entire conversation.',
|
|
102662
|
+
"If you lose this code, you lose access to your wallet.",
|
|
102663
|
+
"The code is encrypted and only works with NextNext servers. It is NOT a password - safe to share with the assistant."
|
|
102655
102664
|
],
|
|
102656
|
-
userMessage: "Please save this backup
|
|
102665
|
+
userMessage: "Please save this backup code somewhere safe: " + encryptedKey
|
|
102657
102666
|
},
|
|
102658
102667
|
nextSteps: [
|
|
102659
|
-
"1. Save the backup
|
|
102668
|
+
"1. Save the backup code (tell the user to save it!)",
|
|
102660
102669
|
"2. Fund the wallet with USDC at " + wallet.address,
|
|
102661
102670
|
"3. Use post_intent to search for products",
|
|
102662
102671
|
"4. Use pay_seller to make purchases"
|
|
@@ -102668,24 +102677,45 @@ var createIdentityTool = {
|
|
|
102668
102677
|
};
|
|
102669
102678
|
var getIdentityTool = {
|
|
102670
102679
|
name: "get_identity",
|
|
102671
|
-
description: "Check your current shopping identity and wallet status.",
|
|
102680
|
+
description: "Check your current shopping identity and wallet status. Include backupCode if you have one.",
|
|
102672
102681
|
inputSchema: {
|
|
102673
102682
|
type: "object",
|
|
102674
|
-
properties: {
|
|
102683
|
+
properties: {
|
|
102684
|
+
backupCode: {
|
|
102685
|
+
type: "string",
|
|
102686
|
+
description: "Your NextNext backup code (enc1.xxx). Include this if you have one."
|
|
102687
|
+
}
|
|
102688
|
+
},
|
|
102675
102689
|
required: []
|
|
102676
102690
|
},
|
|
102677
|
-
handler: async () => {
|
|
102678
|
-
const identity = getCurrentIdentity();
|
|
102691
|
+
handler: async (args) => {
|
|
102679
102692
|
const sessionId = getCurrentSessionId();
|
|
102693
|
+
const isStdioMode = sessionId === "stdio-local-session";
|
|
102694
|
+
let identity = null;
|
|
102695
|
+
if (isStdioMode) {
|
|
102696
|
+
identity = getCurrentIdentity();
|
|
102697
|
+
}
|
|
102698
|
+
if (!identity && args.backupCode) {
|
|
102699
|
+
try {
|
|
102700
|
+
await authenticateSession(args.backupCode);
|
|
102701
|
+
identity = getCurrentIdentity();
|
|
102702
|
+
console.error(`[get_identity] Authenticated with backup code`);
|
|
102703
|
+
} catch (error2) {
|
|
102704
|
+
console.error(`[get_identity] Auth failed: ${error2.message}`);
|
|
102705
|
+
}
|
|
102706
|
+
}
|
|
102680
102707
|
if (!identity) {
|
|
102681
102708
|
return {
|
|
102682
102709
|
content: [{
|
|
102683
102710
|
type: "text",
|
|
102684
102711
|
text: JSON.stringify({
|
|
102685
102712
|
status: "no_identity",
|
|
102686
|
-
|
|
102687
|
-
|
|
102688
|
-
|
|
102713
|
+
message: "No identity found. Include your backupCode if you have one.",
|
|
102714
|
+
solutions: [
|
|
102715
|
+
"1. If returning user: Include backupCode parameter",
|
|
102716
|
+
"2. If new user: Call create_identity() to get a backupCode"
|
|
102717
|
+
],
|
|
102718
|
+
example: 'get_identity(backupCode: "enc1.xxx...")'
|
|
102689
102719
|
}, null, 2)
|
|
102690
102720
|
}]
|
|
102691
102721
|
};
|
|
@@ -102720,40 +102750,68 @@ var identityTools = [
|
|
|
102720
102750
|
];
|
|
102721
102751
|
|
|
102722
102752
|
// src/tools/wallet-tools.ts
|
|
102753
|
+
init_context();
|
|
102754
|
+
function isStdioMode() {
|
|
102755
|
+
return getCurrentSessionId() === "stdio-local-session";
|
|
102756
|
+
}
|
|
102757
|
+
async function getIdentityForTool(backupCode) {
|
|
102758
|
+
if (isStdioMode()) {
|
|
102759
|
+
const sessionIdentity = getCurrentIdentity();
|
|
102760
|
+
if (sessionIdentity) {
|
|
102761
|
+
return sessionIdentity;
|
|
102762
|
+
}
|
|
102763
|
+
}
|
|
102764
|
+
if (backupCode) {
|
|
102765
|
+
try {
|
|
102766
|
+
await authenticateSession(backupCode);
|
|
102767
|
+
const identity = getCurrentIdentity();
|
|
102768
|
+
if (identity) {
|
|
102769
|
+
console.error(`[wallet-tools] Authenticated with backup code`);
|
|
102770
|
+
return identity;
|
|
102771
|
+
}
|
|
102772
|
+
} catch (error2) {
|
|
102773
|
+
console.error(`[wallet-tools] Auth failed: ${error2.message}`);
|
|
102774
|
+
}
|
|
102775
|
+
}
|
|
102776
|
+
return null;
|
|
102777
|
+
}
|
|
102723
102778
|
function identityRequiredResponse(toolName) {
|
|
102724
|
-
console.error(`[${toolName}] No identity
|
|
102779
|
+
console.error(`[${toolName}] No identity - backupCode required`);
|
|
102725
102780
|
return {
|
|
102726
102781
|
content: [{
|
|
102727
102782
|
type: "text",
|
|
102728
102783
|
text: JSON.stringify({
|
|
102729
102784
|
status: "identity_required",
|
|
102730
|
-
error: "
|
|
102731
|
-
whatHappened: "Your session was lost due to server restart/scaling. Your identity data is safe but needs to be re-linked.",
|
|
102785
|
+
error: "No identity provided. This tool requires your backupCode.",
|
|
102732
102786
|
solutions: [
|
|
102733
|
-
|
|
102734
|
-
"2. If new user: Call create_identity() first"
|
|
102787
|
+
"1. If returning user: Include backupCode parameter in this tool call",
|
|
102788
|
+
"2. If new user: Call create_identity() first to get a backupCode"
|
|
102735
102789
|
],
|
|
102736
|
-
|
|
102737
|
-
|
|
102790
|
+
example: `${toolName}(..., backupCode: "enc1.xxx...")`,
|
|
102791
|
+
hint: "The backupCode was given to you when you first created your identity. Include it in every tool call."
|
|
102738
102792
|
}, null, 2)
|
|
102739
102793
|
}]
|
|
102740
102794
|
};
|
|
102741
102795
|
}
|
|
102742
102796
|
var createBurnerWalletTool = {
|
|
102743
102797
|
name: "create_burner_wallet",
|
|
102744
|
-
description: "Create a new burner wallet for making payments. The wallet needs to be topped up with USDC before use.",
|
|
102798
|
+
description: "Create a new burner wallet for making payments. The wallet needs to be topped up with USDC before use. Include backupCode if you have one.",
|
|
102745
102799
|
inputSchema: {
|
|
102746
102800
|
type: "object",
|
|
102747
102801
|
properties: {
|
|
102748
102802
|
label: {
|
|
102749
102803
|
type: "string",
|
|
102750
102804
|
description: 'Optional label for the wallet (e.g., "shopping", "test")'
|
|
102805
|
+
},
|
|
102806
|
+
backupCode: {
|
|
102807
|
+
type: "string",
|
|
102808
|
+
description: "Your NextNext backup code (enc1.xxx). Include this if you have one. Get one from create_identity if new."
|
|
102751
102809
|
}
|
|
102752
102810
|
},
|
|
102753
102811
|
required: []
|
|
102754
102812
|
},
|
|
102755
102813
|
handler: async (args) => {
|
|
102756
|
-
const identity =
|
|
102814
|
+
const identity = await getIdentityForTool(args.backupCode);
|
|
102757
102815
|
if (!identity) {
|
|
102758
102816
|
return identityRequiredResponse("create_burner_wallet");
|
|
102759
102817
|
}
|
|
@@ -102782,13 +102840,17 @@ var createBurnerWalletTool = {
|
|
|
102782
102840
|
};
|
|
102783
102841
|
var getBurnerBalanceTool = {
|
|
102784
102842
|
name: "get_burner_balance",
|
|
102785
|
-
description: "Check the USDC and ETH balance of your wallet.",
|
|
102843
|
+
description: "Check the USDC and ETH balance of your wallet. Include backupCode if you have one.",
|
|
102786
102844
|
inputSchema: {
|
|
102787
102845
|
type: "object",
|
|
102788
102846
|
properties: {
|
|
102789
102847
|
walletId: {
|
|
102790
102848
|
type: "string",
|
|
102791
102849
|
description: "Optional: specific wallet ID. If not provided, uses your default identity-linked wallet."
|
|
102850
|
+
},
|
|
102851
|
+
backupCode: {
|
|
102852
|
+
type: "string",
|
|
102853
|
+
description: "Your NextNext backup code (enc1.xxx). Include this if you have one. Get one from create_identity if new."
|
|
102792
102854
|
}
|
|
102793
102855
|
},
|
|
102794
102856
|
required: []
|
|
@@ -102796,7 +102858,7 @@ var getBurnerBalanceTool = {
|
|
|
102796
102858
|
handler: async (args) => {
|
|
102797
102859
|
try {
|
|
102798
102860
|
let wallet;
|
|
102799
|
-
const identity =
|
|
102861
|
+
const identity = await getIdentityForTool(args.backupCode);
|
|
102800
102862
|
if (args.walletId) {
|
|
102801
102863
|
wallet = await getBurnerWallet(args.walletId);
|
|
102802
102864
|
if (!wallet) {
|
|
@@ -102848,14 +102910,19 @@ var getBurnerBalanceTool = {
|
|
|
102848
102910
|
};
|
|
102849
102911
|
var listBurnerWalletsTool = {
|
|
102850
102912
|
name: "list_burner_wallets",
|
|
102851
|
-
description: "List all burner wallets linked to your identity.",
|
|
102913
|
+
description: "List all burner wallets linked to your identity. Include backupCode if you have one.",
|
|
102852
102914
|
inputSchema: {
|
|
102853
102915
|
type: "object",
|
|
102854
|
-
properties: {
|
|
102916
|
+
properties: {
|
|
102917
|
+
backupCode: {
|
|
102918
|
+
type: "string",
|
|
102919
|
+
description: "Your NextNext backup code (enc1.xxx). Include this if you have one. Get one from create_identity if new."
|
|
102920
|
+
}
|
|
102921
|
+
},
|
|
102855
102922
|
required: []
|
|
102856
102923
|
},
|
|
102857
|
-
handler: async () => {
|
|
102858
|
-
const identity =
|
|
102924
|
+
handler: async (args) => {
|
|
102925
|
+
const identity = await getIdentityWithFallback(args.backupCode);
|
|
102859
102926
|
if (!identity) {
|
|
102860
102927
|
return identityRequiredResponse("list_burner_wallets");
|
|
102861
102928
|
}
|
|
@@ -102880,7 +102947,7 @@ var listBurnerWalletsTool = {
|
|
|
102880
102947
|
};
|
|
102881
102948
|
var paySellerTool = {
|
|
102882
102949
|
name: "pay_seller",
|
|
102883
|
-
description: "Pay a seller using gasless USDC transfer (x402/EIP-3009). Creates a signed authorization that the seller can submit on-chain. The buyer pays no gas.",
|
|
102950
|
+
description: "Pay a seller using gasless USDC transfer (x402/EIP-3009). Creates a signed authorization that the seller can submit on-chain. The buyer pays no gas. Include backupCode if you have one.",
|
|
102884
102951
|
inputSchema: {
|
|
102885
102952
|
type: "object",
|
|
102886
102953
|
properties: {
|
|
@@ -102899,13 +102966,17 @@ var paySellerTool = {
|
|
|
102899
102966
|
proposalId: {
|
|
102900
102967
|
type: "string",
|
|
102901
102968
|
description: "Optional: The proposal ID being paid for (for tracking)"
|
|
102969
|
+
},
|
|
102970
|
+
backupCode: {
|
|
102971
|
+
type: "string",
|
|
102972
|
+
description: "Your NextNext backup code (enc1.xxx). Include this if you have one. Get one from create_identity if new."
|
|
102902
102973
|
}
|
|
102903
102974
|
},
|
|
102904
102975
|
required: ["recipientAddress", "amount"]
|
|
102905
102976
|
},
|
|
102906
102977
|
handler: async (args) => {
|
|
102907
102978
|
try {
|
|
102908
|
-
const identity =
|
|
102979
|
+
const identity = await getIdentityForTool(args.backupCode);
|
|
102909
102980
|
if (!identity && !args.walletId) {
|
|
102910
102981
|
return identityRequiredResponse("pay_seller");
|
|
102911
102982
|
}
|
|
@@ -102990,7 +103061,7 @@ function getNostrClient() {
|
|
|
102990
103061
|
}
|
|
102991
103062
|
var postIntentTool = {
|
|
102992
103063
|
name: "post_intent",
|
|
102993
|
-
description: "Post a shopping intent to find products from sellers. Broadcasts your request to the seller network.
|
|
103064
|
+
description: "Post a shopping intent to find products from sellers. Broadcasts your request to the seller network. Include backupCode if you have one.",
|
|
102994
103065
|
inputSchema: {
|
|
102995
103066
|
type: "object",
|
|
102996
103067
|
properties: {
|
|
@@ -103007,41 +103078,44 @@ var postIntentTool = {
|
|
|
103007
103078
|
description: 'Product category (e.g., "accessories", "electronics", "fashion")',
|
|
103008
103079
|
default: "general"
|
|
103009
103080
|
},
|
|
103010
|
-
|
|
103081
|
+
backupCode: {
|
|
103011
103082
|
type: "string",
|
|
103012
|
-
description: "
|
|
103083
|
+
description: "Your NextNext backup code (enc1.xxx). Include this if you have one. Get one from create_identity if new."
|
|
103013
103084
|
}
|
|
103014
103085
|
},
|
|
103015
103086
|
required: ["description", "budget"]
|
|
103016
103087
|
},
|
|
103017
103088
|
handler: async (args) => {
|
|
103018
|
-
|
|
103019
|
-
|
|
103089
|
+
const { getCurrentSessionId: getCurrentSessionId2, authenticateSession: authenticateSession2 } = await Promise.resolve().then(() => (init_context(), exports_context));
|
|
103090
|
+
const isStdioMode2 = getCurrentSessionId2() === "stdio-local-session";
|
|
103091
|
+
let identity = null;
|
|
103092
|
+
if (isStdioMode2) {
|
|
103093
|
+
identity = getCurrentIdentity();
|
|
103094
|
+
}
|
|
103095
|
+
const backupCode = args.backupCode || args.encryptedKey;
|
|
103096
|
+
if (!identity && backupCode) {
|
|
103020
103097
|
try {
|
|
103021
|
-
|
|
103022
|
-
await authenticateSession2(args.encryptedKey);
|
|
103098
|
+
await authenticateSession2(backupCode);
|
|
103023
103099
|
identity = getCurrentIdentity();
|
|
103024
|
-
console.error(`[post_intent]
|
|
103100
|
+
console.error(`[post_intent] Authenticated with backup code`);
|
|
103025
103101
|
} catch (error2) {
|
|
103026
|
-
console.error(`[post_intent]
|
|
103102
|
+
console.error(`[post_intent] Auth failed: ${error2.message}`);
|
|
103027
103103
|
}
|
|
103028
103104
|
}
|
|
103029
103105
|
if (!identity) {
|
|
103030
|
-
console.error(`[post_intent] No identity found
|
|
103106
|
+
console.error(`[post_intent] No identity found`);
|
|
103031
103107
|
return {
|
|
103032
103108
|
content: [{
|
|
103033
103109
|
type: "text",
|
|
103034
103110
|
text: JSON.stringify({
|
|
103035
103111
|
status: "identity_required",
|
|
103036
|
-
error: "
|
|
103037
|
-
whatHappened: "Your session was lost due to server restart/scaling. Your identity data is safe but needs to be re-linked.",
|
|
103112
|
+
error: "No identity found. Include your backupCode parameter.",
|
|
103038
103113
|
solutions: [
|
|
103039
|
-
|
|
103040
|
-
|
|
103041
|
-
"3. If new user: Call create_identity() first"
|
|
103114
|
+
"1. If returning user: Include backupCode parameter in this tool call",
|
|
103115
|
+
"2. If new user: Call create_identity() first to get a backupCode"
|
|
103042
103116
|
],
|
|
103043
|
-
|
|
103044
|
-
|
|
103117
|
+
example: 'post_intent(description: "...", budget: 100, backupCode: "enc1.xxx...")',
|
|
103118
|
+
hint: "The backupCode was given to you when you first created your identity."
|
|
103045
103119
|
}, null, 2)
|
|
103046
103120
|
}]
|
|
103047
103121
|
};
|