@lucid-agents/taskmarket 0.5.1 → 0.5.2

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.
@@ -0,0 +1,47 @@
1
+ import { Command } from 'commander';
2
+ import { loadKeystore } from '../../lib/keystore.js';
3
+ import { apiPost } from '../../lib/api.js';
4
+ import { isHumanMode, printError } from '../../lib/output.js';
5
+ import { writeFileSync } from 'fs';
6
+ export const downloadCmd = new Command('download')
7
+ .description('Download a submission file (requester or worker)')
8
+ .argument('<taskId>', 'Task ID (0x-prefixed hex)')
9
+ .requiredOption('--submission <id>', 'Submission ID (from `task submissions`)')
10
+ .option('--output <path>', 'Save to file instead of printing to stdout')
11
+ .option('--human', 'Human-readable output')
12
+ .action(async (taskId, opts) => {
13
+ const human = isHumanMode(opts.human);
14
+ const keystore = await loadKeystore();
15
+ let presignedUrl;
16
+ try {
17
+ const result = (await apiPost(`/api/tasks/${taskId}/submissions/${opts.submission}/preview`, {
18
+ taskId,
19
+ submissionId: opts.submission,
20
+ deviceId: keystore.deviceId,
21
+ apiToken: keystore.apiToken,
22
+ }));
23
+ presignedUrl = result.presignedUrl;
24
+ }
25
+ catch (err) {
26
+ const msg = err instanceof Error ? err.message : 'Failed to get download URL.';
27
+ printError(msg, human);
28
+ }
29
+ const res = await fetch(presignedUrl);
30
+ if (!res.ok) {
31
+ printError(`Failed to download file: ${res.status}`, human);
32
+ }
33
+ const content = await res.text();
34
+ if (opts.output) {
35
+ writeFileSync(opts.output, content, 'utf8');
36
+ if (human) {
37
+ console.log(`Saved to ${opts.output}`);
38
+ }
39
+ else {
40
+ process.stdout.write(JSON.stringify({ ok: true, data: { savedTo: opts.output } }) + '\n');
41
+ }
42
+ }
43
+ else {
44
+ process.stdout.write(content);
45
+ }
46
+ });
47
+ //# sourceMappingURL=download.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"download.js","sourceRoot":"","sources":["../../../src/commands/task/download.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAEnC,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC;KAC/C,WAAW,CAAC,kDAAkD,CAAC;KAC/D,QAAQ,CAAC,UAAU,EAAE,2BAA2B,CAAC;KACjD,cAAc,CAAC,mBAAmB,EAAE,yCAAyC,CAAC;KAC9E,MAAM,CAAC,iBAAiB,EAAE,4CAA4C,CAAC;KACvE,MAAM,CAAC,SAAS,EAAE,uBAAuB,CAAC;KAC1C,MAAM,CACL,KAAK,EAAE,MAAc,EAAE,IAA8D,EAAE,EAAE;IACvF,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEtC,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAC;IAEtC,IAAI,YAAoB,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,CAAC,MAAM,OAAO,CAC3B,cAAc,MAAM,gBAAgB,IAAI,CAAC,UAAU,UAAU,EAC7D;YACE,MAAM;YACN,YAAY,EAAE,IAAI,CAAC,UAAU;YAC7B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;SAC5B,CACF,CAA6B,CAAC;QAC/B,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;IACrC,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,6BAA6B,CAAC;QAC/E,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,YAAa,CAAC,CAAC;IACvC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,UAAU,CAAC,4BAA4B,GAAG,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC,CAAC;IAC9D,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAEjC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAC5C,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QAC5F,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;AACH,CAAC,CACF,CAAC"}
@@ -10,6 +10,9 @@ import { pitchCmd } from './pitch.js';
10
10
  import { selectWorkerCmd } from './select-worker.js';
11
11
  import { proofCmd } from './proof.js';
12
12
  import { bidCmd } from './bid.js';
13
+ import { submissionsCmd } from './submissions.js';
14
+ import { selectWinnerCmd } from './select-winner.js';
15
+ import { downloadCmd } from './download.js';
13
16
  export const taskCommand = new Command('task').description('Manage tasks');
14
17
  taskCommand.addCommand(createCmd);
15
18
  taskCommand.addCommand(listCmd);
@@ -22,4 +25,7 @@ taskCommand.addCommand(pitchCmd);
22
25
  taskCommand.addCommand(selectWorkerCmd);
23
26
  taskCommand.addCommand(proofCmd);
24
27
  taskCommand.addCommand(bidCmd);
28
+ taskCommand.addCommand(submissionsCmd);
29
+ taskCommand.addCommand(selectWinnerCmd);
30
+ taskCommand.addCommand(downloadCmd);
25
31
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/task/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;AAE3E,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;AAClC,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;AAChC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AAC/B,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;AAClC,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;AAClC,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;AAChC,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AACjC,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AACjC,WAAW,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;AACxC,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AACjC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/task/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;AAE3E,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;AAClC,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;AAChC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AAC/B,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;AAClC,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;AAClC,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;AAChC,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AACjC,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AACjC,WAAW,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;AACxC,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AACjC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AAC/B,WAAW,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;AACvC,WAAW,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;AACxC,WAAW,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { Command } from 'commander';
2
+ import { apiPost } from '../../lib/api.js';
3
+ import { isHumanMode, printResult, printError } from '../../lib/output.js';
4
+ export const selectWinnerCmd = new Command('select-winner')
5
+ .description('Select lowest bidder after auction deadline (requester only)')
6
+ .argument('<taskId>', 'Task ID (0x-prefixed hex)')
7
+ .option('--human', 'Human-readable output')
8
+ .action(async (taskId, opts) => {
9
+ const human = isHumanMode(opts.human);
10
+ let result;
11
+ try {
12
+ result = (await apiPost(`/api/tasks/${taskId}/bids/select-winner`, {
13
+ taskId,
14
+ }));
15
+ }
16
+ catch (err) {
17
+ const msg = err instanceof Error ? err.message : 'Failed to select winner.';
18
+ printError(msg, human);
19
+ }
20
+ if (human) {
21
+ console.log('Winner selected:', result.workerAddress);
22
+ console.log('');
23
+ console.log(`Next: taskmarket task accept ${taskId} --worker ${result.workerAddress}`);
24
+ }
25
+ else {
26
+ printResult(result, human);
27
+ }
28
+ });
29
+ //# sourceMappingURL=select-winner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select-winner.js","sourceRoot":"","sources":["../../../src/commands/task/select-winner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAE3E,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,OAAO,CAAC,eAAe,CAAC;KACxD,WAAW,CAAC,8DAA8D,CAAC;KAC3E,QAAQ,CAAC,UAAU,EAAE,2BAA2B,CAAC;KACjD,MAAM,CAAC,SAAS,EAAE,uBAAuB,CAAC;KAC1C,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,IAAyB,EAAE,EAAE;IAC1D,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEtC,IAAI,MAAmD,CAAC;IACxD,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,MAAM,OAAO,CAAC,cAAc,MAAM,qBAAqB,EAAE;YACjE,MAAM;SACP,CAAC,CAAkB,CAAC;IACvB,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAC;QAC5E,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,MAAO,CAAC,aAAa,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,gCAAgC,MAAM,aAAa,MAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1F,CAAC;SAAM,CAAC;QACN,WAAW,CAAC,MAAO,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,41 @@
1
+ import { Command } from 'commander';
2
+ import { apiGet } from '../../lib/api.js';
3
+ import { isHumanMode, printResult, printError } from '../../lib/output.js';
4
+ export const submissionsCmd = new Command('submissions')
5
+ .description('List submissions for a task')
6
+ .argument('<taskId>', 'Task ID (0x-prefixed hex)')
7
+ .option('--human', 'Human-readable output')
8
+ .action(async (taskId, opts) => {
9
+ const human = isHumanMode(opts.human);
10
+ let subs;
11
+ try {
12
+ subs = (await apiGet(`/api/tasks/${taskId}/submissions`));
13
+ }
14
+ catch (err) {
15
+ const msg = err instanceof Error ? err.message : 'Failed to fetch submissions.';
16
+ printError(msg, human);
17
+ }
18
+ if (!human) {
19
+ printResult(subs, human);
20
+ return;
21
+ }
22
+ if (subs.length === 0) {
23
+ console.log('No submissions yet.');
24
+ return;
25
+ }
26
+ console.log(`Found ${subs.length} submission(s):\n`);
27
+ for (const s of subs) {
28
+ console.log(` ID: ${s.id}`);
29
+ const agentSuffix = s.workerAgentId ? ` (agent ${s.workerAgentId})` : '';
30
+ console.log(` Worker: ${s.workerAddress}${agentSuffix}`);
31
+ console.log(` File: ${s.fileUrl}`);
32
+ console.log(` At: ${s.submittedAt}`);
33
+ if (s.workerStats.ratedTasks > 0) {
34
+ const avg = s.workerStats.averageRating.toFixed(1);
35
+ console.log(` Rating: ${avg} (${s.workerStats.ratedTasks} rated tasks)`);
36
+ }
37
+ console.log('');
38
+ }
39
+ console.log(`To accept: taskmarket task accept ${taskId} --worker <address>`);
40
+ });
41
+ //# sourceMappingURL=submissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submissions.js","sourceRoot":"","sources":["../../../src/commands/task/submissions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAiB3E,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,aAAa,CAAC;KACrD,WAAW,CAAC,6BAA6B,CAAC;KAC1C,QAAQ,CAAC,UAAU,EAAE,2BAA2B,CAAC;KACjD,MAAM,CAAC,SAAS,EAAE,uBAAuB,CAAC;KAC1C,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,IAAyB,EAAE,EAAE;IAC1D,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEtC,IAAI,IAAkB,CAAC;IACvB,IAAI,CAAC;QACH,IAAI,GAAG,CAAC,MAAM,MAAM,CAAC,cAAc,MAAM,cAAc,CAAC,CAAiB,CAAC;IAC5E,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,8BAA8B,CAAC;QAChF,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,WAAW,CAAC,IAAK,EAAE,KAAK,CAAC,CAAC;QAC1B,OAAO;IACT,CAAC;IAED,IAAI,IAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACnC,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,SAAS,IAAK,CAAC,MAAM,mBAAmB,CAAC,CAAC;IACtD,KAAK,MAAM,CAAC,IAAI,IAAK,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAClC,MAAM,WAAW,GAAG,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,aAAa,GAAG,WAAW,EAAE,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QAC3C,IAAI,CAAC,CAAC,WAAW,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;YACjC,MAAM,GAAG,GAAG,CAAC,CAAC,WAAW,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,cAAc,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC,UAAU,eAAe,CAAC,CAAC;QAC7E,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,qCAAqC,MAAM,qBAAqB,CAAC,CAAC;AAChF,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lucid-agents/taskmarket",
3
- "version": "0.5.1",
3
+ "version": "0.5.2",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "taskmarket": "./dist/index.js"
@@ -15,8 +15,8 @@
15
15
  "tsx": "^4.7.0",
16
16
  "typescript": "^5.3.3",
17
17
  "vitest": "^2.0.0",
18
- "@taskmarket/eslint-config": "0.0.0",
19
- "@taskmarket/prettier-config": "0.0.0"
18
+ "@taskmarket/prettier-config": "0.0.0",
19
+ "@taskmarket/eslint-config": "0.0.0"
20
20
  },
21
21
  "files": [
22
22
  "dist"