@kroxy/kroxy 1.0.6 → 1.0.8
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.d.ts.map +1 -1
- package/dist/index.js +73 -4
- package/dist/index.js.map +1 -1
- package/dist/src/client.d.ts +43 -0
- package/dist/src/client.d.ts.map +1 -1
- package/dist/src/client.js +90 -13
- package/dist/src/client.js.map +1 -1
- package/dist/src/tools/balance.d.ts +13 -0
- package/dist/src/tools/balance.d.ts.map +1 -0
- package/dist/src/tools/balance.js +34 -0
- package/dist/src/tools/balance.js.map +1 -0
- package/dist/src/tools/browse.d.ts +19 -0
- package/dist/src/tools/browse.d.ts.map +1 -0
- package/dist/src/tools/browse.js +75 -0
- package/dist/src/tools/browse.js.map +1 -0
- package/dist/src/tools/dispute.d.ts +15 -0
- package/dist/src/tools/dispute.d.ts.map +1 -0
- package/dist/src/tools/dispute.js +61 -0
- package/dist/src/tools/dispute.js.map +1 -0
- package/dist/src/tools/hire.d.ts +2 -0
- package/dist/src/tools/hire.d.ts.map +1 -1
- package/dist/src/tools/hire.js +84 -16
- package/dist/src/tools/hire.js.map +1 -1
- package/dist/src/tools/history.d.ts +15 -0
- package/dist/src/tools/history.d.ts.map +1 -0
- package/dist/src/tools/history.js +54 -0
- package/dist/src/tools/history.js.map +1 -0
- package/dist/src/tools/setup.d.ts +9 -0
- package/dist/src/tools/setup.d.ts.map +1 -0
- package/dist/src/tools/setup.js +141 -0
- package/dist/src/tools/setup.js.map +1 -0
- package/dist/src/tools/status.d.ts +13 -0
- package/dist/src/tools/status.d.ts.map +1 -0
- package/dist/src/tools/status.js +79 -0
- package/dist/src/tools/status.js.map +1 -0
- package/dist/src/utils/fetchWithRetry.d.ts +12 -0
- package/dist/src/utils/fetchWithRetry.d.ts.map +1 -0
- package/dist/src/utils/fetchWithRetry.js +58 -0
- package/dist/src/utils/fetchWithRetry.js.map +1 -0
- package/index.ts +97 -4
- package/package.json +1 -1
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { Type } from '@sinclair/typebox';
|
|
2
|
+
import { getJob, raiseDisputeForEscrow } from '../client.js';
|
|
3
|
+
export const disputeParams = Type.Object({
|
|
4
|
+
jobId: Type.String({ description: 'The job ID to dispute.' }),
|
|
5
|
+
reason: Type.String({
|
|
6
|
+
minLength: 10,
|
|
7
|
+
description: 'Reason for the dispute. Be specific — this becomes part of the arbitration record.',
|
|
8
|
+
}),
|
|
9
|
+
});
|
|
10
|
+
export async function executeDispute(params) {
|
|
11
|
+
// Fetch the job to get the escrowId
|
|
12
|
+
let job;
|
|
13
|
+
try {
|
|
14
|
+
job = await getJob(params.jobId);
|
|
15
|
+
}
|
|
16
|
+
catch (err) {
|
|
17
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
18
|
+
if (msg.includes('404') || msg.includes('not found')) {
|
|
19
|
+
throw new Error(`Job not found: ${params.jobId}. Check the jobId from your hire receipt.`);
|
|
20
|
+
}
|
|
21
|
+
throw err;
|
|
22
|
+
}
|
|
23
|
+
if (!job.escrowId) {
|
|
24
|
+
throw new Error(`Job ${params.jobId} has no escrow (status: ${job.status}). ` +
|
|
25
|
+
'Disputes can only be raised on jobs that have an active escrow (IN_PROGRESS or AWARDED).');
|
|
26
|
+
}
|
|
27
|
+
if (job.status === 'COMPLETED') {
|
|
28
|
+
throw new Error(`Job ${params.jobId} is already COMPLETED and payment has been released. Disputes must be raised before completion.`);
|
|
29
|
+
}
|
|
30
|
+
if (job.status === 'CANCELLED') {
|
|
31
|
+
throw new Error(`Job ${params.jobId} is CANCELLED — no active escrow to dispute.`);
|
|
32
|
+
}
|
|
33
|
+
const result = await raiseDisputeForEscrow(job.escrowId, params.reason);
|
|
34
|
+
const lines = [
|
|
35
|
+
`⚖️ Dispute Raised`,
|
|
36
|
+
`─────────────────────────────────────`,
|
|
37
|
+
`Job: ${params.jobId}`,
|
|
38
|
+
`Escrow: ${job.escrowId}`,
|
|
39
|
+
`Status: ${result.status}`,
|
|
40
|
+
result.caseId ? `Case ID: ${result.caseId}` : '',
|
|
41
|
+
``,
|
|
42
|
+
`Reason: ${params.reason}`,
|
|
43
|
+
``,
|
|
44
|
+
`Next steps:`,
|
|
45
|
+
` 1. Both parties can submit evidence to the arbitration court`,
|
|
46
|
+
` 2. Three independent judges (Claude, GPT-4o, Gemini) will evaluate`,
|
|
47
|
+
` 3. 2/3 consensus required for automatic resolution`,
|
|
48
|
+
` 4. Funds will be released according to the verdict`,
|
|
49
|
+
].filter((l) => l !== null);
|
|
50
|
+
return {
|
|
51
|
+
content: [{ type: 'text', text: lines.join('\n') }],
|
|
52
|
+
details: {
|
|
53
|
+
jobId: params.jobId,
|
|
54
|
+
escrowId: job.escrowId,
|
|
55
|
+
caseId: result.caseId,
|
|
56
|
+
status: result.status,
|
|
57
|
+
reason: params.reason,
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=dispute.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispute.js","sourceRoot":"","sources":["../../../src/tools/dispute.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAE7D,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC;IACvC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,wBAAwB,EAAE,CAAC;IAC7D,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;QAClB,SAAS,EAAE,EAAE;QACb,WAAW,EAAE,oFAAoF;KAClG,CAAC;CACH,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAyC;IAEzC,oCAAoC;IACpC,IAAI,GAAG,CAAC;IACR,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACrD,MAAM,IAAI,KAAK,CAAC,kBAAkB,MAAM,CAAC,KAAK,2CAA2C,CAAC,CAAC;QAC7F,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CACb,OAAO,MAAM,CAAC,KAAK,2BAA2B,GAAG,CAAC,MAAM,KAAK;YAC7D,0FAA0F,CAC3F,CAAC;IACJ,CAAC;IAED,IAAI,GAAG,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CACb,OAAO,MAAM,CAAC,KAAK,iGAAiG,CACrH,CAAC;IACJ,CAAC;IAED,IAAI,GAAG,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,OAAO,MAAM,CAAC,KAAK,8CAA8C,CAAC,CAAC;IACrF,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAExE,MAAM,KAAK,GAAG;QACZ,oBAAoB;QACpB,uCAAuC;QACvC,aAAa,MAAM,CAAC,KAAK,EAAE;QAC3B,aAAa,GAAG,CAAC,QAAQ,EAAE;QAC3B,aAAa,MAAM,CAAC,MAAM,EAAE;QAC5B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE;QACjD,EAAE;QACF,aAAa,MAAM,CAAC,MAAM,EAAE;QAC5B,EAAE;QACF,aAAa;QACb,gEAAgE;QAChE,sEAAsE;QACtE,sDAAsD;QACtD,sDAAsD;KACvD,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IAE5B,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,OAAO,EAAE;YACP,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB;KACF,CAAC;AACJ,CAAC"}
|
package/dist/src/tools/hire.d.ts
CHANGED
|
@@ -2,11 +2,13 @@ export declare const hireParams: import("@sinclair/typebox").TObject<{
|
|
|
2
2
|
task: import("@sinclair/typebox").TString;
|
|
3
3
|
maxPrice: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
4
4
|
capability: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
5
|
+
minRep: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
5
6
|
}>;
|
|
6
7
|
export declare function executeHire(params: {
|
|
7
8
|
task: string;
|
|
8
9
|
maxPrice?: number;
|
|
9
10
|
capability?: string;
|
|
11
|
+
minRep?: number;
|
|
10
12
|
}): Promise<{
|
|
11
13
|
content: [{
|
|
12
14
|
type: 'text';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hire.d.ts","sourceRoot":"","sources":["../../../src/tools/hire.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,UAAU
|
|
1
|
+
{"version":3,"file":"hire.d.ts","sourceRoot":"","sources":["../../../src/tools/hire.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,UAAU;;;;;EAKrB,CAAC;AA4EH,wBAAsB,WAAW,CAC/B,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAChF,OAAO,CAAC;IAAE,OAAO,EAAE,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CA8G1E"}
|
package/dist/src/tools/hire.js
CHANGED
|
@@ -5,6 +5,7 @@ export const hireParams = Type.Object({
|
|
|
5
5
|
task: Type.String({ description: 'What you want the hired agent to do, e.g. "Research the top AI payment startups"' }),
|
|
6
6
|
maxPrice: Type.Optional(Type.Number({ minimum: 0.01, description: 'Maximum USDC budget, default 5.00' })),
|
|
7
7
|
capability: Type.Optional(Type.String({ description: 'Agent capability to match: research, writing, coding. Auto-detected from task if omitted.' })),
|
|
8
|
+
minRep: Type.Optional(Type.Number({ minimum: 0, maximum: 100, description: 'Minimum reputation score (0–100) required. Default: 0 (any agent accepted).' })),
|
|
8
9
|
});
|
|
9
10
|
function detectCapability(task) {
|
|
10
11
|
if (/research|find|search|analyz|summariz|look up/i.test(task))
|
|
@@ -41,53 +42,120 @@ function buildConditions(nexusUrl, jobId) {
|
|
|
41
42
|
requiredPassRate: 0.8,
|
|
42
43
|
};
|
|
43
44
|
}
|
|
45
|
+
function formatDuration(startMs) {
|
|
46
|
+
const secs = Math.floor((Date.now() - startMs) / 1000);
|
|
47
|
+
if (secs < 60)
|
|
48
|
+
return `${secs}s`;
|
|
49
|
+
const mins = Math.floor(secs / 60);
|
|
50
|
+
return `${mins}m ${secs % 60}s`;
|
|
51
|
+
}
|
|
52
|
+
function buildReceipt(opts) {
|
|
53
|
+
const lines = [
|
|
54
|
+
`✅ Job Complete — ${opts.task.slice(0, 60)}${opts.task.length > 60 ? '…' : ''}`,
|
|
55
|
+
``,
|
|
56
|
+
`Agent: ${opts.agentWallet}${opts.agentRep !== undefined ? ` (rep: ${opts.agentRep})` : ''}`,
|
|
57
|
+
`Task: ${opts.task}`,
|
|
58
|
+
`Duration: ${opts.duration}`,
|
|
59
|
+
`Paid: $${opts.amountPaid} USDC`,
|
|
60
|
+
opts.txHash ? `Escrow tx: ${opts.txHash}` : `Escrow ID: ${opts.escrowId}`,
|
|
61
|
+
`Audit: https://kroxy.ai/audit/${opts.escrowId}`,
|
|
62
|
+
];
|
|
63
|
+
if (opts.summary) {
|
|
64
|
+
lines.push('', `--- Deliverable Summary ---`, opts.summary);
|
|
65
|
+
}
|
|
66
|
+
if (opts.keyFindings?.length) {
|
|
67
|
+
lines.push('', `Key findings:`);
|
|
68
|
+
opts.keyFindings.slice(0, 5).forEach((f, i) => lines.push(` ${i + 1}. ${f}`));
|
|
69
|
+
}
|
|
70
|
+
return lines.join('\n');
|
|
71
|
+
}
|
|
44
72
|
export async function executeHire(params) {
|
|
45
73
|
const wallet = process.env.KROXY_AGENT_WALLET;
|
|
46
74
|
const privateKey = process.env.KROXY_AGENT_PRIVATE_KEY;
|
|
47
75
|
const nexusUrl = process.env.NEXUS_URL ?? 'http://localhost:3003';
|
|
48
76
|
const demoMode = process.env.KROXY_DEMO_MODE === '1';
|
|
49
77
|
if (!wallet)
|
|
50
|
-
throw new Error('KROXY_AGENT_WALLET is not configured');
|
|
78
|
+
throw new Error('KROXY_AGENT_WALLET is not configured. Run kroxy_setup to diagnose.');
|
|
51
79
|
if (!demoMode && !privateKey)
|
|
52
|
-
throw new Error('KROXY_AGENT_PRIVATE_KEY is not configured');
|
|
80
|
+
throw new Error('KROXY_AGENT_PRIVATE_KEY is not configured. Set KROXY_DEMO_MODE=1 to use demo mode without a real private key.');
|
|
53
81
|
const task = params.task;
|
|
54
82
|
const maxPrice = params.maxPrice ?? 5.0;
|
|
83
|
+
const minRep = params.minRep ?? 0;
|
|
55
84
|
const capability = params.capability ?? detectCapability(task);
|
|
56
85
|
const payerPrivateKey = privateKey ?? 'demo-private-key';
|
|
57
86
|
const jobId = `job_${Date.now()}_${randomBytes(3).toString('hex')}`;
|
|
87
|
+
const startMs = Date.now();
|
|
58
88
|
// 1. Find matching agents
|
|
59
89
|
const agents = await findAgents(capability, maxPrice);
|
|
60
90
|
if (!agents.length) {
|
|
61
|
-
throw new Error(`No agents available for "${capability}" within $${maxPrice} USDC`
|
|
91
|
+
throw new Error(`No agents available for "${capability}" within $${maxPrice} USDC. ` +
|
|
92
|
+
`Try kroxy_browse to see available agents, or increase maxPrice.`);
|
|
93
|
+
}
|
|
94
|
+
// 2. Enforce rep threshold
|
|
95
|
+
if (minRep > 0) {
|
|
96
|
+
const qualified = agents.filter((a) => (a.reputationScore ?? 0) >= minRep);
|
|
97
|
+
if (!qualified.length) {
|
|
98
|
+
throw new Error(`No agents meet the minimum reputation score of ${minRep}. ` +
|
|
99
|
+
`Found ${agents.length} agent${agents.length === 1 ? '' : 's'} below threshold. ` +
|
|
100
|
+
`Lower minRep or remove it to accept any agent.`);
|
|
101
|
+
}
|
|
62
102
|
}
|
|
63
|
-
//
|
|
103
|
+
// 3. Post job with verifier conditions pointing at Nexus
|
|
64
104
|
const conditions = buildConditions(nexusUrl, jobId);
|
|
65
105
|
const job = await postJob(jobId, task, capability, maxPrice, conditions, wallet);
|
|
66
|
-
//
|
|
106
|
+
// 4. Wait for a bid (up to 60s)
|
|
67
107
|
const jobWithBid = await pollJob(job.id, (j) => Boolean(j.bids?.length), 60_000);
|
|
68
108
|
if (!jobWithBid?.bids?.length) {
|
|
69
|
-
throw new Error(`No bids received within 60 seconds (jobId: ${job.id})`
|
|
109
|
+
throw new Error(`No bids received within 60 seconds (jobId: ${job.id}). ` +
|
|
110
|
+
`The agent may be offline — use kroxy_browse to check availability.`);
|
|
70
111
|
}
|
|
71
112
|
const bid = jobWithBid.bids[0];
|
|
72
|
-
//
|
|
113
|
+
// 5. Budget guardrail before accepting
|
|
114
|
+
const bidPrice = parseFloat(bid.priceUsdc);
|
|
115
|
+
if (bidPrice > maxPrice) {
|
|
116
|
+
throw new Error(`Bid of $${bid.priceUsdc} USDC exceeds your budget of $${maxPrice} USDC. ` +
|
|
117
|
+
`Increase maxPrice to $${bidPrice} or higher to accept this bid.`);
|
|
118
|
+
}
|
|
119
|
+
// 6. Accept bid — locks USDC in escrow on Base
|
|
73
120
|
const escrowResult = await acceptBid(job.id, bid.id, payerPrivateKey);
|
|
74
|
-
//
|
|
121
|
+
// 7. Poll for completion (up to 5 minutes)
|
|
75
122
|
const completed = await pollJob(job.id, (j) => j.status === 'COMPLETED', 300_000);
|
|
76
123
|
if (!completed) {
|
|
77
|
-
throw new Error(`Job timed out (jobId: ${job.id}, escrowId: ${escrowResult.escrowId}). ` +
|
|
78
|
-
`Funds are in escrow —
|
|
124
|
+
throw new Error(`Job timed out after 5 minutes (jobId: ${job.id}, escrowId: ${escrowResult.escrowId}). ` +
|
|
125
|
+
`Funds are still in escrow — use kroxy_status to monitor or kroxy_dispute to raise a dispute.`);
|
|
79
126
|
}
|
|
80
|
-
const
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
127
|
+
const deliverable = completed.deliverable;
|
|
128
|
+
const bidAgent = agents.find((a) => a.walletAddress === bid.providerWallet);
|
|
129
|
+
const duration = formatDuration(startMs);
|
|
130
|
+
const receipt = buildReceipt({
|
|
131
|
+
task,
|
|
132
|
+
agentWallet: bid.providerWallet,
|
|
133
|
+
agentRep: bidAgent?.reputationScore,
|
|
134
|
+
amountPaid: bid.priceUsdc,
|
|
135
|
+
duration,
|
|
136
|
+
escrowId: escrowResult.escrowId,
|
|
137
|
+
txHash: escrowResult.txHash,
|
|
138
|
+
summary: deliverable?.summary,
|
|
139
|
+
keyFindings: deliverable?.keyFindings,
|
|
140
|
+
});
|
|
141
|
+
const details = {
|
|
142
|
+
jobId: completed.id,
|
|
143
|
+
escrowId: escrowResult.escrowId,
|
|
144
|
+
txHash: escrowResult.txHash,
|
|
84
145
|
agent: bid.providerWallet,
|
|
146
|
+
agentRep: bidAgent?.reputationScore,
|
|
85
147
|
amountPaid: `${bid.priceUsdc} USDC`,
|
|
148
|
+
duration,
|
|
86
149
|
auditTrail: `https://kroxy.ai/audit/${escrowResult.escrowId}`,
|
|
150
|
+
deliverable: {
|
|
151
|
+
summary: deliverable?.summary ?? '(no summary)',
|
|
152
|
+
keyFindings: deliverable?.keyFindings ?? [],
|
|
153
|
+
sources: deliverable?.sources ?? [],
|
|
154
|
+
},
|
|
87
155
|
};
|
|
88
156
|
return {
|
|
89
|
-
content: [{ type: 'text', text:
|
|
90
|
-
details
|
|
157
|
+
content: [{ type: 'text', text: receipt }],
|
|
158
|
+
details,
|
|
91
159
|
};
|
|
92
160
|
}
|
|
93
161
|
//# sourceMappingURL=hire.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hire.js","sourceRoot":"","sources":["../../../src/tools/hire.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC,OAAO,EACL,UAAU,EACV,OAAO,EACP,SAAS,EACT,OAAO,GACR,MAAM,cAAc,CAAC;AAEtB,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC;IACpC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,kFAAkF,EAAE,CAAC;IACtH,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,mCAAmC,EAAE,CAAC,CAAC;IACzG,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,2FAA2F,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"hire.js","sourceRoot":"","sources":["../../../src/tools/hire.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare const historyParams: import("@sinclair/typebox").TObject<{
|
|
2
|
+
wallet: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
3
|
+
limit: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
|
|
4
|
+
}>;
|
|
5
|
+
export declare function executeHistory(params: {
|
|
6
|
+
wallet?: string;
|
|
7
|
+
limit?: number;
|
|
8
|
+
}): Promise<{
|
|
9
|
+
content: [{
|
|
10
|
+
type: 'text';
|
|
11
|
+
text: string;
|
|
12
|
+
}];
|
|
13
|
+
details: unknown;
|
|
14
|
+
}>;
|
|
15
|
+
//# sourceMappingURL=history.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../../src/tools/history.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,aAAa;;;EAUxB,CAAC;AAeH,wBAAsB,cAAc,CAClC,MAAM,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1C,OAAO,CAAC;IAAE,OAAO,EAAE,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CA0C1E"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { Type } from '@sinclair/typebox';
|
|
2
|
+
import { listJobs } from '../client.js';
|
|
3
|
+
export const historyParams = Type.Object({
|
|
4
|
+
wallet: Type.Optional(Type.String({
|
|
5
|
+
description: 'Wallet address to fetch history for. Defaults to KROXY_AGENT_WALLET.',
|
|
6
|
+
pattern: '^0x[0-9a-fA-F]{40}$',
|
|
7
|
+
})),
|
|
8
|
+
limit: Type.Optional(Type.Integer({ minimum: 1, maximum: 50, description: 'Number of jobs to return. Default 10.' })),
|
|
9
|
+
});
|
|
10
|
+
const STATUS_ICONS = {
|
|
11
|
+
COMPLETED: '✅',
|
|
12
|
+
IN_PROGRESS: '🔵',
|
|
13
|
+
AWARDED: '🟠',
|
|
14
|
+
OPEN: '🟡',
|
|
15
|
+
CANCELLED: '⛔',
|
|
16
|
+
DISPUTED: '⚖️ ',
|
|
17
|
+
};
|
|
18
|
+
function pad(str, len) {
|
|
19
|
+
return str.length >= len ? str.slice(0, len) : str + ' '.repeat(len - str.length);
|
|
20
|
+
}
|
|
21
|
+
export async function executeHistory(params) {
|
|
22
|
+
const wallet = params.wallet ?? process.env.KROXY_AGENT_WALLET;
|
|
23
|
+
if (!wallet) {
|
|
24
|
+
throw new Error('No wallet address provided and KROXY_AGENT_WALLET is not configured. ' +
|
|
25
|
+
'Pass a wallet address or set KROXY_AGENT_WALLET in plugin config.');
|
|
26
|
+
}
|
|
27
|
+
const limit = params.limit ?? 10;
|
|
28
|
+
const jobs = await listJobs({ posterWallet: wallet, limit });
|
|
29
|
+
const displayWallet = `${wallet.slice(0, 6)}...${wallet.slice(-4)}`;
|
|
30
|
+
if (jobs.length === 0) {
|
|
31
|
+
return {
|
|
32
|
+
content: [{ type: 'text', text: `No job history found for ${displayWallet}.` }],
|
|
33
|
+
details: { wallet, jobs: [] },
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
const lines = [`Job History — ${displayWallet} (last ${jobs.length})`, '─'.repeat(70)];
|
|
37
|
+
jobs.forEach((job, i) => {
|
|
38
|
+
const icon = STATUS_ICONS[job.status] ?? ' ';
|
|
39
|
+
const desc = job.description.slice(0, 45);
|
|
40
|
+
const budget = job.budgetMaxUsdc ? `$${parseFloat(job.budgetMaxUsdc).toFixed(2)}` : ' — ';
|
|
41
|
+
const escrow = job.escrowId ? ` escrow: ${job.escrowId.slice(0, 16)}...` : '';
|
|
42
|
+
lines.push(`${i + 1}. ${icon} ${pad(job.status, 12)} ${pad(desc, 47)}${budget}${escrow}`);
|
|
43
|
+
lines.push(` ID: ${job.id}${job.escrowId ? '' : ''}`);
|
|
44
|
+
});
|
|
45
|
+
lines.push('');
|
|
46
|
+
const completed = jobs.filter((j) => j.status === 'COMPLETED').length;
|
|
47
|
+
const disputed = jobs.filter((j) => j.status === 'DISPUTED').length;
|
|
48
|
+
lines.push(`Summary: ${completed} completed, ${disputed} disputed, ${jobs.length} total shown`);
|
|
49
|
+
return {
|
|
50
|
+
content: [{ type: 'text', text: lines.join('\n') }],
|
|
51
|
+
details: { wallet, jobs },
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.js","sourceRoot":"","sources":["../../../src/tools/history.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const setupParams: import("@sinclair/typebox").TObject<{}>;
|
|
2
|
+
export declare function executeSetup(_params: Record<string, never>): Promise<{
|
|
3
|
+
content: [{
|
|
4
|
+
type: 'text';
|
|
5
|
+
text: string;
|
|
6
|
+
}];
|
|
7
|
+
details: unknown;
|
|
8
|
+
}>;
|
|
9
|
+
//# sourceMappingURL=setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../src/tools/setup.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,WAAW,yCAAkB,CAAC;AA8B3C,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,GAC7B,OAAO,CAAC;IAAE,OAAO,EAAE,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CA6H1E"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { Type } from '@sinclair/typebox';
|
|
2
|
+
import { createHash } from 'node:crypto';
|
|
3
|
+
import { pingApi } from '../client.js';
|
|
4
|
+
export const setupParams = Type.Object({});
|
|
5
|
+
function icon(s) {
|
|
6
|
+
return s === 'ok' ? '✅' : s === 'warn' ? '⚠️ ' : '❌';
|
|
7
|
+
}
|
|
8
|
+
function maskKey(key) {
|
|
9
|
+
if (key.length <= 8)
|
|
10
|
+
return '***';
|
|
11
|
+
return `${key.slice(0, 4)}...${key.slice(-4)}`;
|
|
12
|
+
}
|
|
13
|
+
function maskWallet(wallet) {
|
|
14
|
+
return `${wallet.slice(0, 6)}...${wallet.slice(-4)}`;
|
|
15
|
+
}
|
|
16
|
+
/** Generate a deterministic demo wallet address from a seed. Not a real key. */
|
|
17
|
+
function demoDerivedAddress() {
|
|
18
|
+
const hash = createHash('sha256').update('kroxy-demo-wallet').digest('hex');
|
|
19
|
+
return `0x${hash.slice(0, 40)}`;
|
|
20
|
+
}
|
|
21
|
+
export async function executeSetup(_params) {
|
|
22
|
+
const apiUrl = process.env.KROXY_API_URL ?? 'http://localhost:3001';
|
|
23
|
+
const apiKey = process.env.KROXY_API_KEY;
|
|
24
|
+
const wallet = process.env.KROXY_AGENT_WALLET;
|
|
25
|
+
const privateKey = process.env.KROXY_AGENT_PRIVATE_KEY;
|
|
26
|
+
const demoMode = process.env.KROXY_DEMO_MODE === '1';
|
|
27
|
+
const nexusUrl = process.env.NEXUS_URL;
|
|
28
|
+
const checks = [];
|
|
29
|
+
let blockingIssues = 0;
|
|
30
|
+
// 1. API connectivity
|
|
31
|
+
const apiReachable = await pingApi();
|
|
32
|
+
checks.push({
|
|
33
|
+
item: 'API connectivity',
|
|
34
|
+
status: apiReachable ? 'ok' : 'error',
|
|
35
|
+
value: apiUrl,
|
|
36
|
+
hint: apiReachable
|
|
37
|
+
? undefined
|
|
38
|
+
: `Cannot reach ${apiUrl}. Start the API or set KROXY_API_URL to a running instance.`,
|
|
39
|
+
});
|
|
40
|
+
if (!apiReachable)
|
|
41
|
+
blockingIssues++;
|
|
42
|
+
// 2. Demo mode
|
|
43
|
+
checks.push({
|
|
44
|
+
item: 'Demo mode',
|
|
45
|
+
status: demoMode ? 'warn' : 'ok',
|
|
46
|
+
value: demoMode ? 'ON (no real USDC will move)' : 'OFF (live Base mainnet)',
|
|
47
|
+
hint: demoMode
|
|
48
|
+
? 'Demo mode active — fake tx hashes, no real wallet needed. Set KROXY_DEMO_MODE=1 to enable.'
|
|
49
|
+
: 'Set KROXY_DEMO_MODE=1 for a sandbox demo without real money.',
|
|
50
|
+
});
|
|
51
|
+
// 3. API key
|
|
52
|
+
if (apiKey) {
|
|
53
|
+
checks.push({ item: 'API key (KROXY_API_KEY)', status: 'ok', value: maskKey(apiKey) });
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
checks.push({
|
|
57
|
+
item: 'API key (KROXY_API_KEY)',
|
|
58
|
+
status: 'error',
|
|
59
|
+
hint: 'Required for posting jobs and hiring agents. Set in plugin config.',
|
|
60
|
+
});
|
|
61
|
+
blockingIssues++;
|
|
62
|
+
}
|
|
63
|
+
// 4. Agent wallet
|
|
64
|
+
let suggestedWallet;
|
|
65
|
+
if (wallet) {
|
|
66
|
+
checks.push({ item: 'Agent wallet (KROXY_AGENT_WALLET)', status: 'ok', value: maskWallet(wallet) });
|
|
67
|
+
}
|
|
68
|
+
else if (demoMode) {
|
|
69
|
+
suggestedWallet = demoDerivedAddress();
|
|
70
|
+
checks.push({
|
|
71
|
+
item: 'Agent wallet (KROXY_AGENT_WALLET)',
|
|
72
|
+
status: 'warn',
|
|
73
|
+
value: `auto-generated for demo: ${maskWallet(suggestedWallet)}`,
|
|
74
|
+
hint: `In demo mode a wallet is auto-generated. Set KROXY_AGENT_WALLET=${suggestedWallet} to make it permanent.`,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
checks.push({
|
|
79
|
+
item: 'Agent wallet (KROXY_AGENT_WALLET)',
|
|
80
|
+
status: 'error',
|
|
81
|
+
hint: 'Required to post jobs and receive payments. Provide a Base mainnet wallet address.',
|
|
82
|
+
});
|
|
83
|
+
blockingIssues++;
|
|
84
|
+
}
|
|
85
|
+
// 5. Private key (only needed in live mode for hiring)
|
|
86
|
+
if (demoMode) {
|
|
87
|
+
checks.push({ item: 'Private key (KROXY_AGENT_PRIVATE_KEY)', status: 'ok', value: 'not needed in demo mode' });
|
|
88
|
+
}
|
|
89
|
+
else if (privateKey) {
|
|
90
|
+
checks.push({ item: 'Private key (KROXY_AGENT_PRIVATE_KEY)', status: 'ok', value: '******* (set)' });
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
checks.push({
|
|
94
|
+
item: 'Private key (KROXY_AGENT_PRIVATE_KEY)',
|
|
95
|
+
status: 'warn',
|
|
96
|
+
hint: 'Needed to hire agents (sign escrow tx). Not required for read-only tools.',
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
// 6. Nexus URL (optional)
|
|
100
|
+
checks.push({
|
|
101
|
+
item: 'Nexus URL (NEXUS_URL)',
|
|
102
|
+
status: nexusUrl ? 'ok' : 'warn',
|
|
103
|
+
value: nexusUrl ?? 'http://localhost:3003 (default)',
|
|
104
|
+
hint: nexusUrl ? undefined : 'Using default. Set NEXUS_URL if your provider agent is on a different host.',
|
|
105
|
+
});
|
|
106
|
+
// Determine overall status
|
|
107
|
+
let overallStatus;
|
|
108
|
+
let nextStep;
|
|
109
|
+
if (blockingIssues === 0) {
|
|
110
|
+
overallStatus = demoMode ? 'demo_ready' : 'ready';
|
|
111
|
+
nextStep = demoMode
|
|
112
|
+
? 'All good! Try: kroxy_hire with task="Research top AI startups" and maxPrice=2.5'
|
|
113
|
+
: 'All good! Use kroxy_hire to post your first job.';
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
overallStatus = 'needs_config';
|
|
117
|
+
const firstError = checks.find((c) => c.status === 'error');
|
|
118
|
+
nextStep = firstError?.hint ?? 'Fix the errors above to get started.';
|
|
119
|
+
}
|
|
120
|
+
const lines = [
|
|
121
|
+
`Kroxy Setup — ${overallStatus === 'ready' ? '✅ Ready' : overallStatus === 'demo_ready' ? '✅ Demo Ready' : '❌ Needs Config'}`,
|
|
122
|
+
'',
|
|
123
|
+
...checks.map((c) => `${icon(c.status)} ${c.item}${c.value ? `: ${c.value}` : ''}${c.hint ? `\n ${c.hint}` : ''}`),
|
|
124
|
+
'',
|
|
125
|
+
`Next step: ${nextStep}`,
|
|
126
|
+
];
|
|
127
|
+
if (suggestedWallet) {
|
|
128
|
+
lines.push('', `💡 Suggested wallet for demo: ${suggestedWallet}`);
|
|
129
|
+
}
|
|
130
|
+
const result = {
|
|
131
|
+
status: overallStatus,
|
|
132
|
+
checklist: checks,
|
|
133
|
+
nextStep,
|
|
134
|
+
suggestedDemoWallet: suggestedWallet,
|
|
135
|
+
};
|
|
136
|
+
return {
|
|
137
|
+
content: [{ type: 'text', text: lines.join('\n') }],
|
|
138
|
+
details: result,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/tools/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAW3C,SAAS,IAAI,CAAC,CAAc;IAC1B,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;AACvD,CAAC;AAED,SAAS,OAAO,CAAC,GAAW;IAC1B,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAClC,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACjD,CAAC;AAED,SAAS,UAAU,CAAC,MAAc;IAChC,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACvD,CAAC;AAED,gFAAgF;AAChF,SAAS,kBAAkB;IACzB,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5E,OAAO,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAA8B;IAE9B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,uBAAuB,CAAC;IACpE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IACzC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IAC9C,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;IACvD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,GAAG,CAAC;IACrD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;IAEvC,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,IAAI,cAAc,GAAG,CAAC,CAAC;IAEvB,sBAAsB;IACtB,MAAM,YAAY,GAAG,MAAM,OAAO,EAAE,CAAC;IACrC,MAAM,CAAC,IAAI,CAAC;QACV,IAAI,EAAE,kBAAkB;QACxB,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO;QACrC,KAAK,EAAE,MAAM;QACb,IAAI,EAAE,YAAY;YAChB,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,gBAAgB,MAAM,6DAA6D;KACxF,CAAC,CAAC;IACH,IAAI,CAAC,YAAY;QAAE,cAAc,EAAE,CAAC;IAEpC,eAAe;IACf,MAAM,CAAC,IAAI,CAAC;QACV,IAAI,EAAE,WAAW;QACjB,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI;QAChC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,yBAAyB;QAC3E,IAAI,EAAE,QAAQ;YACZ,CAAC,CAAC,4FAA4F;YAC9F,CAAC,CAAC,8DAA8D;KACnE,CAAC,CAAC;IAEH,aAAa;IACb,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,yBAAyB,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACzF,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,yBAAyB;YAC/B,MAAM,EAAE,OAAO;YACf,IAAI,EAAE,oEAAoE;SAC3E,CAAC,CAAC;QACH,cAAc,EAAE,CAAC;IACnB,CAAC;IAED,kBAAkB;IAClB,IAAI,eAAmC,CAAC;IACxC,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,mCAAmC,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACtG,CAAC;SAAM,IAAI,QAAQ,EAAE,CAAC;QACpB,eAAe,GAAG,kBAAkB,EAAE,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,mCAAmC;YACzC,MAAM,EAAE,MAAM;YACd,KAAK,EAAE,4BAA4B,UAAU,CAAC,eAAe,CAAC,EAAE;YAChE,IAAI,EAAE,mEAAmE,eAAe,wBAAwB;SACjH,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,mCAAmC;YACzC,MAAM,EAAE,OAAO;YACf,IAAI,EAAE,oFAAoF;SAC3F,CAAC,CAAC;QACH,cAAc,EAAE,CAAC;IACnB,CAAC;IAED,uDAAuD;IACvD,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,uCAAuC,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAAC,CAAC;IACjH,CAAC;SAAM,IAAI,UAAU,EAAE,CAAC;QACtB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,uCAAuC,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC;IACvG,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,uCAAuC;YAC7C,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,2EAA2E;SAClF,CAAC,CAAC;IACL,CAAC;IAED,0BAA0B;IAC1B,MAAM,CAAC,IAAI,CAAC;QACV,IAAI,EAAE,uBAAuB;QAC7B,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM;QAChC,KAAK,EAAE,QAAQ,IAAI,iCAAiC;QACpD,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,6EAA6E;KAC3G,CAAC,CAAC;IAEH,2BAA2B;IAC3B,IAAI,aAAsD,CAAC;IAC3D,IAAI,QAAgB,CAAC;IAErB,IAAI,cAAc,KAAK,CAAC,EAAE,CAAC;QACzB,aAAa,GAAG,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC;QAClD,QAAQ,GAAG,QAAQ;YACjB,CAAC,CAAC,iFAAiF;YACnF,CAAC,CAAC,kDAAkD,CAAC;IACzD,CAAC;SAAM,CAAC;QACN,aAAa,GAAG,cAAc,CAAC;QAC/B,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC;QAC5D,QAAQ,GAAG,UAAU,EAAE,IAAI,IAAI,sCAAsC,CAAC;IACxE,CAAC;IAED,MAAM,KAAK,GAAG;QACZ,iBAAiB,aAAa,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,KAAK,YAAY,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,gBAAgB,EAAE;QAC7H,EAAE;QACF,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACtH,EAAE;QACF,cAAc,QAAQ,EAAE;KACzB,CAAC;IAEF,IAAI,eAAe,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,iCAAiC,eAAe,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,MAAM,GAAG;QACb,MAAM,EAAE,aAAa;QACrB,SAAS,EAAE,MAAM;QACjB,QAAQ;QACR,mBAAmB,EAAE,eAAe;KACrC,CAAC;IAEF,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,OAAO,EAAE,MAAM;KAChB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare const statusParams: import("@sinclair/typebox").TObject<{
|
|
2
|
+
jobId: import("@sinclair/typebox").TString;
|
|
3
|
+
}>;
|
|
4
|
+
export declare function executeStatus(params: {
|
|
5
|
+
jobId: string;
|
|
6
|
+
}): Promise<{
|
|
7
|
+
content: [{
|
|
8
|
+
type: 'text';
|
|
9
|
+
text: string;
|
|
10
|
+
}];
|
|
11
|
+
details: unknown;
|
|
12
|
+
}>;
|
|
13
|
+
//# sourceMappingURL=status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/tools/status.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,YAAY;;EAEvB,CAAC;AAoBH,wBAAsB,aAAa,CACjC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GACxB,OAAO,CAAC;IAAE,OAAO,EAAE,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CA4D1E"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { Type } from '@sinclair/typebox';
|
|
2
|
+
import { getJob } from '../client.js';
|
|
3
|
+
export const statusParams = Type.Object({
|
|
4
|
+
jobId: Type.String({ description: 'The job ID returned by kroxy_hire or kroxy_browse.' }),
|
|
5
|
+
});
|
|
6
|
+
function timeAgo(isoDate) {
|
|
7
|
+
const diffMs = Date.now() - new Date(isoDate).getTime();
|
|
8
|
+
const secs = Math.floor(diffMs / 1000);
|
|
9
|
+
if (secs < 60)
|
|
10
|
+
return `${secs}s ago`;
|
|
11
|
+
const mins = Math.floor(secs / 60);
|
|
12
|
+
if (mins < 60)
|
|
13
|
+
return `${mins}m ${secs % 60}s ago`;
|
|
14
|
+
const hrs = Math.floor(mins / 60);
|
|
15
|
+
return `${hrs}h ${mins % 60}m ago`;
|
|
16
|
+
}
|
|
17
|
+
const STATUS_LABELS = {
|
|
18
|
+
OPEN: '🟡 OPEN — waiting for bids',
|
|
19
|
+
AWARDED: '🟠 AWARDED — bid accepted, awaiting escrow',
|
|
20
|
+
IN_PROGRESS: '🔵 IN PROGRESS — agent working, USDC in escrow',
|
|
21
|
+
COMPLETED: '✅ COMPLETED — payment released',
|
|
22
|
+
CANCELLED: '⛔ CANCELLED',
|
|
23
|
+
};
|
|
24
|
+
export async function executeStatus(params) {
|
|
25
|
+
let job;
|
|
26
|
+
try {
|
|
27
|
+
job = await getJob(params.jobId);
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
31
|
+
if (msg.includes('404') || msg.includes('not found')) {
|
|
32
|
+
throw new Error(`Job not found: ${params.jobId}. Double-check the jobId from your hire receipt.`);
|
|
33
|
+
}
|
|
34
|
+
throw err;
|
|
35
|
+
}
|
|
36
|
+
const statusLabel = STATUS_LABELS[job.status] ?? job.status;
|
|
37
|
+
const postedAgo = job.createdAt ? timeAgo(job.createdAt) : 'unknown';
|
|
38
|
+
const updatedAgo = job.updatedAt ? timeAgo(job.updatedAt) : 'unknown';
|
|
39
|
+
const activeBid = job.bids?.find((b) => b.status === 'ACCEPTED');
|
|
40
|
+
const pendingBids = job.bids?.filter((b) => b.status === 'PENDING') ?? [];
|
|
41
|
+
const lines = [
|
|
42
|
+
`Job Status: ${params.jobId}`,
|
|
43
|
+
`─────────────────────────────────────`,
|
|
44
|
+
`Status: ${statusLabel}`,
|
|
45
|
+
`Posted: ${postedAgo}`,
|
|
46
|
+
`Updated: ${updatedAgo}`,
|
|
47
|
+
];
|
|
48
|
+
if (activeBid) {
|
|
49
|
+
lines.push(`Agent: ${activeBid.providerWallet}`);
|
|
50
|
+
lines.push(`Agreed: $${activeBid.priceUsdc} USDC`);
|
|
51
|
+
}
|
|
52
|
+
else if (pendingBids.length > 0) {
|
|
53
|
+
lines.push(`Bids: ${pendingBids.length} pending`);
|
|
54
|
+
}
|
|
55
|
+
if (job.escrowId) {
|
|
56
|
+
lines.push(`Escrow: ${job.escrowId} (USDC locked)`);
|
|
57
|
+
}
|
|
58
|
+
if (job.status === 'COMPLETED' && job.deliverable) {
|
|
59
|
+
const summary = job.deliverable?.summary;
|
|
60
|
+
if (summary) {
|
|
61
|
+
lines.push('', `Result: ${String(summary).slice(0, 200)}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
const result = {
|
|
65
|
+
jobId: job.id,
|
|
66
|
+
status: job.status,
|
|
67
|
+
postedAgo,
|
|
68
|
+
updatedAgo,
|
|
69
|
+
escrowId: job.escrowId ?? null,
|
|
70
|
+
activeBid: activeBid ?? null,
|
|
71
|
+
pendingBidCount: pendingBids.length,
|
|
72
|
+
deliverable: job.deliverable ?? null,
|
|
73
|
+
};
|
|
74
|
+
return {
|
|
75
|
+
content: [{ type: 'text', text: lines.join('\n') }],
|
|
76
|
+
details: result,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/tools/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* fetch with exponential backoff retry and per-attempt timeout.
|
|
3
|
+
*
|
|
4
|
+
* Retries on:
|
|
5
|
+
* - TypeError (network / DNS failure)
|
|
6
|
+
* - HTTP 429 Too Many Requests (respects Retry-After header, cap 30s)
|
|
7
|
+
* - HTTP 503 Service Unavailable
|
|
8
|
+
*
|
|
9
|
+
* Does NOT retry on other 4xx or 500/502.
|
|
10
|
+
*/
|
|
11
|
+
export declare function fetchWithRetry(url: string, options?: RequestInit, timeoutMs?: number): Promise<Response>;
|
|
12
|
+
//# sourceMappingURL=fetchWithRetry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetchWithRetry.d.ts","sourceRoot":"","sources":["../../../src/utils/fetchWithRetry.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,WAAgB,EACzB,SAAS,SAAS,GACjB,OAAO,CAAC,QAAQ,CAAC,CAgDnB"}
|